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