我目前正在尝试检查一堆远程计算机是否存在某些服务。当前,该过程相当缓慢(对于几百台机器而言,> 1小时即可完成),这不是什么大问题,但也不可靠(这是一个问题)。
其中一些计算机可能正在阻止访问,被关闭,或者可能以其他方式限制了对服务查询的访问。
当前的方法是使用Get-Service
进行检查,并且事实证明,同时使用Get-WmiObject
和Get-CimInstance
进行检查也不可靠。
问题在于它们不支持超时,因此,如果服务器只是无响应,则将花费大量时间来获得响应,并且由于这三个选项都可能起作用或不起作用,这取决于计算机,实际上并没有仅运行一个的选项。由于其中一个可能成功而其他失败了,因此我需要检查所有三个调用的结果。
有人会对如何进行预检检查以弄清楚哪个命令可能起作用,或者是否有其他方法来检查服务的存在是否更可靠有想法吗?
当前的方法类似于此方法(简化):
$error.Clear()
$serviceExists = $false
$server = "localhost"
$serviceQuery = Get-Service -ErrorAction SilentlyContinue -Name WinRM -ComputerName $server
$wmiQuery = Get-WmiObject -ErrorAction SilentlyContinue -Class Win32_Service -Filter "Name = 'WinRM'" -ComputerName $server
$cimQuery = Get-CimInstance -ErrorAction SilentlyContinue -ClassName Win32_Service -Filter "Name = 'WinRM'" -ComputerName $server
if ($error.Count -ge 1) {
Write-Output "An error occurred while check for the service existence on $server"
}
if (
($serviceQuery | Where Name -eq 'WinRM') -ne $null -or
($wmiQuery | Where Name -eq 'WinRM') -ne $null -or
($cimQuery | Where Name -eq 'WinRM') -ne $null
) {
$serviceExists = $true
}
据我所知,可能是Get-Service
在内部使用了Get-WmiObject
和Get-CimInstance
(相同的方法),但是我找不到关于它的文档。该计算机当前使用PowerShell 5.x,正在或可能正在查询服务存在的服务器上未配置PowerShell远程。
编辑:Get-Service
是不可靠的,因为它可能不表示存在问题,仅返回$null
而不表明实际上存在问题。同样,当它可能失败时,其他选项之一可能仍然有效。