发现网络上的SQL Server安装 - 如何检测所有这些?

时间:2014-10-14 08:44:39

标签: sql-server powershell

我遇到一个小问题。我想发现我公司的每一个“野性”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

我的问题是:

  1. 是否有其他方法可以检测网络上的每个SQL Server安装? AD查询?
  2. 如何确定返回的信息是否正确?
  3. 感谢您的帮助

1 个答案:

答案 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视为可疑,因为它可用于映射您无权访问的网络上的漏洞。当你在自己的网络上使用它时,当然没有问题,但如果你不是网络管理员,你可能想告诉他们你在做什么,无论如何。他们甚至可能会变得热情。 : - )