远程计算机上的Powershell启动进程msiexec不工作

远程计算机上的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,

由于某些原因,在远程计算机上运行invoke命令时,启动进程msiexec将无法工作。我查了一下,虽然有人建议使用psiexec,但我看到很多人使用普通的invoke命令在远程机器上启动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命令和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的打字错误?我不是有意要评论的。请看我的回答。