[英]Powershell Start-Process msiexec on a remote machine not working
出于某种原因,在远程计算机上通过invoke命令运行时,Start-Process msiexec将无法工作。 我查了一下,虽然有些人建议使用psiexec我看到很多人使用普通的旧invoke-command在远程机器上启动msi安装程序。
这是我目前使用的代码:
$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-command和pssession添加凭据。 我在本地测试了代码,安装工作正常。 远程它没有,也没有错误。 我可以在taskmanager的目标机器上看到msiexec已启动但没有任何反应。 我甚至试过禁用防火墙,但仍然没有。 我试过&运算符启动msiexec但仍然没有。
不确定我还能尝试什么。
您可以尝试使用Passthru执行Start-Process以查看是否返回了错误:
(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服务器对交互式进程的限制的组合。 我最终使用psexec来绕过这个问题。
对我有用的唯一解决方案是轮询流程状态。 这可以在远程PowerShell会话中的scriptblock内运行。
$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`""
写主机只是用于验证扩充是否被正确转义,但在调试中被证明是无价的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.