在通过WMI阅读IIS6网站ServerBindings时,Powershell Remoting中是否存在错误?

时间:2011-10-27 10:23:22

标签: powershell iis-6 wmi remoting

我正在使用Powershell Remoting通过WMI获取IIS6上的网站列表(客户端计算机是Windows 7 64位,服务器是Windows 2003)

问题是以下不起作用:

$websites = Invoke-Command -ComputerName SEVER_NAME -UseSSL { Get-WmiObject -ComputerName SEVER_NAME -Namespace 'root\MicrosoftIISv2' -Class IISWebServerSetting }

$websites[0].ServerBindings[0].Port

端口为$null,但

$websites[0].ServerBindings.Count 

返回1

我可以使用这种解决方法,但它并不方便:

$websites = Invoke-Command -ComputerName SEVER_NAME -UseSSL {
    Get-WmiObject -ComputerName SEVER_NAME -Namespace 'root\MicrosoftIISv2' -Class IISWebServerSetting |
    Select-Object ServerComment, @{
        Name="ServerBindingPorts"; Expression = 
        {
            $ports = @(); 
            foreach ($tmpServerBinding in $_.ServerBindings) 
            {
                $ports += $tmpServerBinding.Port 
            }; 
            return $ports; 
        }
    },@{
        Name="SecureBindingPorts"; Expression = 
        {
            $ports = @(); 
            foreach ($tmpSecureBinding in $_.SecureBindings) 
            {
                $ports += $tmpSecureBinding.Port 
            }; 
            return $ports; 
        }
    }
}

然后我可以通过这种方式获得端口:

$websites[0].ServerBindingPorts

我对SecureBindings属性有同样的问题。

这是一个错误还是我错过了什么? 我是powershell新手,但我谷歌几个小时,没有找到我的问题的答案。

1 个答案:

答案 0 :(得分:0)

WMI和WMI cmdlet已经进行了远程处理,这是-server上的Get-WMIObject参数,因此您的:

$websites = Invoke-Command -ComputerName SEVER_NAME -UseSSL { Get-WmiObject -ComputerName SEVER_NAME -Namespace 'root\MicrosoftIISv2' -Class IISWebServerSetting }

可以与:

同等地完成
$websites = Get-WmiObject -ComputerName SEVER_NAME -Namespace 'root\MicrosoftIISv2' -Class IISWebServerSetting

这将避免需要通过WS-MAN远程处理序列化器,这可能会有所帮助。

此外:

  

端口为$ null

什么是PortIIsWebServerSetting上没有Port属性。

此外,您的自定义属性表达式非常复杂:

@{
    Name="SecureBindingPorts"; Expression = 
    {
        $ports = @(); 
        foreach ($tmpSecureBinding in $_.SecureBindings) 
        {
            $ports += $tmpSecureBinding.Port 
        }; 
        return $ports; 
    }
}

使用PowerShell处理带有管道的列表的能力更好:

@{Name="SecureBindingPorts"; Expression = { @($_.SecureBindings | %{ $_.Port }) }}

我正在使用@(...)来确保即使SecureBindings属性中有零个或一个对象,我也总是得到一个集合。