2012-07-04 170 views
1

我有powershell进程,我打开启动进程或System.Diagnostic.Process以不同的用户身份启动子进程(获取其他用户环境变量)将子进程的输出重定向到父进程 - Powershell

我尝试使用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()   

另外我试图运行此过程为最小化或隐藏,但它不起作用。

任何帮助将是非常赞赏 问候 阿贾克斯

回答

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属性 的值为true或WindowStyle属性值为Hidden, 也会在新窗口中启动该过程。 - source

+0

我从来没有见过这么明确的解释。我非常感谢你,我会立即尝试一下。再次非常感谢:-) – ajax

+0

嗨,你知道如何成功传递参数数组我想通过这个“[Microsoft.Win32.Registry] :: SetValue('HKEY_CURRENT_USER \ Environment','$ keyVar',' $ valueVar','$ regType')“3次在参数数组中。但我得到一个异常 – ajax

+0

雅得到它解决。谢谢 – ajax

相关问题