about_Remote_Troubleshooting

简短说明

介绍如何对 PowerShell 中的远程操作进行故障排除。

长说明

在使用 PowerShell 进行远程处理之前,请参阅 about_Remoteabout_Remote_Requirements,获取有关配置和基本用法的指导。

必须具有管理权限才能查看或更改 WSMan: 驱动器中本地计算机的设置。 这包括对会话配置、受信任的主机、端口或侦听器的更改。

必须使用“以管理员身份运行”选项运行 PowerShell。

如何以管理员身份运行

对于错误:

错误:访问被拒绝。 需要从提升的进程运行此 cmdlet。

要使用“以管理员身份运行”选项启动 Windows PowerShell,请右键单击“开始”菜单中的 PowerShell 图标,然后选择“以管理员身份运行”。

如何启用远程处理

对于错误:

  • 错误:访问被拒绝
  • 错误:与远程主机的连接被拒绝。 验证 WS-Management 服务是否正在远程主机上运行,并配置为侦听正确端口和 HTTP URL 上的请求。

若要接收远程命令,必须在计算机上启用 PowerShell 远程处理。 Windows PowerShell 远程处理在 Windows Server 2012 和更高版本的 Windows Server 上默认启用。 可以运行 Enable-PSRemoting 以重新启用远程处理(如果已禁用)。 有关详细信息,请参阅 Enable-PSRemoting

如何在企业中启用远程处理

对于错误:

  • 错误:访问被拒绝
  • 错误:与远程主机的连接被拒绝。 验证 WS-Management 服务是否正在远程主机上运行,并配置为侦听正确端口和 HTTP URL 上的请求。

若要使单个计算机能够接收远程 PowerShell 命令并接受连接,请使用 Enable-PSRemoting cmdlet。

若要为企业中的多台计算机启用远程处理,可以使用以下缩放选项。

  • 启用允许自动配置侦听器组策略以配置侦听器进行远程处理。
  • 配置并启用 Windows 防火墙: 允许本地端口例外组策略。
  • 将 WinRM 服务的启动类型设置为 Automatic 并启动该服务。

如何使用组策略启用侦听器

对于错误:

  • 错误:访问被拒绝
  • 错误:与远程主机的连接被拒绝。 验证 WS-Management 服务是否正在远程主机上运行,并配置为侦听正确端口和 HTTP URL 上的请求。

启用允许自动配置侦听器策略来为域中的所有计算机配置侦听器。

该策略可在以下组策略路径中找到:

Computer Configuration\Administrative Templates\Windows Components
    \Windows Remote Management (WinRM)\WinRM service

启用策略并指定 IPv4 和 IPv6 筛选器。 允许使用通配符 (*)。

如何在公共网络上启用远程处理

当本地网络是公共网络并且命令中未使用 SkipNetworkProfileCheck 参数时,Enable-PSRemoting 将返回此错误。

错误:无法检查防火墙的状态

在 Windows 服务器版本上,Enable-PSRemoting 可以在所有网络配置文件上成功执行。 它创建允许远程访问私人和域(“家庭”和“工作”)网络的防火墙规则。 对于公共网络,它创建允许从同一本地子网进行远程访问的防火墙规则。

在 Windows 客户端版本上,Enable-PSRemoting 可以在专用网络和域网络上成功执行。 默认情况下,它在公共网络上失败,但如果使用 SkipNetworkProfileCheck 参数,Enable-PSRemoting 可以成功执行并创建一条允许来自同一本地子网的流量的防火墙规则。

注意

在 Windows PowerShell 2.0 中,在运行 Windows 服务器版本的计算机上,Enable-PSRemoting 创建允许在专用网络、域网络和公共网络上进行远程访问的防火墙规则。 在运行 Windows 客户端版本的计算机上,Enable-PSRemoting 创建仅允许在专用网络和域网络上进行远程访问的防火墙规则。

若要取消公共网络上的本地子网限制并允许从任何位置进行远程访问,请运行以下命令:

Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-PUBLIC" -RemoteAddress Any

Set-NetFirewallRule cmdlet 由 NetSecurity 模块导出。

注意

不同版本 Windows 上的防火墙规则名称可能有所不同。 使用 Get-NetFirewallRule 查看规则列表。 在启用防火墙规则之前,请查看规则中的安全设置,以验证配置是否适合你的环境。

如何使用组策略启用防火墙例外

对于错误:

  • 错误:访问被拒绝
  • 错误:与远程主机的连接被拒绝。 验证 WS-Management 服务是否正在远程主机上运行,并配置为侦听正确端口和 HTTP URL 上的请求。

