PowerShell IIS:\ Удаленный вызов WebAdmin вызывает ошибку WSAStartup, WSANOTINITIALISED

Я использую PSRemoting с модулем WebAdministration для получения информации о различных сайтах, и это работает. Я, однако, получаю раздражающее нефатальное COM-исключение во время вызова команды и задаюсь вопросом, разрешил ли это кто-то еще. Вот минимальная реализация:

cls
$command = {
    param($alias)
    Import-Module 'WebAdministration'
    $binding = Get-WebBinding -HostHeader $alias
    $binding
}

$server = 'server'
$args = @('alias')
$session = New-PSSession -ComputerName $server
Write-Host ("Invoking")
try {
    Invoke-Command -Session $session -ScriptBlock $command -ArgumentList $args
    Write-Host ("Invoked")
} catch {
    Write-Host ("Caught $_")
} finally {
    Write-Host ("Removing")
    Remove-PSSession -Session $session
    Write-Host ("Removed")
}

И вот результаты:

Invoking

protocol           : http
bindingInformation : 10.x.x.x:80:alias
...
Schema             : Microsoft.IIs.PowerShell.Framework.ConfigurationElementSchema

An unhandled COM interop exception occurred: Either the application has not called WSAStartup, or WSAStartup failed. (Exception from HRESULT: 0x800
7276D)
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : COMException

Invoked
Removing
Removed

Я наблюдаю, как результат возвращается до появления ошибки.

Забавные детали:
- Get-Website, Get-Item "IIS: \...", Get-WebBinding все приводят к одной и той же ошибке
- Выполнение команды $ непосредственно на целевой машине, поскольку записанное не приводит к ошибке
- Get-Item "d:\..." не приводит к ошибке
- Ошибка COM не

2 ответа

Решение

Это скрыто где-то глубоко в недрах реализации PowerNET для.NET и winsock. Это ниже всего, что я могу откалибровать, поэтому я добавил " -ErrorAction SilentlyContinue" в мой удаленный вызов. Это ничего не исправляет, но все работает правильно. Думаю, этого пока достаточно.

Я смог обойти эту проблему, используя следующие:

    $iisIpAddresses = Invoke-Command -Session $session -scriptblock {
    if (!(Get-Module WebAdministration)) 
    {
        Import-Module WebAdministration
    }
    $iisBindings = Get-WebBinding
    [String[]]$iisBindings = $iisBindings | Select bindingInformation
    $iisBindings
}

Remove-PSSession $session
Другие вопросы по тегам