如何在另一台计算机上远程安装软件

Remotely installing software on another computer

要在另一台计算机上远程安装软件,可以通过 远程桌面 连接并像在键盘前一样运行安装程序,或者使用 PowerShell Invoke-Command 或 PsExec 配合 msiexec /qn 从命令行推送静默安装。命令行是大多数人即使使用正确的管理员密码也会遇到 Access is denied 的地方,因为 Windows 在网络登录时会向普通本地管理员账户提供一个被过滤的令牌。远程桌面可以避免该筛选,因为它属于交互式登录,而来自目标所在域的域账户无论采用哪种方式都会获得完整令牌。

对于普通本地管理员账户,最快的修复是在目标上设置一个注册表值:在 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 下将 LocalAccountTokenFilterPolicy 设为 1,然后以静默方式运行安装程序并捕获其退出代码。本指南涵盖了每种方法的已验证命令、适用于多台计算机的脚本,以及针对每个常见错误的修复,从 PSEXESVC 故障到 winget 0x8a15000f。

如果你宁愿完全跳过令牌难题,HelpWire 是一款远程支持软件,可连接到远端的机器,你可以在会话期间请求管理员权限。你在真实的交互式桌面中运行安装程序,因此权限提升提示会像在键盘前操作时一样。

为什么即使使用管理员账户,远程软件安装仍然会失败

原因是 UAC 的远程限制,也称为令牌筛选。当属于 管理员 组的本地帐户通过网络登录时,本地安全机构 会向其发放一个具有中等完整性级别的已筛选令牌,因此 管理员 组处于仅拒绝状态,特权操作被阻止。网络登录,即 WinRM、PsExec、WMI 或通过 C$ 复制,会为本地管理员生成已筛选令牌。

是否受影响取决于两个细节。来自目标自身域的域帐户,且属于本地 管理员 组,属于豁免情形,并会获得完整令牌,这也是域环境很少出现这种情况的原因。内置的 RID 500 Administrator 也是特例,除非启用了 FilterAdministratorToken,否则不会被筛选。其他所有人,即普通本地管理员帐户和来自不同域的帐户,无论目标在工作组中还是已加入域,都会获得已筛选令牌。正是这一点解释了来自 PsExec、net use、通过 C$ 复制时出现 Access is denied,以及通过 Invoke-Command 登录后你得到的是已筛选的非管理员令牌。

第二个根本原因是非交互式会话。远程命令运行在无人可以点击的环境中,因此期望有窗口的安装程序要么卡在等待按钮,要么直接失败。

如何远程安装软件: 您的可选方法对比

远程安装软件的最快方式是选择与您的环境相匹配的方法,因为在管理员令牌、工作组和 Windows 家庭版上,每种方法的行为都不同。此表可在您运行任何命令之前就确定该选择。组策略之所以被纳入其中,是因为它仅适用于域环境,值得尽早决定是否采用。

方法 管理员令牌行为 适用于工作组 Windows 家庭版主机 会打断用户 通过互联网
RDP 完整令牌,交互式 是 No host 是,会使其断开连接 通过 VPN
PowerShell 远程 对本地管理员进行筛选 配合 TrustedHosts 是 否 很少
cmd + PsExec 已筛选。使用 -h。 通过注册表修复 是 否 否
winget 在 WinRM 下会失效 仅限本地运行 是 否 否
组策略 SYSTEM,按计算机分配 No,仅限域 仅限域 否 否
HelpWire 完整、交互式提权 是 是 否 是

下面每种命令行方法是否可行都取决于一件事:你用于连接的帐户。来自目标自身域并属于其 Administrators 组的域帐户会获得完整令牌,可直接使用。普通的本地管理员帐户会获得被筛选的令牌,因此其 C$ 复制和 PsExec 调用会返回 Access is denied,且 PowerShell 远程要么拒绝该会话,要么在没有管理员权限的情况下运行,直到你在目标上将 LocalAccountTokenFilterPolicy 设置为 1(见修复部分)RDP 是个例外,因为它是交互式登录而非网络登录。

如何使用远程桌面在另一台计算机上安装软件

远程桌面是在另一台计算机上远程安装软件的最直接方式,因为一旦通过 UAC 提示,它就是使用完整的管理员令牌运行的交互式会话。连接后,就像坐在那台计算机前一样进行安装。

  1. 在目标设备上,按下 Win + R,输入 SystemPropertiesRemote,并启用 允许远程连接到此计算机。

  2. 在您的计算机上,打开 远程桌面连接 (mstsc.exe),输入目标名称或 IP,并使用在目标计算机上具有本地管理员权限的帐户登录。

  3. 通过会话将安装程序复制过去,或者在本地资源中映射本地驱动器,以便可以访问它。

  4. 运行安装程序。当 UAC 提示出现时,请在 RDP 窗口内确认,然后完成向导。

