远程计算机上的Powershell启动进程msiexec不工作
由于某些原因,在远程计算机上运行invoke命令时,启动进程msiexec将无法工作。我查了一下,虽然有人建议使用psiexec,但我看到很多人使用普通的invoke命令在远程机器上启动msi安装程序 这是我当前使用的代码:远程计算机上的Powershell启动进程msiexec不工作,powershell,windows-installer,invoke-command,start-process,Powershell,Windows Installer,Invoke Command,Start Process,由于某些原因,在远程计算机上运行invoke命令时,启动进程msiexec将无法工作。我查了一下,虽然有人建议使用psiexec,但我看到很多人使用普通的invoke命令在远程机器上启动msi安装程序 这是我当前使用的代码: $session = New-PSSession -computername $computerName -ea stop $command = { Param( [Parameter()] [string]$computerName,
$session = New-PSSession -computername $computerName -ea stop
$command = {
Param(
[Parameter()]
[string]$computerName,
[Parameter()]
[string]$domain,
[Parameter()]
[string]$user,
[Parameter()]
[string]$password,
[Parameter()]
[string]$installDir
)
$msiArgumentList = "/i C:\Installer.msi /l c:\log.txt /quiet /qr /norestart IAGREE=Yes DOMAIN=$domain ACCOUNT=$user PASSWORD=$password PASSWORDCONFIRM=$password INSTALLDIR=$installDir"
Start-Process msiexec -ArgumentList $msiArgumentList -Wait
}
Invoke-Command -session $session -ScriptBlock $command -ArgumentList $computerName, $domain, $user, $password, $installDir
Remove-PSsession -session $session
我使用相同的方法使用intallutil远程安装服务,而且效果很好。脚本在目标计算机上以及远程处理上都是启用的,因此所有帐户都应该可以使用它。这两台计算机具有相同的凭据,但我仍然尝试向invoke命令和pssession添加凭据。我在本地测试了代码,安装成功了。从远处看,它不会发生任何错误。我可以在taskmanager中的目标计算机上看到msiexec已启动,但什么也没有发生。我甚至试过禁用防火墙,但仍然一无所获。我尝试了&operator来启动msiexec,但仍然没有任何结果
不确定我还可以尝试什么。您可以尝试使用Passthru执行启动进程,以查看是否返回错误:
(Start-Process -FilePath msiexec.exe -ArgumentList $msiArgumentList -Wait -Passthru).ExitCode
另一个可能有用的方法是将日志记录增加到/l*v
更新1 你能试试下面的方法吗,只是为了检查msi的远程命令是否正常工作,结果应该是1619
(Start-Process -FilePath msiexec.exe -ArgumentList "/i no.msi /quiet /qb!" -Wait -Passthru).ExitCode
如果你不站出来,也许你可以尝试另一种方式? 使用任务调度器启动命令行,例如在远程计算机上创建和执行任务:
SchTasks /CREATE /XML mycommand.xml /TN "thiscommand"
SchTasks /RUN /TN "thiscommand"
这用于在本地计算机上启动任务(如)。
使用参数/S,您可以在远程计算机上创建任务,如下所示:
SchTasks /S thatPC /CREATE /XML mycommand.xml /TN "thiscommand"
SchTasks /S thatPC /RUN /TN "thiscommand"
有关参数的详细信息和定义任务的.xml文件的语法,您可以查看帮助。问题似乎是msi安装程序的构建方式和windows server对交互进程的限制的组合。我最终使用psexec绕过了这个问题 对我有效的唯一解决方案是轮询流程状态。这可以在远程powershell会话的脚本块内运行
$res = Start-Process -FilePath $process -ArgumentList $arguments -Wait -PassThru
while ($res.HasExited -eq $false) {
Write-Host "Waiting for $process..."
Start-Sleep -s 1
}
$exitCode = $res.ExitCode
根据上面的答案,我最终得到了
$session = New-PSSession -ComputerName $serverName -Credential $mycred
invoke-command -Session $session -ScriptBlock { param ($argxs) write-host $argxs; start-process msiexec.exe -ArgumentList $argxs } -ArgumentList "/i `"$pathToMsi`" /qn /L*V `"E:\package.log`""
写主机只是为了验证扩充是否正确转义,但在调试中被证明是非常宝贵的。passthru没有帮助。一无所获。尝试-ea在尝试/捕获中停止,以捕获任何非终端错误,但仍然没有任何结果。而且日志从来没有写过,所以增加日志记录并没有帮助。这很奇怪,我使用一种非常类似的机制远程安装。我至少希望ExitCode的值为0或通常的1619。我猜参数不正确,正在显示一个对话框,如果你杀死了msiexec,你会得到一个exitcode吗?我检查了几个小时是否存在任何可能的问题,并尝试了我找到的所有解决方法,但都没有效果。启动进程是否立即返回?如果它使用-RedirectStandardError myError.txt为启动进程生成错误,你能尝试记录错误吗?文件是空的,很遗憾:|你能看到吗参数是否正确传入?可能会尝试将它们记录到txt文件。是的。我检查过了。如果我在本地运行启动过程,安装就正确完成了。我有一个非常类似的问题,如果不是完全相同的问题。你的引导问题第1段中的“psiexec”是什么?或者这是psexec的打字错误?我不是有意要评论的。请看我的回答。