5

由于某种原因,在远程机器上通过调用命令运行时,Start-Process msiexec 将无法工作。我查了一下,虽然有些人建议使用 psiexec,但我看到很多人使用普通的旧调用命令在远程机器上启动 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 远程安装服务并且它有效。在目标机器上启用脚本以及远程处理,因此所有帐户都应该工作。两台计算机都有相同的凭据,但我仍然尝试将凭据添加到调用命令和 pssession。我在本地测试了代码并且安装工作正常。远程它没有,也没有任何错误。我可以在 taskmanager 中的目标机器上看到 msiexec 已启动,但没有任何反应。我什至尝试禁用防火墙,但仍然没有。我尝试了 & 运算符来启动 msiexec,但仍然没有。

不知道我还能尝试什么。

4

5 回答 5

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 文件的语法,您可以查看帮助。

于 2013-09-11T19:34:45.987 回答
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
于 2013-09-10T13:06:41.943 回答
1

问题似乎是 msi 安装程序的构建方式和 windows 服务器对交互式进程的限制的结合。我最终使用 psexec 绕过了这个问题。

于 2013-11-11T09:14:59.933 回答
0

对我有用的唯一解决方案是轮询进程状态。这可以在远程 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
于 2015-05-30T07:33:13.890 回答
0

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

$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`""

写入主机只是在那里验证增强是否正确转义,但在调试中证明是无价的。

于 2017-10-31T11:58:41.780 回答