在依赖它之前,了解其限制很有必要。Windows 家庭版完全无法托管 RDP 会话。它们只能运行客户端。在客户端 Windows 上,只能有一个控制台会话,因此连接后会使在该计算机上登录的用户断开。而且,在远程主机上没有管理员凭据的标准用户仍然无法批准该提示,这会让你转而使用下面的命令行方法。

如何使用 PowerShell 远程安装软件

使用PowerShell进行远程安装软件时,你通常依赖Invoke-Command,但有两个陷阱几乎会困住所有人。远程会话是非交互式的,因此安装程序必须以完全静默方式运行;而且在很快返回的安装程序完成之前,会话可能就已关闭,从而取消安装。Kevin Marquette 的关于远程安装的知名文章记录了这两点,而第二个问题的修复方法是Start-Process -Wait。

使用 Invoke-Command 在单台计算机上安装

  1. 在目标上,启用一次远程功能。从以管理员身份运行的PowerShell窗口中,运行 Enable-PSRemoting -Force。

  2. 将安装程序复制到目标,以便会话无需访问网络路径:
    Copy-Item -Path "C:\Installers\app.msi" -Destination "\\PC01\c$\Windows\Temp\app.msi"

  3. 以静默方式运行并等待其完成:
    Invoke-Command -ComputerName PC01 -ScriptBlock {

      Start-Process msiexec.exe -ArgumentList "/i
    C:\Windows\Temp\app.msi /qn /norestart" -Wait

    }

    如果跳过 -Wait,脚本块可能会在安装程序仍在复制文件时退出,而关闭会话会在写入过程中中断安装。如果安装程序显示任何窗口,它会挂起,因为在非交互式会话中没有任何东西可以点击它。

用于在多台计算机上远程安装软件的 PowerShell 脚本

一个 PowerShell 脚本循环遍历计算机列表,通过各自的会话将安装程序复制到每台机器上,运行它,并记录退出代码,这样你就知道每台机器上的安装结果。这样通过预先复制,而不是在会话内部访问共享,来解决双跳问题。

$computers = Get-Content "C:\Installers\computers.txt"
$source = "C:\Installers\app.msi"
$results = @()

foreach ($pc in $computers) {
try {
$s = New-PSSession -ComputerName $pc -ErrorAction Stop
Copy-Item -Path $source -ToSession $s -Destination
"C:\Windows\Temp\app.msi"
$code = Invoke-Command -Session $s -ScriptBlock {
$p = Start-Process msiexec.exe -ArgumentList "/i
C:\Windows\Temp\app.msi /qn /norestart" -Wait -PassThru
$p.ExitCode
}
$ok = @(0, 3010, 1641) -contains $code
$results += [pscustomobject]@{ Computer = $pc; ExitCode = $code; Success = $ok }
Remove-PSSession $s
}
catch {
$results += [pscustomobject]@{ Computer = $pc; ExitCode = "N/A"; Success = $false }
}
}
$results | Export-Csv "C:\Installers\install-report.csv"
-NoTypeInformation

将 3010 和 1641 视为成功而非失败。两者都表示安装已成功:3010 表示需要重启才能完成,1641 表示安装程序已发起重启。许多原始脚本错误地将它们标记为失败。请注意,Copy-Item -ToSession 一次只运行一个会话,因此尽管 Invoke-Command 可以扇出,复制步骤仍然是按机器逐台进行。

避免使用针对“双跳”问题常被建议的 CredSSP 捷径。社区已不再使用它,因为它会在远程主机上缓存你的管理员凭据,攻击者可以将其窃取。像上面那样预先复制可绕开整个问题。

常见的 msiexec 退出代码以供检查:

退出代码 含义
0 成功
1603 安装期间发生致命错误
1618 已有其他安装正在进行
1619 无法打开安装程序包
1638 已安装此产品的其他版本
1641 成功,已启动重启
3010 成功,需要重启

如何使用 cmd 远程安装软件

要使用 cmd 远程安装软件,有三种途径:PsExec、winget,以及较早的 WMIC 命令,不过在当前的 Windows 上,前两者才可靠。它们与管理员令牌的交互方式各不相同,因此参数比工具本身更重要。