使用 Windows 防火墙: 允许本地端口例外策略为域中的所有计算机启用防火墙例外。

该策略位于以下组策略路径:

Computer Configuration\Administrative Templates\Network
    \Network Connections\Windows Firewall\Domain Profile

此策略允许管理员组的成员为 Windows 远程管理 (WinRM) 服务创建防火墙例外。

如果策略配置不正确,则可能会收到以下错误:

客户端无法连接到请求中指定的目标。 验证目标上的服务正在运行并且正在接受请求。

策略中的配置错误会导致 ListeningOn 属性为空值。 使用以下命令检查该值。

Get-WSManInstance winrm/config/listener -Enumerate
cfg                   : http://schemas.microsoft.com/wbem/wsman/1/config/listener
xsi                   : http://www.w3.org/2001/XMLSchema-instance
Source                : GPO
lang                  : en-US
Address               : *
Transport             : HTTP
Port                  : 5985
Hostname              :
Enabled               : true
URLPrefix             : wsman
CertificateThumbprint :
ListeningOn           : {}

如何设置 WinRM 服务的启动类型

对于错误:

错误:访问被拒绝

PowerShell 远程处理依赖于 Windows 远程管理 (WinRM) 服务。 该服务必须正在运行才能支持远程命令。

在 Windows 的服务器版本上,WinRM 服务启动类型为 Automatic。 但是,在 Windows 客户端版本上,WinRM 服务默认处于禁用状态。

使用以下示例将 WinRM 服务的启动类型设置为 Automatic 并启动该服务。 ComputerName 参数接受多个值。

$invokeCimMethodSplat = @{
    ComputerName = 'Server01', 'Server02'
    Query = 'Select * From Win32_Service Where Name = "WinRM"'
    MethodName = 'ChangeStartMode'
    Arguments = @{StartMode  = 'Automatic'}
}
Invoke-CimMethod @invokeCimMethodSplat

如何重新创建默认会话配置

对于错误:

错误:访问被拒绝

使用 Enable-PSRemoting 时,它会在本地计算机上创建默认会话配置。 只要远程命令不包含 ConfigurationName 参数,远程用户就会使用这些会话配置。

如果计算机上的默认配置已取消注册或删除,请使用 Enable-PSRemoting cmdlet 重新创建它们。 可以重复使用此 cmdlet。 如果已配置功能,则不会生成错误。

如果更改了默认会话配置,并且想要恢复原始会话配置,可以删除并重新创建配置。

使用 Unregister-PSSessionConfiguration cmdlet 删除更改的会话配置。 使用 Enable-PSRemoting 还原原始会话配置。 Enable-PSRemoting 不会更改现有会话配置。

注意

Enable-PSRemoting 还原默认会话配置时,不会为配置创建显式安全描述符。 相反,这些配置会继承默认情况下安全的 RootSDDL 的安全描述符。

若要查看 RootSDDL 安全描述符,请键入:

Get-Item wsman:\localhost\Service\RootSDDL

若要更改 RootSDDL,请在 WSMan: 驱动器中使用 Set-Item cmdlet。 若要更改会话配置的安全描述符,请将 Set-PSSessionConfiguration cmdlet 与 SecurityDescriptorSDDLShowSecurityDescriptorUI 参数一起使用。

有关 WSMan: 驱动器的详细信息,请参阅 about_WSMan_Provider

如何提供管理员凭据

对于错误:

错误:访问被拒绝

你必须是管理员组的成员才能连接到默认远程会话终结点。 可以使用 New-PSSessionEnter-PSSessionInvoke-Command cmdlet 的 Credential 参数,通过备用凭据连接到远程终结点。

以下示例演示如何为管理员用户提供凭据。

Invoke-Command -ComputerName Server01 -Credential Domain01\Admin01

有关 Credential 参数的详细信息,请参阅有关 New-PSSessionEnter-PSSessionInvoke-Command 的帮助。

如何为非管理用户启用远程处理

对于错误:

错误:访问被拒绝

默认情况下,只有计算机上管理员组的成员才有权使用默认会话配置。 因此,只有管理员组的成员才能远程连接到计算机。

要允许其他用户连接到本地计算机,请授予用户对本地计算机上的默认会话配置的执行权限。

以下示例打开一个属性表,可用于更改本地计算机上默认 Microsoft.PowerShell 会话配置的安全描述符。

Set-PSSessionConfiguration Microsoft.PowerShell -ShowSecurityDescriptorUI

