我遇到一个小问题。我想发现我公司的每一个“野性”SQL Server安装,但我不知道如何实现这一点。
我搜索网络并找到执行此PowerShell命令以查找本地网络上的所有SQL Server安装:
[System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources()
当我在群集节点上执行此操作时,它会返回此群集上安装的SQL Server实例,但不会返回同一网络中另一个群集上安装的SQL Server实例(两个群集都在10.4.4.0/24中)。此外,结果不会返回SSAS安装。
另一个小问题是“版本”结果不正确。它返回11.0.2100.60值而不是11.0.3393
我的问题是:
感谢您的帮助
答案 0 :(得分:0)
我遇到了同样的问题。我开始使用AD,但那里的信息很容易过时,更糟糕的是,并非所有服务器都能正确注册为拥有SQL Server实例。除了非常慢之外,使用服务器管理对象(SMO)甚至更糟。
我最终使用nmap
脚本扫描内部网络上所有服务器的端口1433,如下所示:
nmap -oX - -T5 -p 1433 -sC [ip range]
这将XML文件(-oX
)输出到标准输出(-
),运行超时为5秒(-T5
)扫描端口1433(-p 1433
)该端口的默认脚本(-sC
),用于打开与服务器的连接并检测所使用的SQL Server版本。 nmap
也有其他输出选项,但XML可以方便地在PowerShell脚本中操作(这使用v3):
$nmap = "nmap"
$range = "192.168.[whatever]"
$servers = [xml] (&$nmap -oX - -T5 -p 1433 -sC $range)
$sqlinstancesraw = $servers.nmaprun.selectnodes("//service[@name='ms-sql-s'][@conf=10]")
$sqlinstances = $sqlinstancesraw |% {
$server = $_.parentnode.parentnode.parentnode
$address = $server.address.addr
$hostname = $server.hostnames.hostname.name
$product = $_.product
$version = $_.version
new-object -type psobject | add-member -passthru -notepropertymembers @{
address = $address
hostname = $hostname
product = $product
version = $version
}
}
$sqlinstances | Export-Csv "servers.csv"
显然,对于内部防火墙或在1433之外的其他端口上运行实例的服务器,这将失败,但这些并不常见。
检测SSAS应该是可能的,但我没有考虑过 - 特别是nmap
没有SSAS的标准脚本,就像它对SQL Server的做法一样。一旦缩小了可能的服务器候选列表,您可能会使用SMO来测试SSAS。
请注意,管理员可能会将nmap
视为可疑,因为它可用于映射您无权访问的网络上的漏洞。当你在自己的网络上使用它时,当然没有问题,但如果你不是网络管理员,你可能想告诉他们你在做什么,无论如何。他们甚至可能会变得热情。 : - )