Crates.io | mssql-browser |
lib.rs | mssql-browser |
version | 0.1.1 |
source | src |
created_at | 2020-04-06 11:33:34.902715 |
updated_at | 2020-09-30 19:05:42.325206 |
description | Rust implementation of the SQL Server Resolution Protocol |
homepage | https://github.com/Wazner/mssql-browser |
repository | https://github.com/Wazner/mssql-browser |
max_upload_size | |
id | 226864 |
size | 99,223 |
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.
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
};
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.
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(())
}
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(())
}
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(())
}
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(())
}