我有一个脚本,该脚本在没有安装应用程序权限的用户的用户上下文中运行。我需要安装一个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
答案 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()