PsExec 与 msiexec

  1. 下载 来自 Microsoft Sysinternals 的 PsExec 并将其解压。打开 cmd 以管理员身份,因为 PsExec 每次运行时都会安装一个服务(PSEXESVC)而这需要提升权限。

  2. 将 MSI 复制到目标的管理员共享:
    copy "C:\Installers\app.msi" \\PC01\C$\Windows\Temp\

  3. 以提升的令牌运行静默安装。其中 -h 标志最为重要。它使用该帐户的提升令牌运行该进程:
    psexec \\PC01 -h -accepteula msiexec.exe /i "C:\Windows\Temp\app.msi" /qn /norestart

跳过旧指南中到处复制的 -i 开关。它会强制桌面交互,这与静默安装相冲突,并可能导致你正试图避免的挂起。-h 的行为和完整的开关列表直接来自 PsExec 参考。如果你看到 Couldn't install PSEXESVC service: Access Denied,常见原因是本地命令提示符未以提升权限运行,不过被阻止的 ADMIN$ 共享或目标上的筛选令牌也会造成同样的问题。如果你在工作组计算机上看到 Couldn't access <PC>: Access is denied,那就是修复部分所涵盖的令牌筛选问题。

在命令行中使用 winget

winget 可在 cmd 中用一行命令在本地安装应用,它是传统工具的现代替代:

winget install --id Google.Chrome --silent --accept-package-agreements --accept-source-agreements

远程运行它时问题就来了。在 WinRM 会话中,winget 经常抛出 A specified logon session does not exist,或报告 winget 未被识别,因为它作为打包应用运行并期望交互式登录。一个 由来已久的 winget-cli 问题 跟踪了这一点,且一份 相关报告 显示,第一次远程调用会以 0x8a15000f 失败,直到管理员在那台机器上本地运行过任意一次 winget 命令。在一台全新机器上,除非传入 --accept-source-agreements,你还会遇到 0x8a150042 的输入提示错误。winget 也未正式支持 SYSTEM 帐户;在 Windows Server 上,仅在 2025 及更高版本受支持(不包括 Server Core)2019 和 2022 不受支持且为实验性。

为什么 WMIC 方法不再有效

旧的 wmic product call install 技巧在 Windows 11 24H2 及更高版本上已不再有效。根据 Microsoft 的 WMIC 移除公告,该工具在 Windows 11 的 23H2 和 24H2 中默认被禁用,升级到 25H2 时被移除,并在 2026 年 8 月的预览更新中从 24H2 和 25H2 中删除;26H1 发布时不包含它,且没有按需功能可将其恢复。在这些版本中,调用 wmic.exe 的脚本会返回 'wmic' is not recognized。Microsoft 将移除范围限定在 Windows 11,因此 WMIC 目前仍随 Windows 10 和 Windows Server 提供,但普遍建议改用 PowerShell 的 Get-CimInstance 和 Invoke-Command。HelpWire 的 cmd 安装指南更深入地介绍了命令行选项。

按 Windows 版本划分的命令行工具支持情况:

功能 状态 备注
WMIC 移除于 24H2, 25H2, 26H1 自 2026 年 8 月起不再提供按需功能
winget Win 10 1809+, Win 11, Server 2025 (非 Core) 不支持 SYSTEM; Server 2019/2022 为实验性
RDP 主机 专业版, 企业版, 教育版 家庭版仅运行客户端
 

大多数人首先尝试的做法,以及它为何失败

这些表面性的修复会浪费数小时,因为它们治标不治本,问题在远程端被过滤的令牌上。在本机运行 cmd 以管理员身份 并不会改变什么,因为过滤发生在目标端,而不是你的机器上。使用普通管理员帐户配合 runas 只会给你一个具有管理员组成员资格但未提升的窗口,所以安装仍然会失败。

通过将 EnableLUA 设为 0 完全禁用 UAC 确实能让安装通过,但这会让管理员权限不受控,并且会破坏商店应用,这也是微软和社区警告不要这样做的原因。这些方法都没有触及真正的原因,而下一节会做到。

针对“Access is denied”和权限提升错误的行之有效修复方法

先从错误消息开始,然后跳转到其修复方法。以下每一项均已在 Microsoft 文档、供应商知识库和社区讨论帖中得到证实。

错误字符串 抛出方 根本原因
Access is denied PsExec, net use, C$ 受限管理员令牌
Couldn't install PSEXESVC service PsExec 本地命令提示符未提权,或目标 ADMIN$/令牌被阻止
0x80090322 WinRM 工作组或 SPN 问题
Access denied Invoke-Command 到共享 双跳
0x8a15000f winget 通过 WinRM 源数据缺失
1603 msiexec 致命的安装错误

