繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM