Я создал скрипт для асинхронного использования именованных каналов из PowerShell, и он отлично работает из PowerShell ISE. Вы можете увидеть код клиента и сервера в моем ответе здесь .
Моя конечная цель - использовать его из удаленного взаимодействия PowerShell, но когда я его запускаю таким образом, я получаю исключение "Доступ к путь запрещен ", когда клиент пытается подключиться (NamedPipeClientStream.Connect).
Некоторая информация:
- Приведенный ниже клиентский сценарий должен работать без запуска кода сервера. Клиент должен ждать три секунды, пока не будет создан указанный именованный канал, и потерпеть неудачу, если канал не создан. Это ожидаемое поведение: «Не удалось подключить клиента к трубе testPipe в течение 3 секунд»
- Код работает должным образом, когда выполняется на той же машине локально из PowerShell ISE с той же учетной записью, которую я использую для удаленного подключения. при вызове Invoke-Command, но при удаленном выполнении я получаю ошибку «Доступ к пути запрещен», как если бы у клиента не было разрешений даже пытаться использовать именованные каналы.
- Учетная запись часть группы администраторов
Код:
Function Send-PipeMessage($serverIP, $pipeName, $message, $timeoutSeconds=300)
{
$PipeDir = [System.IO.Pipes.PipeDirection]::Out
$PipeOpt = [System.IO.Pipes.PipeOptions]::Asynchronous
$success = $false
try
{
$pipeClient = new-object System.IO.Pipes.NamedPipeClientStream($serverIP, $pipeName, $PipeDir, $PipeOpt)
$sw = new-object System.IO.StreamWriter($pipeClient)
$endDate = (Get-Date).AddSeconds($timeoutSeconds)
Write-Host "Trying to connect to a pipe named $pipeName for $timeoutSeconds seconds"
while(! $pipeClient.IsConnected -and ($endDate -gt (Get-Date)))
{
try
{
$pipeClient.Connect(1000)
}
catch [TimeoutException]
{}
}
if (! $pipeClient.IsConnected)
{
throw "Failed to connect client to pipe $pipeName within $timeoutSeconds seconds"
}
else
{
$sw.AutoFlush = $true
$sw.WriteLine($message)
$success = $true
}
}
catch
{
Write-Host $_ -ForegroundColor Red
}
finally
{
try
{
if ($sw)
{
$sw.Dispose()
$sw = $null
}
if ($pipeClient)
{
$pipeClient.Dispose()
$pipeClient = $null
}
}
catch {}
}
return $success
}
Send-PipeMessage '.' 'testPipe' 'test message' 3