В Powershell, как пользователь без прав администратора может запустить процесс как другой пользователь, а затем прочитать код завершения процесса? - PullRequest
1 голос
/ 05 марта 2020

Мне нужно запустить исполняемый файл от имени конкретного пользователя во время задачи сборки в Azure Конвейеры. Чтобы определить, потерпеть ли неудачу сборку, мне нужно прочитать код завершения этого процесса.

Я не могу запустить скрипт из явно административного сеанса.

Когда я рассматриваю дескриптор процесса, используя код ниже, код выхода всегда пуст. Я уверен, что исполняемый файл возвращает коды выхода (он был написан собственными силами).

В дополнение к приведенному ниже коду я также попытался использовать $ LASTEXITCODE, но он не будет установлен, пока я не запустлю исполняемый файл напрямую (в отличие от использования Start-Process).

Есть ли способ просмотреть код завершения этого процесса?

$process = Start-Process -FilePath $pathToExe -ArgumentList $argsString -Credential $credential -PassThru 
# I tried waiting like this as well
#while ($process.HasExited -ne $true) {
#    Start-Sleep -Seconds 5        
#}
$process.WaitForExit()
Write-Host "Process exit code: $($process.ExitCode)"

Подход, аналогичный нижеприведенный может использоваться для доступа к коду выхода процесса, запущенного одним пользователем в контексте другого, но для этого требуется сеанс администратора.

$scriptBlock = { 
    param($exePath, $exeArgs)
        $process = Start-Process -FilePath $exePath -ArgumentList $exeArgs -PassThru
        $process.WaitForExit()
        return $process.ExitCode
} 
$runAsUserSession = New-PSSession -Credential $credential
$exitCode = Invoke-Command -ScriptBlock $scriptBlock -ArgumentList @($pathToExe, $argsString) -Session $runAsUserSession
Write-Host "Process exit code: $exitCode"

1 Ответ

0 голосов
/ 05 марта 2020

Попробуйте вызвать метод:

$process = Start-Process -FilePath $pathToExe -ArgumentList $argsString -Credential $credential -PassThru 
$process.WaitForExit()
#while ($process.HasExited -ne $true) {
#    Start-Sleep -Seconds 5        
#}
Write-Host "Process exit code:" $process.ExitCode
...