PowerShell是否可靠地检查远程计算机上的服务是否存在?

时间:2019-07-19 07:43:08

标签: powershell service

我目前正在尝试检查一堆远程计算机是否存在某些服务。当前,该过程相当缓慢(对于几百台机器而言,> 1小时即可完成),这不是什么大问题,但也不可靠(这是一个问题)。

其中一些计算机可能正在阻止访问,被关闭,或者可能以其他方式限制了对服务查询的访问。

当前的方法是使用Get-Service进行检查,并且事实证明,同时使用Get-WmiObjectGet-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-WmiObjectGet-CimInstance(相同的方法),但是我找不到关于它的文档。该计算机当前使用PowerShell 5.x,正在或可能正在查询服务存在的服务器上未配置PowerShell远程。

编辑:Get-Service是不可靠的,因为它可能不表示存在问题,仅返回$null而不表明实际上存在问题。同样,当它可能失败时,其他选项之一可能仍然有效。

0 个答案:

没有答案