有关详细信息,请参阅 about_Session_Configurations

如何为其他域中的管理员启用远程处理

对于错误:

错误:访问被拒绝

当另一个域中的用户是本地计算机上管理员组的成员时,该用户无法使用管理员权限远程连接到本地计算机。 默认情况下,来自其他域的远程连接仅使用标准用户权限令牌运行。

可以使用 LocalAccountTokenFilterPolicy 注册表项更改默认行为并允许属于管理员组成员的远程用户以管理员权限运行。

注意

LocalAccountTokenFilterPolicy 条目对所有受影响计算机的所有用户禁用用户帐户控制 (UAC) 远程限制。 在更改策略之前,请仔细考虑此设置的含义。

使用以下命令将 LocalAccountTokenFilterPolicy 注册表值设置为 1。

$newItemPropertySplat = @{
  Name = 'LocalAccountTokenFilterPolicy'
  Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System'
  PropertyType = 'DWord'
  Value = 1
}
New-ItemProperty @newItemPropertySplat

如何在远程命令中使用 IP 地址

对于错误:

错误:WinRM 客户端无法处理该请求。 如果身份验证方案不同于 Kerberos,或者客户端计算机未加入域,则必须使用 HTTPS 传输,或者必须将目标计算机添加到 TrustedHosts 配置设置。

New-PSSessionEnter-PSSessionInvoke-Commandcmdlet 的 ComputerName 参数接受 IP 地址作为有效值。 但是,Kerberos 身份验证不支持 IP 地址。 因此当你指定 IP 地址时,将使用 NTLM 身份验证。

若要支持 NTLM 身份验证,必须满足以下要求:

  • 配置计算机进行 HTTPS 传输或将远程计算机的 IP 地址添加到本地计算机上的 TrustedHosts 列表中。
  • 在所有远程命令中使用 Credential 参数。 即使以当前用户身份连接,也需要这样做。

如何从基于工作组的计算机进行远程连接

对于错误

错误:WinRM 客户端无法处理该请求。 如果身份验证方案不同于 Kerberos,或者客户端计算机未加入域,则必须使用 HTTPS 传输,或者必须将目标计算机添加到 TrustedHosts 配置设置。

当本地计算机不在域中时,必须满足以下要求:

  • 配置计算机进行 HTTPS 传输或将远程计算机的 IP 地址添加到本地计算机上的 TrustedHosts 列表中。
  • 验证是否在基于工作组的计算机上设置了密码。 如果未设置密码或密码值为空,则无法运行远程命令。
  • 在所有远程命令中使用 Credential 参数。 即使以当前用户身份连接,也需要这样做。

如何将计算机添加到受信任的主机列表

TrustedHosts 项可以包含以逗号分隔的计算机名、IP 地址和完全限定域名列表。 允许使用通配符。

若要查看或更改受信任的主机列表,请使用 WSMan: 驱动器。 TrustedHost 项位于 WSMan:\localhost\Client 节点中。 只有计算机上管理员组的成员才有权更改计算机上的受信任主机列表。

注意

TrustedHosts 项设置的值会影响计算机的所有用户。

若要查看受信任的主机列表,请使用以下命令:

Get-Item wsman:\localhost\Client\TrustedHosts

以下示例使用通配符 (*) 将所有计算机添加到受信任主机列表中。

Set-Item wsman:localhost\client\trustedhosts -Value *

还可以使用通配符 (*) 将特定域中的所有计算机添加到受信任主机列表中。 例如,以下命令将添加 Fabrikam 域中的所有计算机。

Set-Item wsman:localhost\client\trustedhosts *.fabrikam.com

以下示例将受信任的主机列表设置为单个计算机。

$server = 'Server01.Domain01.Fabrikam.com'
Set-Item wsman:\localhost\Client\TrustedHosts -Value $server

若要将计算机名添加到受信任的主机的现有列表中,请先将当前值保存在变量中。 然后将该值设置为包含逗号分隔列表的字符串,其中包括当前值和新值。

以下示例将 Server01 添加到现有的受信任主机列表中。

$newServer = 'Server01.Domain01.Fabrikam.com'
$curValue = (Get-Item wsman:\localhost\Client\TrustedHosts).Value
Set-Item wsman:\localhost\Client\TrustedHosts -Value "$curValue, $newServer"

若要将特定计算机的 IP 地址添加到受信任的主机列表中,请使用以下命令格式:

Set-Item wsman:\localhost\Client\TrustedHosts -Value <IP Address>

例如:

