我正在使用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新手,但我谷歌几个小时,没有找到我的问题的答案。
答案 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
什么是Port
? IIsWebServerSetting
上没有Port
属性。
此外,您的自定义属性表达式非常复杂:
@{
Name="SecureBindingPorts"; Expression =
{
$ports = @();
foreach ($tmpSecureBinding in $_.SecureBindings)
{
$ports += $tmpSecureBinding.Port
};
return $ports;
}
}
使用PowerShell处理带有管道的列表的能力更好:
@{Name="SecureBindingPorts"; Expression = { @($_.SecureBindings | %{ $_.Port }) }}
我正在使用@(...)
来确保即使SecureBindings
属性中有零个或一个对象,我也总是得到一个集合。