使用 LocalAccountTokenFilterPolicy 修复“拒绝访问”

在目标上设置一个注册表值,以便通过网络为本地管理员账户授予完整令牌。这是由 PDQ、Broadcom 以及无数 PsExec 帖子证实的修复方法。

  1. 在目标上,打开 注册表编辑器 (regedit) 并转到:
    HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

  2. 创建一个名为 LocalAccountTokenFilterPolicy 的 DWORD,并将其设置为 1。或者在提升权限的命令提示符中运行:
    reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

  3. 重试安装。若要随后还原,请将该值设置回0,这将重新启用远程 UAC 过滤。

当你使用目标所在域的域管理员账户进行连接时,没有这个必要,因为该账户已经会获得完整令牌。微软设计该过滤功能用于阻止回环攻击,因此将其关闭会扩大攻击面。请谨慎设置,并在工作完成后恢复原状。

修复“无法安装 PSEXESVC 服务”

此问题几乎总是本地权限提升问题,已在Microsoft Q&A上得到确认。

  1. 关闭当前命令行窗口,并重新打开 cmd 或 PowerShell 以管理员身份。PsExec 在每次运行时都会安装其服务,无法从标准提示符执行此操作。

  2. 如果仍然失败,陈旧的 psexecsvc.exe 可能会卡在目标上。检查远程计算机上的 %windir% 并删除任何残留的副本,然后重试。

  3. 确认目标的 ADMIN$ 共享可访问,并且其防火墙已允许 文件和打印机共享(通过 TCP 445 的 SMB)因为 PsExec 会将 PSEXESVC 服务复制到那里以便运行。

在工作组计算机上修复 WinRM 0x80090322

工作组环境的 PowerShell 远程处理失败,因为 Kerberos 无法验证本地帐户,因此你将目标添加到 TrustedHosts 并强制使用 NTLM。WinRM 的错误文本本身会指出 TrustedHosts 的路径。

  1. 在你的计算机上,在以管理员身份运行的 PowerShell 中,添加目标:
    Set-Item WSMan:\localhost\Client\TrustedHosts -Value "PC01" -Concatenate

  2. 使用显式的本地凭据进行连接,使 Negotiate 回退到 NTLM:
    $cred = Get-Credential

    Invoke-Command -ComputerName PC01 -Credential $cred -ScriptBlock { hostname }

  3. 如果错误持续出现在域的 FQDN 上而不是工作组上,则是 SPN 问题。 Microsoft KB 4549715 涵盖了 -IncludePortInSPN 和 spn_prefix 的变通方法。

修复双跳“拒绝访问”

当远程会话到达 UNC 路径时,它无法进行身份验证、预先复制该文件,或在脚本块内重新进行身份验证。

  1. 首选:先将安装程序复制到目标端,如同在多计算机脚本中一样,这样会话只会访问本地路径。

  2. 或者在会话中使用新的凭据映射一个驱动器。对 New-PSDrive 的调用会对文件服务器的连接进行身份验证,下面直接通过 UNC 路径的启动会复用该连接,因此即使命令从未引用已映射的驱动器,凭据也会被沿用:
    $cred = Get-Credential

    Invoke-Command -ComputerName PC01 -ScriptBlock {

      New-PSDrive -Name X -PSProvider FileSystem -Root "\\fileserver\share" -Credential $using:cred | Out-Null

      Start-Process "\\fileserver\share\app.exe" -ArgumentList "/silent" -Wait

    }

修复 winget 0x8a15000f 和 0x8a150042

这两个错误是由于 winget 期望一个它并不具备的交互式登录而产生的。该变通方法已在 winget-cli 跟踪器中记录。

  1. 以管理员身份在目标计算机上登录一次,并运行任意 winget 命令,例如,winget list。这会初始化源,并在后续的远程调用中清除 0x8a15000f。

  2. 始终传递协议标志,以避免首次运行时出现 0x8a150042 输入提示:
    winget install --id Google.Chrome --silent --accept-package-agreements --accept-source-agreements

  3. 不要在 SYSTEM 上下文中依赖 winget。提供 winget 的 App Installer 程序包是按用户注册的,而该注册通常不会出现在 SYSTEM 账户下,因此即使调用位于 C:\Program Files\WindowsApps 的完整路径,安装仍常常会失败。对于 SYSTEM 上下文的部署,请改用通过 PsExec 运行的 msiexec,或使用软件包工具。

修复 msiexec 错误 1603

