Как получить .NET StandardOutput и StandardError из функции PowerShell - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь создать функцию-оболочку для командлетов PowerShell, которые не принимают параметр -credential, используя https://www.itdroplets.com/run-a-command-as-a-different-user-in-powershell/ в качестве руководства. Проблема в том, что я не могу получить значимый вывод об успехе или неудаче этих командлетов.

Редактировать: Чтобы уточнить, я запускаю powershell.exe в качестве пользователя, чьи учетные данные хранятся в $ PSCreds, и я передаю новый процесс powershell для запуска командлета в контексте этого пользователя. и ожидая получить результаты этого командлета в родительском скрипте. Итак, Script1 выполняется в соответствии с разрешениями / контекстом UserA, но должен работать как UserB; однако, не принимает флаг -Credential, поэтому мне нужно вызвать эту функцию. Мне нужно выводить как UserB из этой функции в Script1, чтобы принять решение о том, что будет дальше в Script1.

Я много чего прочитал о перенаправлении вывода, но не понимаю. Я пытался переместить .waitforexit () в после .readtoend (). Я пытался сделать return $getprocessresult. Я попытался сделать другую переменную для присвоения стандартного ошибки и if ($errortext) {return $errortext} и тому подобного, но безуспешно.

Это урезанная версия моей функции, не показывает все, но показывает (как мне кажется,) соответствующие разделы.

Function start-PSCMDAsUser {
Param (
        [String[]]$PSCMDArgs,
        [System.Management.Automation.CredentialAttribute()]$PSCreds
        ) #Close Param declaration
    $ProcessInfo = New-Object System.Diagnostics.ProcessStartInfo
    $ProcessInfo.RedirectStandardError = $true 
    $ProcessInfo.RedirectStandardOutput = $true 
    $ProcessInfo.UseShellExecute = $false
    $ProcessInfo.Arguments = $PSCMDArgs
    $ProcessInfo.Username = $PSCreds.GetNetworkCredential().username
    $ProcessInfo.FileName = "powershell.exe"
    $Process = New-Object System.Diagnostics.Process 
    $Process.StartInfo = $ProcessInfo 
    $Process.Start() | Out-Null 
    $Process.WaitForExit() 
    $GetProcessResult = $Process.StandardOutput.ReadToEnd()
    $GetProcessResult
    } #close function start-pscmdasuser

Я использую $PSCMDArgs = 'New-Item -Path ' + $testfile + ' -ItemType "file" -Value ' + "Tested_Share_$datetime" в качестве ввода для start-PSCMDAsUser -PSCreds $pscreds -PSCMDArgs $PSCMDArgs

У меня есть другая функция (test-myshares), которая вызывает эту функцию в цикле foreach ($share in $shares). Я ожидал бы увидеть выходные данные этой функции перемежающимися с родительской функцией, и на самом деле я бы хотел, чтобы функция test-myshares могла использовать выходные данные этой функции для интеллектуального генерирования выходных данных. Но я не могу заставить функцию start-pscmdasuser выводить так, как вы ожидаете. Фактически, я получаю все подробные выходные данные test-myshares , а затем последний бит последней переменной в функции start-pscmdasuser

В конечном счете, я бы хотел иметь возможность try {start-PSCMDAsUser -PSCreds $pscreds -PSCMDArgs $PSCMDArgs } catch {do-something}, но я не уверен, как заставить работать выход .NET. Я ценю любую помощь!

Редактировать: Допустим, я использую скрипт для настройки экранов файлов FSRM (это всего лишь пример, а не то, что я делаю; это просто для иллюстрации намерения). Я буду запускать командлеты FSRM в сценарии, чтобы настроить их все, а затем я хочу, чтобы сценарий протестировал экраны файлов, используя учетные данные целевого пользователя, для записи нового файла экранированного типа с помощью new-item. Итак, командлет new-item не принимает -Credential при использовании «-itemtype file», поэтому мне нужно запустить New-Item в контексте целевого пользователя, чтобы избежать передачи -credential. Я хотел бы использовать эту функцию. И родительский сценарий должен знать, успешно ли или не удалось New-Item (и ПОЧЕМУ) проверить новые экраны файлов. Но как мне передать этот вывод обратно в сценарий? Это моя проблема, и я надеюсь, что вы можете помочь! Еще раз спасибо !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...