Powershell Start-Process msiexec在远程计算机上无法运行

时间:2013-09-10 12:55:23

标签: powershell msiexec invoke-command start-process

由于某些原因,在远程计算机上运行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但仍然没有。

不确定我还能尝试什么。

5 个答案:

答案 0 :(得分:1)

您可以尝试使用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

答案 1 :(得分:1)

如果你不挺身而出,也许你会尝试另一种方式? 使用任务计划程序,例如通过在远程计算机上创建和执行任务来启动命令行:

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文件的参数和语法的详细信息,您可以查看帮助。

答案 2 :(得分:1)

似乎问题在于如何构建msi安装程序以及Windows服务器对交互式进程的限制。我最终使用psexec来绕过这个问题。

答案 3 :(得分:0)

对我有用的唯一解决方案是轮询流程状态。这可以在远程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

答案 4 :(得分:0)

使用上面的答案,我最终得到了

libssp

写主机就是为了验证扩充是否被正确转义,但在调试中被证明是无价的。