如果您想要对将来有用的东西,我可能会避免尝试搜索注册表。多年来,SQL Server的配置单元已经发生了一些变化,要跟上进度可能会很麻烦。
使用的方法SqlDataSourceEnumerator
有时会很不稳定,尽管我会使用它,但没有具体证据表明实例在网络上。我相信这也取决于SQL Browser服务,在大多数情况下,我发现它已禁用。
我将利用WMI类win32_Service
。我之所以使用它,是因为它比Get-Service
cmdlet 提供了更多有关服务的信息。
我通常将所有内容都写为函数,因为您可以使用它实际上只是每天检查或验证服务以进行故障排除。
function Get-ServiceStatus ([string[]]$server)
{
foreach ($s in $server)
{
if(Test-Connection $s -Count 2 -Quiet)
{
Get-WmiObject win32_Service -Computer $s |
where {$_.DisplayName -match "SQL Server"} |
select SystemName, DisplayName, Name, State, Status, StartMode, StartName
}
}
}
这比我通常使用的要多,但是如果有人遇到想要使用它的话。在Test-Connection
以相当于ping myserver
在DOS提示符和-Quiet
标志只是简单地拥有它返回true
或false
。这将默认为4 ping,因此设置-Count 2
只会使其执行两次。
该变量[string[]]$server
是一种用于声明$server
将接受服务器名称数组的方法。因此,此函数的示例调用可能类似于:
Get-ServiceStatus -server (Get-Content C:\temp\MyServerList.txt)
要么
$servers = 'MyServer1','MyServer2','MyServer3'
Get-ServiceStatus -server $servers
编辑
上面提到的注释确实取决于提供的服务器列表。如果没有提供该列表,则您还有其他选择。
如果我处于Active Directory环境中,则可以使用PowerShell中的ActiveDirectory模块通过cmdlet提取域中所有服务器的列表Get-ADComputer
。请注意,不过请确保-Filter
在大型域上使用良好。
我还简单地对网络进行了IP扫描(获得批准),该扫描为我提供了发现端口1433打开的IP地址。我将获取该IP列表并利用它Get-ADComputer
来查找域计算机名称,然后将其传递给上面的函数
例:
Import-Module ActiveDirectory
$sList = $ipList | Select -ExpandProperty IP
$results = foreach ($i in $sList) {
Get-ADComputer -Filter 'IPv4Address -eq $i' -Properties * | Select Name}
Get-ServiceStatus -server $results
编辑
建议使用Write-Verbose
并添加try / catch块的编辑方法,尽管这可能是有用的,但在大多数情况下,这是一种代码实践,我将留给希望使用此功能来添加该额外代码或功能的人员。只是尝试提供一个基本的例子。我确实SystemName
在输出中添加了该属性,以包括返回实际服务器名称的信息,但在其他功能上执行此操作通常只是一次不要将其用于一个以上的服务器,所以我不介意。