Set-Item wsman:\localhost\Client\TrustedHosts -Value 172.16.0.0

若要将计算机添加到远程计算机的 TrustedHosts 列表,请使用 Connect-WSMan 连接到 WSMan: 驱动器远程计算机,然后使用 Set-Item 添加计算机。

有关详细信息,请参阅 Connect-WSMan 的帮助。

如何在备用端口上配置远程处理

对于错误:

错误:与指定远程主机的连接被拒绝。 验证 WS-Management 服务是否正在远程主机上运行,并配置为侦听正确端口和 HTTP URL 上的请求。

默认情况下,PowerShell 远程处理使用端口 80 进行 HTTP 传输。 只要用户未在远程命令中指定 ConnectionURIPort 参数,就会使用默认端口。

使用 Set-Item cmdlet 更改侦听器叶节点中的 Port 值。

例如,以下命令将默认端口更改为 8080。

Set-Item wsman:\localhost\listener\listener*\port -Value 8080

如何使用代理服务器配置远程处理

对于错误:

错误:客户端无法连接到请求中指定的目标。 验证目标上的服务正在运行并且正在接受请求。

由于 PowerShell 远程处理使用 HTTP 协议,因此受 HTTP 代理设置的影响。 在具有代理服务器的企业中,用户无法直接访问 PowerShell 远程计算机。

若要解决此问题,请在远程命令中使用代理设置选项。

  • 使用 New-PSSessionOption cmdlet 的 ProxyAccessTypeProxyAuthenticationProxyCredential 参数创建一个变量,其中包含具有企业代理设置的 PSSessionOption 对象。
  • 将包含 PSSessionOption 对象的变量与 New-PSSessionEnter-PSSessionInvoke-Command命令的 SessionOption 参数一起使用。
$newPSSessionOptionSplat = @{
    ProxyAccessType = 'IEConfig'
    ProxyAuthentication = 'Negotiate'
    ProxyCredential = 'Domain01\User01'
}
$SessionOption = New-PSSessionOption @newPSSessionOptionSplat

$newPSSessionSplat = @{
    ConnectionUri = 'https://www.fabrikam.com'
    SessionOption = $SessionOption
}
New-PSSession @newPSSessionSplat

有关 New-PSSessionOption cmdlet 的详细信息,请参阅 New-PSSessionOption

若要为当前会话中的所有远程命令设置这些选项,请将 $PSSessionOption 首选项变量设置为创建的 PSSessionOption 对象。 有关详细信息,请参阅 about_Preference_Variables

若要为本地计算机上所有 PowerShell 会话中的所有远程命令设置这些选项,请将 $PSSessionOption 首选项变量添加到 PowerShell 配置文件。 有关 PowerShell 配置文件的详细信息,请参阅 About_Profiles

如何在 64 位计算机上检测 32 位会话

对于错误:

错误:<tool-name> 一词未被识别为 cmdlet、函数、脚本文件或可操作程序的名称。 检查名称的拼写,或者是否包含路径,验证路径是否正确,然后重试。

如果远程计算机运行的是 64 位版本的 Windows,并且远程命令使用 32 位会话配置,例如 Microsoft.PowerShell32,WinRM 将加载 WOW64 进程。 Windows 会自动将对 $env:Windir\System32 的所有引用重定向到 $env:Windir\SysWOW64 目录。

因此,无法找到正在 System32 目录中运行,但在 SysWow64 目录中没有对应项的工具。

若要查找会话中使用的处理器体系结构,请使用 PROCESSOR_ARCHITECTURE 环境变量的值。

$s = New-PSSession -ComputerName Server01 -ConfigurationName CustomShell
Invoke-Command -Session $s {$env:PROCESSOR_ARCHITECTURE}
x86

有关详细信息,请参阅 about_Session_Configurations

排查策略和首选项问题

本部分讨论与本地和远程计算机上设置的策略和首选项相关的远程处理问题。

如何更改 Import-PSSession 和 Import-Module 的执行策略

对于错误:

错误:Import-Module:无法加载文件 <文件名>,因为此系统上禁用了脚本的执行。

Import-PSSessionExport-PSSession cmdlet 创建包含未签名脚本文件和格式化文件的模块。

若要导入由这些 cmdlet 创建的模块,当前会话中的执行策略不能是 RestrictedAllSigned。 有关更多信息,请参阅 about_Execution_Policies

若要导入模块而不更改本地计算机的执行策略,请使用 Set-ExecutionPolicyScope 参数为单个进程设置限制较少的执行策略。

