Есть ли ошибка в Powershell Remoting при чтении привязок сервера веб-сайта IIS6 через WMI? - PullRequest
0 голосов
/ 27 октября 2011

Я использую Powershell Remoting для получения списка веб-сайтов на IIS6 через WMI (клиентский компьютер - 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, но я несколько часов работал в Google и не нашел ответа на свою проблему.

1 Ответ

0 голосов
/ 27 октября 2011

Командлеты WMI и WMI уже выполняют удаленное взаимодействие, это параметр -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 есть ноль или один объект.

...