функция powershell возвращает неверный результат - PullRequest
0 голосов
/ 16 октября 2018

У меня есть эта функция, которая запускает команду от имени другого пользователя и возвращает результат.

$OutputEncoding = [ System.Text.Encoding]::UTF8   
write-host (get-date -format s) " Beginning script..."
function getCreds()
{
    $Username = 'domain\user'
    $Password = 'test'
    $pass = ConvertTo-SecureString -AsPlainText $Password -Force
    $Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $UserName, $pass
    return $Credential;
}
function executeAsCryptUser($cmd){

write-host "cmd:"$cmd
$creds=getCreds
#Use System.Diagnostics to start the process as UserB
$ProcessInfo = New-Object System.Diagnostics.ProcessStartInfo
#With FileName we're basically telling powershell to run another powershell process
$ProcessInfo.FileName = "powershell.exe"
#CreateNoWindow helps avoiding a second window to appear whilst the process runs
$ProcessInfo.CreateNoWindow = $true
#Note the line below contains the Working Directory where the script will start from
$ProcessInfo.WorkingDirectory = $env:windir
$ProcessInfo.RedirectStandardError = $true 
$ProcessInfo.RedirectStandardOutput = $true 
$ProcessInfo.UseShellExecute = $false
#The line below is basically the command you want to run and it's passed as text, as an argument
$ProcessInfo.Arguments = $cmd
#The next 3 lines are the credential for UserB, as you can see, we can't just pass $Credential
$ProcessInfo.Username = $creds.GetNetworkCredential().username
$ProcessInfo.Domain = $creds.GetNetworkCredential().Domain
$ProcessInfo.Password = $creds.Password
#Finally start the process and wait for it to finish
$Process = New-Object System.Diagnostics.Process 
$Process.StartInfo = $ProcessInfo 
$Process.Start() 
$Process.WaitForExit() 
#Grab the output
$GetProcessResult = $Process.StandardOutput.ReadToEnd().ToString()
Write-host "Potential Error:"+ $Process.StandardError.ReadToEnd().ToString()
$result=$GetProcessResult.Trim()
write-Host "Debug output:"$result

return $result
}

$pop=executeAsCryptUser "whoami"
write-host "out:" $pop

Когда я ее запускаю, она работает, но в возвращаемую переменную мне ввели «True».Я получил следующий вывод:

out: True domain \ test

Если я отлаживаю скрипт и смотрю на $result и не вижу следа "True" впеременная.

В чем проблема?Спасибо

1 Ответ

0 голосов
/ 16 октября 2018

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

Откуда берутся значения:

  # Below return "True" to the output-stream
  $Process.Start()
  ...
  # Below appends the content of "result" and return from the function
  return $result

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

Я думаю, вам нужно изменить

$Process.Start()

до

$Process.Start() | Out-Null

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

$rv = $Process.Start()

Также следует учитывать, что оператор PowerShells return имеет другое поведение по сравнению с, например,C # один.

Ваша линия:

return $result

эквивалентна:

# Append content to output stream
$result
# return from the function
return

Прочитайте эту ссылку для получения дополнительной информации овернуться.

Надеюсь, это поможет.

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