等待凭据凭据

时间:2018-05-04 08:17:56

标签: powershell process

我有一个脚本,该脚本在没有安装应用程序权限的用户的用户上下文中运行。我需要安装一个exe,所以我需要将其作为域管理员。

安装完成后,我想在脚本中执行其他操作,但必须先完成安装,然后再继续编写脚本。

当我Wait-Process安装结束时,我收到拒绝访问错误。

有没有办法等待进程完成,这是在另一个用户上下文中启动的?

这是我的代码:

$P = Start-Process $Pfad\vcredist_x64.exe -Argumentlist "/install","/passive","/norestart" `
                         -WorkingDirectory $Pfad -Credential $cred -PassThru | Wait-Process

这是错误消息(翻译自德语):

拒绝访问

  

等待过程:此命令终止" vcredist_x64(6284)"由于以下错误导致操作:访问被拒绝。在Zeile:6   贼臣:84   + ... -WorkingDirectory $ Pfad -Credential $ cred -PassThru |等待进程   + ~~~~~~~~~~~~       + CategoryInfo:CloseError:(System.Diagnost ...(vcredist_x64):Process)[Wait-Process],ProcessCommandException       + FullyQualifiedErrorId:ProcessNotTerminated,Microsoft.PowerShell.Commands.WaitProcessCommand

超时问题

  

Wait-Process:此命令终止了该过程,因为" vcredist_x64(6284)"进程未在指定的超时内完成。在Zeile:6 Zeichen:84   + ... -WorkingDirectory $ Pfad -Credential $ cred -PassThru |等待进程   + ~~~~~~~~~~~~       + CategoryInfo:CloseError:(System.Diagnost ...(vcredist_x64):Process)[Wait-Process],TimeoutException       + FullyQualifiedErrorId:ProcessNotTerminated,Microsoft.PowerShell.Commands.WaitProcessCommand

2 个答案:

答案 0 :(得分:0)

前几天我做了类似的事情。我的情况有点不同。我正在踢东西,一旦这个过程结束,我想要发生一些事情,与此同时我正在做另一件事。为此,我使用了一个事件。以下是使用记事本的示例:

$do_other_stuff = { 
    Write-Host 'Do Other Stuff'
    Get-EventSubscriber | Unregister-Event
}

$p = Start-Process notepad.exe -PassThru
...do other stuff...

$job = Register-ObjectEvent -InputObject $p `
    -EventName Exited `
    -SourceIdentifier notepad `
    -Action $do_other_stuff

如果我想等待偶数触发,我会使用Wait-Event。安装程序在$do_other_stuff脚本块中运行后,填写您想要的任何内容。

对于您的问题,以下内容对我有用:

$p = Start-Process notepad.exe -PassThru -Wait
...do stuff...

同样......

$p = Start-Process notepad.exe -PassThru
$p.WaitForExit()
...do stuff...

这些案例在高架和未提升的上下文中运行脚本时起作用。通过Start-Process参数将凭据传递给-Credential时,它可以正常工作。在调用Start-Process的帐户是低权限帐户的情况下,我无法尝试;我和几个人见面,抱歉。

答案 1 :(得分:0)

将我之前的评论作为答案发布

$proc = Start-Process "Notepad.exe" -PassThru
$proc.WaitForExit()
$proc1 = Start-Process "Calc.exe" -PassThru
$proc1.WaitForExit()