Ошибка при использовании именованных каналов с PowerShell Remoting - PullRequest
0 голосов
/ 11 марта 2020

Я создал скрипт для асинхронного использования именованных каналов из 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
...