退出代码 1603 是一个通用的致命错误,因此修复方法始终是阅读详细日志而不是猜测。微软关于 1603 的故障排除也指出了相同的方法。

  1. 在目标上重新运行,并将详细日志写入可写路径:
    msiexec /i "C:\Windows\Temp\app.msi" /qn /l*v "C:\Windows\Temp\install.log"

  2. 打开日志并搜索 return value 3,它紧跟在失败的操作之后。常见原因包括磁盘空间不足、每用户与每台计算机的属性不匹配,或文件被锁定。

  3. 如果日志无法给出结论,请通过 RDP 在目标主机上以交互方式复现安装,这样 GUI 安装程序就能显示其真实错误,因为以 SYSTEM 上下文启动时没有桌面可用于显示错误。

如何使用 HelpWire 以管理员权限远程安装软件

HelpWire 是一款远程访问软件,可让你通过你设备上的应用 (Operator) 在实时交互会话中,于远端的机器上运行安装。你通过链接进行连接,并请求远端的管理员权限。一旦权限被授予,远程用户的 (Client) 应用会重启,这样你就可以直接运行安装程序。

在会话期间请求管理员访问权限

  1. 启动会话并连接到远程工作站。有关完整流程,请参阅HelpWire 管理员权限指南。

  2. 在 Operator 应用的工具栏上点击 请求管理员访问权限。

    单击 Helpwire Operator 应用程序工具栏上的“请求管理员访问权限”按钮
  3. 客户端点击 授予访问权限,然后在设备更改提示中点击 是。客户端应用将以管理员权限重新启动,连接将恢复。

  4. 当工具栏上显示已授予管理员权限时,请通过远程桌面以完全管理员身份运行你的安装程序。

    HelpWire 工具栏上的通知“已授予管理员访问权限”

如果您自己掌握凭据,请使用请求管理员访问旁边的下拉菜单并选择使用凭据的管理员,然后输入管理员账户的用户名和密码。远程用户也可以在其端通过客户端应用中的以管理员身份重启来提升权限。

将安装程序传过去,然后稍后再重新连接

您可以在不出现RDP 复制粘贴问题的情况下将安装程序直接传入会话,或者将其拖到 Operator 窗口。当修复需要后续处理时,无人值守访问可让您在远程用户不在场的情况下,稍后重新连接到同一台已开机的计算机。

管理员权限提升发生在真实的交互式桌面内,因此安装程序及其 UAC 提示会正常运行,无需在目标上修改注册表。

远程用户始终保持控制权。每个管理员请求都需要他们的批准,并且他们可以随时撤销访问。

常见问题

这取决于缺少的是谁的权限。向 Program Files 或 HKLM 写入的按计算机安装在目标设备上需要管理员权限,因此如果由你发起安装,你需要提供管理员凭据,或通过会提示用户的工具提升权限。管理员预先配置了部署机制时,目标上的最终用户不需要管理员权限:通过组策略按计算机分配的软件会在启动时以 SYSTEM 上下文安装按计算机的应用,无需用户提升权限。像 Google Chrome 这样的按用户应用也可以在无需管理员权限的情况下安装到用户配置文件中。

在目标上将LocalAccountTokenFilterPolicy设置为1,然后使用带有-h的PsExec,或在将该计算机添加到TrustedHosts后使用PowerShell。工作组计算机没有域来发放完整令牌,因此既需要该注册表值,也需要使用带有显式本地凭据的 NTLM 身份验证。

这取决于方法。RDP 连接会断开控制台前的用户,锁定其会话,同时他们的程序继续运行;而 PsExec、PowerShell 远程以及静默的 /qn 安装会在后台运行,不打扰他们。共享活动桌面的远程支持工具也会让用户继续留在原位,这在你于工作日中途在某人的机器上进行安装时很重要。

检查安装程序的退出代码,而不仅仅是命令是否返回。0 表示成功,3010 和 1641 表示成功但需要重启,1603 表示致命错误。退出代码才是可靠的信号,因此在 PowerShell 中使用 -PassThru 捕获它。大多数注册了卸载程序的 MSI 和 EXE 应用也会出现在卸载项注册表键下:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,其用于 32 位应用的 WOW6432Node 分支,以及用户范围安装的 HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,不过并非每个应用都会在那里写入条目。MSIX 和其他 AppX 打包的应用则通过 Get-AppxPackage 显示,而不取决于其来源。跳过 Get-CimInstance Win32_Product,因为它只列出 Windows Installer 产品,而且其查询会触发缓慢的 MSI 一致性检查。