#sql-server #database-server #sql #mssql

mssql-browser

Rust implementation of the SQL Server Resolution Protocol

2 releases

0.1.1 Sep 30, 2020
0.1.0 Apr 6, 2020

#1315 in Database interfaces

MIT/Apache

56KB
989 lines

mssql-browser   Latest Version

Rust implementation of the SQL Server Resolution Protocol.

The SQL Server Resolution Protocol enables finding endpoint information of MSSQL servers running in the current network.

The SQL Server Resolution Protocol (SSRP) [MC-SQLR] is a simple application-level protocol for the transfer of requests and responses between clients and database server discovery services. To determine the communication endpoint information of a particular database instance, the client sends a single request to a specific machine and waits for a single response. To enumerate database instances in the network and obtain the endpoint information of each instance, the client broadcasts or multicasts a request to the network and waits for responses from different discovery services on the network.

The SQL Server Resolution Protocol is appropriate for retrieving database endpoint information or for database instance enumeration in scenarios where network or local connectivity is available.

Usage

To use mssql-browser, first add this to your Cargo.toml:

[dependencies]
mssql-browser = "0.1"

Then you can make the different types and methods available in your module via an use statement:

use mssql_browser::{ 
  browse, browse_host, browse_instance, browse_instance_dac
};

Examples

Below are a few different ways to get endpoint information of MSSQL server instances. Check out the docs for a list of fields returned for each found instance.

Discover endpoint information of instances within network

use std::net::{ IpAddr, Ipv4Addr };
use std::error::Error;
use mssql_browser::{ browse, BrowserError };

async fn run() -> Result<(), Box<dyn Error>> {
  let broadcast_addr = IpAddr::V4(Ipv4Addr::BROADCAST);
  let mut iterator = browse(broadcast_addr).await?;
  
  while let instance = iterator.next().await? {
    println!("Found instance {} on host {}.", instance.instance_name, instance.addr);
  }
  
  Ok(())
}

Discover endpoint information of instances on host

use std::net::{ IpAddr, Ipv4Addr };
use std::error::Error;
use mssql_browser::{ browse_host, BrowserError };

async fn run() -> Result<(), Box<dyn Error>> {
  let host_addr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
  let mut iterator = browse_host(host_addr).await?;
  
  while let Some(instance) = iterator.next()? {
    println!("Found instance {}", instance.instance_name);
  }
  
  Ok(())
}

Discover endpoint information of specific instance

use std::net::{ IpAddr, Ipv4Addr };
use std::error::Error;
use mssql_browser::{ browse_instance, BrowserError };

async fn run() -> Result<(), Box<dyn Error>> {
  let host_addr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
  let instance = browse_instance(host_addr, "MSSQLSERVER").await?;
  
  if let Some(tcp) = instance.tcp_info {
    println!("Instance is available via TCP on port {}", tcp.port);
  }
 
  if let Some(np) = instance.np_info {
    println!("Instance is available via named pipe {}", np.name);
  }
 
  Ok(())
}

Discover DAC endpoint information

use std::net::{ IpAddr, Ipv4Addr };
use std::error::Error;
use mssql_browser::{ browse_instance_dac, BrowserError };

async fn run() -> Result<(), Box<dyn Error>> {
  let host_addr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
  let dac_info = browse_instance_dac(host_addr, "MSSQLSERVER").await?;
  
  println!("DAC is exposed on port {}", dac_info.port);
 
  Ok(())
}

Dependencies

~1–13MB
~139K SLoC