无法在PowerShell中获取服务StartType

时间:2018-03-06 19:43:43

标签: powershell powershell-v4.0

我有一个脚本,用于扫描服务的服务器/计算机列表并显示状态。

我在两台计算机上运行PS版本5 Build 10586修订版117.

在运行PSv5的Windows 7计算机上,StartType输出到.txt

MachineName  ServiceName                 Status StartType
-----------  -----------                 ------ ---------
srvcomp0201 My.ServiceName.Here          Stopped Stopped         
srvcomp0202 My.OtherServiceName          Running Running  

当我在使用PSv4或v5的Windows 2012计算机上运行相同的脚本时,StartType不会输出到.txt或.csv

MachineName  ServiceName                 Status StartType
-----------  -----------                 ------ ---------
srvcomp0201 My.ServiceName.Here          Stopped          
srvcomp0202 My.OtherServiceName          Running          

我可以更改应该显示的顺序,如:

$s | select MachineName, StartType, ServiceName, Status

在Win2012计算机上运行时,它仍然没有显示任何内容。

为什么要这样做?

$serviceList = Get-Content C:\services.txt

$results = Get-Content C:\servers.txt | ForEach-Object {

    foreach ($service in $serviceList) {
        if ($s=get-service -computer $_ -name $service -ErrorAction SilentlyContinue)
        {
            $s | select MachineName, StartType, ServiceName, Status | Out-File C:\test.txt -Append
        } else {
            "$_ - Service '$service' does not exist."
        }
    }
}

更新

这不会将StartType写入文件:

$serviceList = Get-Content C:\services.txt

$results = Get-Content C:\servers.txt | ForEach-Object {

    foreach ($service in $serviceList) {
        if ($s=get-service -computer $_ -name $service -ErrorAction SilentlyContinue)
        {
            $s | select MachineName, StartType | Out-File C:\test.txt -Append
        } else {
            "$_ - Service '$service' does not exist."
        }
    }
}

这不会在我的2012计算机上显示StartType:

get-content c:\servicelist\computers.txt | % {
    if ($s=get-service -computer $_ -name W3SVC* -ErrorAction SilentlyContinue)  # change -name * to name of service
    {
        $s | select MachineName, ServiceName, StartType, Status
    }
    else {"Service is not available on $_"}
    }

这是Windows 2012的事吗?

2 个答案:

答案 0 :(得分:1)

随操作系统提供的默认PowerShell版本会有所不同。 [见https://4sysops.com/wiki/differences-between-powershell-versions/#powershell-and-windows-versions] Windows 2012附带v3,但Windows 10附带v5,其中添加了StartType属性。

答案 1 :(得分:0)

Windows PowerShell有一系列cmdlet,使用 PowerShell 远程处理(基于[MS-PRSP], the PowerShell Remoting Protocol specification),通常可以通过拥有自己的-ComputerName参数来识别(而不是通过“meta”-invocation cmdlet调用它们,例如Invoke-Command -ComputerName)。

应该放弃使用这个过时的,基于DCOM的 per-cmdlet 远程处理,以支持部分管道 PowerShell远程处理< / strong>即可。
事实上,PowerShell Core 中不再提供per-cmdlet远程处理形式。

因此,而不是:

Get-Service -ComputerName $_ -name $service

使用:

Invoke-Command -ComputerName $_ { Get-Service $service }

后者使用PowerShell远程处理,其要求与基于DCOM的表单远程处理不同,因此可能需要额外的设置;见Get-Help about_Remoting_FAQ

我无法亲自验证这一点,但根据Olaf's对该问题的评论,这可能会隐式解决您的问题(我没有解释)