2

我想获取 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: 更好的是,如果您可以列出所有服务和所需的属性并以某种方式使其成为“自动延迟启动”服务实际上将“自动延迟启动”显示为“启动模式”而不是仅显示“自动”。

4

1 回答 1

2

使用 PowerShell 4.0 (with -PipelineVariable) 您可以执行以下操作:

get-wmiobject -class win32_service  -PipelineVariable s | ? {$_.StartMode -eq "Auto" -and $_.State -eq "Stopped"}| where {(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\services\$($_.name)" -Name 'DelayedAutoStart' -ErrorAction  "silentlycontinue").DelayedAutoStart -eq 1} | % {select  -InputObject $s -Property DisplayName, Name, StartMode, StartName, State}

使用以前的版本,您应该在管道期间将服务对象分配给 var。

 get-wmiobject -class win32_service  | % {$s=$_;$s} | ? {$_.StartMode -eq "Auto" -and $_.State -eq "Stopped"}| where {(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\services\$($_.name)" -Name 'DelayedAutoStart' -ErrorAction  "silentlycontinue").DelayedAutoStart -eq 1} | % {select  -InputObject $s -Property DisplayName, Name, StartMode, StartName, State}

已编辑

这是 PowerShell 2.0 的所有已停止服务的版本,这些服务处于“自动”启动模式,而不是“自动延迟启动”:

get-wmiobject -class win32_service  | % {$s=$_;$s} | ? {$_.StartMode -eq "Auto" -and $_.State -eq "Stopped"}| % {$d = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\services\$($_.name)" -Name 'DelayedAutoStart' -ErrorAction  "silentlycontinue").DelayedAutoStart;$_ } | where {$d -ne '1'} |% {select  -InputObject $s -Property @{name="DelayedAutoStart";expression={$d}},DisplayName, Name, StartMode, StartName, State}
于 2014-06-27T05:09:16.327 回答