例如,以下示例将执行策略设置为当前进程的 RemoteSigned。 更改仅影响当前进程。

Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned

还可以使用 PowerShell.exeExecutionPolicy 参数通过一个不太严格的执行策略来启动单个会话。

pwsh.exe -ExecutionPolicy RemoteSigned

如何设置和更改配额

可以使用配额来保护本地计算机和远程计算机免受意外和恶意的资源过度使用。 当配额与命令冲突时,PowerShell 将生成以下错误。

错误:从远程客户端接收的总数据超出了允许的最大数量。

WSMan 提供程序具有以下配额设置:

  • WSMan:<ComputerName> 节点中的 MaxEnvelopeSizeKBMaxProviderRequests 设置以及 WSMan:<ComputerName>\Service 节点中的 MaxConcurrentOperationsMaxConcurrentOperationsPerUserMaxConnections 设置。
  • 可以使用 New-PSSessionOption cmdlet 的 MaximumReceivedDataSizePerCommandMaximumReceivedObjectSize 参数和 $PSSessionOption 首选项变量来保护本地计算机。
  • 若要保护远程计算机,请使用 Register-PSSessionConfiguration cmdlet 的 MaximumReceivedDataSizePerCommandMBMaximumReceivedObjectSizeMB 参数向会话配置添加限制。

若要解决此错误,请更改远程命令以符合配额或增加配额以允许命令完成。

例如,以下命令将远程计算机上 Microsoft.PowerShell 会话配置中的对象大小配额从 10 MB(默认值)增加到 11 MB。

$setPSSessionConfigurationSplat = @{
    Name = 'Microsoft.PowerShell'
    MaximumReceivedObjectSizeMB = 11
    Force = $true
}
Set-PSSessionConfiguration @setPSSessionConfigurationSplat

有关 WS 管理配额的详细信息,请参阅 about_WSMan_Provider

如何解决超时错误

可以使用超时来保护本地计算机和远程计算机免受意外和恶意的资源过度使用。 如果本地和远程计算机上都设置了超时,PowerShell 将使用最短的超时设置。

当超时值不允许操作完成时,PowerShell 将终止该操作并生成以下错误。

错误:WS-Management 服务无法在 OperationTimeout 中指定的时间内完成操作。

WSMan 提供程序具有以下超时设置。

  • WSMan:<ComputerName> 节点中的 MaxTimeoutMs 设置,EnumerationTimeoutMsWSMan:<ComputerName>\Service 节点中的 MaxPacketRetrievalTimeSeconds 设置。
  • 可以使用 New-PSSessionOption cmdlet 的 CancelTimeoutIdleTimeoutOpenTimeout 以及 OperationTimeout 参数和 $PSSessionOption 首选项变量来保护本地计算机。
  • 还可以通过在会话的会话配置中以编程方式设置超时值来保护远程计算机。

若要解决该错误,请将命令更改为在超时间隔内完成,或增加超时间隔以允许命令完成。

以下示例创建了一个会话选项,其中 OperationTimeout 值为 4 分钟(以 MS 为单位),然后使用该会话选项创建远程会话。

$pso = New-PSSessionOption -OperationTimeout 240000
New-PSSession -ComputerName Server01 -SessionOption $pso

有关 WS 管理超时的详细信息,请参阅 about_WSMan_Provider

如何中断无响应的命令

某些本机程序(例如具有用户界面的程序、提示输入的控制台应用程序以及使用 Win32 控制台 API 的控制台应用程序)在 PowerShell 远程主机中无法正常工作。

使用这些程序时,可能会出现意外行为,例如无输出、部分输出或远程命令未完成。

若要结束无响应的程序,请按 Ctrl+c。 在本地主机和远程会话中使用 Get-Error 可以查看可能报告的任何错误。

如何从操作失败中恢复

当操作在完成之前终止时,将返回以下错误。

错误:由于发生线程退出或应用程序请求,I/O 操作已中止。

通常,当 WinRM 服务停止或重新启动,而其他 WinRM 操作正在进行时,就会发生这种情况。

若要解决此问题,请验证 WinRM 服务是否正在运行,然后重试该命令。

  1. 使用“以管理员身份运行”选项启动 PowerShell。

  2. 运行以下命令:

    Start-Service WinRM

  3. 重新运行生成错误的命令。

Linux 和 macOS 限制

Linux 和 macOS 中的 PowerShell 远程处理功能通过 SSH 进行远程处理。 有关详细信息,请参阅通过 SSH 进行 PowerShell 远程处理

请参阅