我有powershell进程,我正在调用Start-Process或System.Diagnostic.Process来启动子进程作为不同的用户(以获取其他用户环境变量)
我尝试使用redirectoutput但它不起作用。以下是代码
$process = New-Object System.Diagnostics.Process
$startinfo = New-Object "System.Diagnostics.ProcessStartInfo"
$startinfo.FileName = "powershell"
$startinfo.UserName = $user
$startinfo.Password = $pass
$startinfo.Arguments = $arguments
$startinfo.UseShellExecute = $False
$startinfo.RedirectStandardInput = $True
$process.StartInfo = $startinfo
$process.Start() | Out-Null
$process.WaitForExist()
$output = $process.StandardOutput.ReadToEnd()
此外,我正在尝试以最小化或隐藏方式运行此过程,但它不起作用。
任何帮助都将非常感激 问候 Ajax的
答案 0 :(得分:3)
这是一个能够做你想做的事情的功能:
function Invoke-PSCommandAsUser
{
param(
[System.Management.Automation.PSCredential]$cred,
[System.String]$command
);
$psi = New-Object System.Diagnostics.ProcessStartInfo
$psi.RedirectStandardError = $True
$psi.RedirectStandardOutput = $True
$psi.UseShellExecute = $False
$psi.UserName = $cred.UserName
$psi.Password = $cred.Password
$psi.FileName = (Get-Command Powershell).Definition
$psi.Arguments = "-Command $command"
$p = [Diagnostics.Process]::Start($psi)
$p.WaitForExit()
Write-Output $p.StandardOutput.ReadToEnd()
}
根据MSDN,如果使用Process.Start作为机制,则无法运行此隐藏
如果StartInfo实例的UserName和Password属性是 set,调用非托管的CreateProcessWithLogonW函数 即使CreateNoWindow属性,也在新窗口中启动该过程 value为true或WindowStyle属性值为Hidden。 - source