我想获取 Windows 服务器上所有处于停止状态的自动服务的显示名称、名称、启动模式、启动名称和状态。通常,我会做
get-wmiobject -class win32_service | ? {$_.StartMode -eq "Auto" -and $_.State -eq "Stopped"} | select DisplayName, Name, StartMode, StartName, State
但是,上面的 cmdlet 不区分“自动”和“自动延迟启动”状态。我在下面的 cmdlet 不会报告任何具有自动延迟启动状态的服务,但我不知道如何让它也显示我需要的其他属性。
(Get-WmiObject -Class Win32_Service -Filter "state = 'stopped' and startmode = 'auto'" | Select-Object -ExpandProperty name) | Where-Object {(Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Services | Where-Object {$_.property -contains "DelayedAutoStart"} | Select-Object -ExpandProperty PSChildName) -notcontains $_} | Select-Object @{l='Service Name';e={$_}}
如何修改上述 cmdlet 以便它还显示我想要的其他属性?
编辑: 我知道下面的方法会起作用,但它效率低下且不像 powershell。
$auto_services = @((get-wmiobject -class win32_service -filter "state='stopped' and startmode='auto'" | select-object -expandproperty name) | ? {(get-childitem HKLM:\SYSTEM\CurrentControlSet\Services | ? {$_.property -contains "DelayedAutoStart"} | Select-Object -ExpandProperty PSChildName) -notcontains $_})
foreach ($service in $auto_services) { Get-WMIobject -class win32_service | ? {$_.Name -eq $service} | Select DisplayName, name, startmode, startname, state}
编辑2: 更好的是,如果您可以列出所有服务和所需的属性并以某种方式使其成为“自动延迟启动”服务实际上将“自动延迟启动”显示为“启动模式”而不是仅显示“自动”。