【问题标题】:Installing an MSP using Powershell works on the local machine, fails remotely. Why?使用 Powershell 安装 MSP 可在本地计算机上运行,​​但远程失败。为什么?
【发布时间】:2013-05-15 00:33:53
【问题描述】:

我需要一些 Powershell 建议。

我需要在多个 Win08r2 服务器上安装应用程序的 MSP 更新文件。如果我在本地运行这些命令,在目标机器的 PS 窗口中,它会完全按照我的意愿运行:

$command = 'msiexec.exe /p "c:\test\My Application Update 01.msp" REBOOTPROMPT=S /qb!'
invoke-wmimethod -path win32_process -name create -argumentlist $command

正在执行的文件位于目标机器上

如果我远程连接到机器,并执行这两个命令,它会打开两个 x64 msiexec.exe 进程和一个 msiexec.exe *32 进程,然后就坐在那里。

如果我重新启动服务器,它不会显示更新已安装,所以我认为这不是时间问题。

我尝试使用这两行创建和远程执行 PS1 文件,但这似乎做同样的事情。

如果有人对远程安装我的 MSP 更新有任何建议,我会全力以赴。

我想我已经包含了我所拥有的所有信息,但是如果缺少某些内容,请提出问题,我会填写任何空白。

++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

我的过程是:

  • 读取 CSV 以获取服务器名称和管理员密码
  • 使用密码创建凭据
  • 使用机器名称和凭据创建新会话
  • 创建一个临时文件夹来保存我的更新 MSP 文件
  • 调用PS1文件将更新文件下载到目标服务器
  • >>> 创建一个新的 System.Net.WebClient 对象
  • >>> 使用该 Web 客户端对象从源下载到目标服务器上的位置
  • 调用另一个应用刚刚下载的补丁的 PS1 文件 –>> 这就是我遇到问题的地方。
  • >>>设置如上所示的变量
  • >>>执行变量中指定的文件
  • 关闭与目标服务器的会话
  • 移动到 CSV 中的下一个服务器...

如果我打开一个 PS 窗口并手动设置变量,然后执行它(如上面两行代码所示),它可以正常工作。如果我在目标服务器上创建一个 PS1 文件,包含相同的两行代码,然后右键单击 >“使用 PowerShell 运行”,它会按预期/期望工作。如果我在 PowerGUI 中远程执行我的代码,它会返回一个看起来像这样的文本块,然后就坐在那里。 RDP'd 进入服务器,安装程序永远不会启动。我对“返回值”值的理解是,“0”表示命令成功。

PSComputerName : xx.xx.xx.xx
RunspaceId : bf6f4a39-2338-4996-b75b-bjf5ef01ecaa
PSShowComputerName : 真
__GENUS : 2
__CLASS : __参数
__超类:
__DYNASTY : __参数
__RELPATH :
__PROPERTY_COUNT : 2
__派生:{}
__服务器:
__命名空间:
__PATH :
ProcessId : 4808
返回值:0

我什至在变量和在桌面上创建文本文件的执行之间添加了一行代码,只是为了验证我正在进入我的“executeFile”文件,并且确实创建了该文本文件。看来它只是没有远程执行我的 MSP。

提前感谢您的帮助!

Catt11.

【问题讨论】:

    标签: patch updates powershell-remoting msp


    【解决方案1】:

    这是我用来将 msp 嵌入到 powershell 脚本中的策略。它非常适合我。

    $file = "z:\software\AcrobatUpdate.msp"
    $silentArgs = "/passive"
    $additionalInstallArgs = ""
    Write-Debug "Running msiexec.exe /update $file $silentArgs"
    $msiArgs = "/update `"$file`""
    $msiArgs = "$msiArgs $silentArgs $additionalInstallArgs"
    Start-Process -FilePath msiexec -ArgumentList $msiArgs -Wait
    

    如果您不想,您可能不需要使用变量,您可以硬编码这些值。我将此设置为传递这些参数的函数,但如果这更像是一次性交易,则对值进行硬编码可能更容易。

    希望有帮助!

    【讨论】:

      【解决方案2】:

      对 MSP 包使用 Start-Process 不是一个好习惯,因为某些更新包锁定 powershell 库,因此您必须使用 WMI 调用

      【讨论】:

        猜你喜欢
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多