Я пытаюсь создать функцию-оболочку для командлетов 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 (и ПОЧЕМУ) проверить новые экраны файлов. Но как мне передать этот вывод обратно в сценарий? Это моя проблема, и я надеюсь, что вы можете помочь! Еще раз спасибо !!