主题 about_Remote_Troubleshooting 简短说明 说明如何解决 Windows PowerShell 中的远程操作的问题。 详细说明 本节描述您在使用 Windows PowerShell 基于 WS-Management 技术的远程处理 功能时可能遇到的一些问题,并提出这些问题的解决方案。 在使用 Windows PowerShell 远程处理之前,请参阅 about_Remote 和 about_Remote_Requirements 了解有关配置和基本用法的指南。另外, 每个远程 cmdlet 的帮助主题(尤其是参数说明)提供了用于帮助您避免 问题的有用信息。 本主题的更新版本以及其他 Windows PowerShell 帮助主题可通过联机方式 在 Microsoft TechNet Library 中找到。若要查看本帮助主题的联机版本, 请将以下 URL 粘贴到 Internet浏览器中: http://go.microsoft.com/fwlink/?LinkID=135188 注意:在 Windows Vista、Windows Server 2008 以及更高版本的 Windows 上, 若要查看或更改 WSMan: 驱动器中关于本地计算机的设置(包括更改会话配置、 受信任的主机、端口或侦听器),请使用"以管理员身份运行"选项 启动 Windows PowerShell。 权限和身份验证问题疑难解答 本节讨论关于用户和计算机权限以及远程处理要求的远程处理问题。 如何以管理员身份运行 --------------------------- 错误:访问被拒绝。您需要从提升的进程运行此 cmdlet。 若要在本地计算机上启动远程会话,或要查看或更改 WSMan: 驱动器中关于 本地计算机的设置(包括更改会话配置、受信任的主机、端口或侦听器), 请使用"以管理员身份运行"选项启动 Windows PowerShell。 使用"以管理员身份运行"选项启动 Windows PowerShell: -- 右键单击 Windows PowerShell(或 Windows PowerShell ISE)图标,然后 单击"以管理员身份运行"。 在 Windows 7 和 Windows Server 2008 R2 中,使用"以管理员身份运行"选项 启动 Windows PowerShell。 -- 在 Windows 任务栏中,右键单击"Windows PowerShell"图标,然后 单击"以 admin 身份运行 Windows PowerShell"。 注意:在 Windows Server 2008 R2 中,Windows PowerShell 图标默认固定在 任务栏上。 如何启用远程处理 ---------------------- 错误:访问被拒绝 - 或 - 错误:到远程主机的连接被拒绝。请验证 WS-Management 服务正在远程主机上 运行,且已配置为侦听正确端口和 HTTP URL 上的请求。 计算机无需进行配置即可发送远程命令。但是,若要接收远程命令, 必须为远程计算机配置远程处理。该配置包括启动 WinRM 服务、 将 WinRM 服务的启动类型设置为"自动"、创建用于 HTTP 和 HTTPS 连接的 侦听器,以及创建默认会话配置。 若要配置计算机使其能接收远程命令,请使用 Enable-PSRemoting cmdlet。以下命令将启用所有要求的远程设置、启用会话配置并重新 启动 WinRM 服务使更改生效。 enable-psremoting 若要禁止显示所有用户提示,请键入: enable-psremoting -force 有关详细信息,请参阅 Enable-PSRemoting。 如何启用企业中的远程处理 --------------------------------------- 错误:访问被拒绝 - 或 - 错误:到远程主机的连接被拒绝。请验证 WS-Management 服务正在远程主机上 运行,且已配置为侦听正确端口和 HTTP URL 上的请求。 若要使单台计算机接收远程 Windows PowerShell 命令并接受连接,请使用 Enable-PSRemoting cmdlet。 若要启用企业中多台计算机的远程处理,可以使用以下扩展选项。 -- 若要配置用于远程处理的侦听器,请启用"允许自动配置侦听器"组策略。 有关说明,请参阅"如何通过使用组策略启用侦听器"(如下所示)。 -- 若要将多台计算机上 Windows 远程管理 (WinRM) 的启动类型设置为"自动", 请使用 Set-Service cmdlet。有关说明,请参阅"如何设置 WinRM 服务的 启动类型"(如下所示)。 -- 若要启用防火墙例外,请使用"Windows 防火墙:允许本地端口例外"组策略。 有关说明,请参阅"如何通过使用组策略创建防火墙例外"(如下所示)。 如何通过使用组策略启用侦听器 ------------------------------------------------ 错误:访问被拒绝 - 或 - 错误:到远程主机的连接被拒绝。请验证 WS-Management 服务正在远程主机上 运行,且已配置为侦听正确端口和 HTTP URL 上的请求。 若要配置用于域中所有计算机的侦听器,请启用以下组策略路径中的"允许自动配置 侦听器"策略: 计算机配置管理模板Windows 组件Windows 远程管理(WinRM)WinRM 服务 启用该策略并指定 IPv4 and IPv6 筛选器。允许使用通配符 (*)。 如何通过使用组策略启用防火墙例外 ---------------------------------------------------------- 错误:访问被拒绝 - 或 - 错误:到远程主机的连接被拒绝。请验证 WS-Management 服务正在远程主机上 运行,且已配置为侦听正确端口和 HTTP URL 上的请求。 若要启用域中所有计算机的防火墙例外,请启用 以下组策略路径中的"Windows 防火墙:允许本地端口例外" 策略: 计算机配置管理模板网络网络连接Windows 防火墙域配置文件 此策略允许计算机上 Administrators 组的成员使用"控制面板"中的"Windows 防火墙" 为 Windows 远程管理服务创建防火墙例外。 如何设置 WinRM 服务的启动类型 ------------------------------------------------ 错误:访问被拒绝 Windows PowerShell 远程处理取决于 Windows 远程管理 (WinRM) 服务。 必须运行此服务来支持远程命令。 在 Windows Server 2003、Windows Server 2008 和 Windows Server 2008 R2 上,Windows 远程管理 (WinRM) 服务的启动类型为 "自动"。 但是在 Windows XP、Windows Vista 和 Windows 7 上,WinRM 服务默认为禁用 状态。 若要设置远程计算机上服务的启动类型,请使用 Set-Service cmdlet。 若要在多台计算机上运行此命令,可以创建一个包含这些计算机名称的文本 文件或 CSV 文件。 例如,以下命令从 Servers.txt 文件中获取一个计算机名称列表, 然后将所有这些计算机上 WinRM 服务的启动类型设置为"自动"。 C:PS> $servers = get-content servers.txt C:PS> set-service WinRM -computername $servers -startuptype Automatic 若要查看结果,请对 Win32_Service 对象使用 Get-WMIObject cmdlet。 有关详细信息,请参阅 Set-Service。 如何重新创建默认会话配置 -------------------------------------------------- 错误:访问被拒绝 若要连接到本地计算机并远程运行命令,本地计算机必须包含远程命令的会话 配置。 使用 Enable-PSRemoting 时,它将在本地计算机上创建默认会话配置。 当远程命令未包括 ConfigurationName 参数时,远程用户 可使用这些会话配置。 如果计算机上的默认配置已注销或删除,请使用 Enable-PSRemoting cmdlet 重新创建这些配置。您可以多次使用此 cmdlet。如果某项功能已经配置, 此 cmdlet 不会生成错误。 如果更改了默认会话配置并想还原原来的默认会话配置,请使用 Unregister-PSSessionConfiguration cmdlet 删除更改后的会话配置, 然后使用 Enable-PSRemoting cmdlet 将它们还原。Enable-PSRemoting 不会更改现有会话配置。 注意:当 Enable-PSRemoting 还原默认会话配置时,它不会为这些配置创建显式 安全描述符。实际上,这些配置会继承默认受保护的 RootSDDL 的安全描述符。 若要查看 RootSDDL 安全描述符,请键入: get-item wsman:localhostServiceRootSDDL 若要更改 RootSDDL,请在 WSMan: 驱动器中使用 Set-Item cmdlet。 若要更改会话配置的安全描述符,请使用 Set-PSSessionConfiguration cmdlet 并指定 SecurityDescriptorSDDL 或 ShowSecurityDescriptorUI 参数。 有关 WSMan: 驱动器的详细信息,请参阅 WS-Management 提供程序的帮助 主题("get-help wsman")。 如何提供管理员凭据 ---------------------------------------- 错误:访问被拒绝 默认情况下,若要在远程计算机上创建 PSSession 或运行命令,当前用户必须是 远程计算机上 Administrators 组的成员。即使当前用户登录到作为 Administrators 组成员的帐户,有时也需要提供凭据。 如果当前用户是远程计算机上 Administrators 组的成员,或可以提供 Administrators 组某成员的凭据,请使用 New-PSSession、Enter-PSSession 或 Invoke-Command cmdlet 的 Credential 参数进行远程连接。 例如,以下命令提供管理员的凭据。 Invoke-Command -ComputerName Server01 -Credential Domain01Admin01 有关 Credential 参数的详细信息,请参阅 New-PSSession、Enter-PSSession 或 Invoke-Command。 如何为非管理用户启用远程处理 --------------------------------------------------- 错误:访问被拒绝 若要在远程计算机上建立 PSSession 或运行命令,用户必须有权使用远程 计算机上的会话配置。 默认情况下,只有计算机上 Administrators 组的成员有权使用默认会话配置。 因此,只有 Administrators 组的成员才能远程连接到计算机。 若要允许其他用户连接到本地计算机,请授予用户对于本地计算机上默认会话 配置的"执行"权限。 以下命令将打开一个属性表,您可以在其中更改本地计算机上 Microsoft.PowerShell 默认会话配置的安全描述符。 Set-PSSessionConfiguration Microsoft.Powershell -ShowSecurityDescriptorUI 有关详细信息,请参阅 about_Session_Configurations。 如何为其他域中的管理员启用远程处理 ---------------------------------------------------------- 错误:访问被拒绝 当另一个域中的用户是本地计算机上 Administrators 组的成员时,该用户不能 使用管理员特权远程连接到本地计算机。默认情况下,来自其他域的远程连接 只能通过标准用户特权令牌运行。 但是,可以使用 LocalAccountTokenFilterPolicy 注册表条目来更改默认行为, 允许作为 Administrators 组成员的远程用户通过管理员特权运行。 注意:LocalAccountTokenFilterPolicy 条目会对所有受影响计算机的所有用户 禁用用户帐户控制 (UAC) 远程限制。在更改这一策略之前,请仔细考虑 该设置的含义。 若要更改这一策略,请使用以下命令将 LocalAccountTokenFilterPolicy 注册表 条目的值设置为 1。 C:PS> new-itemproperty -name LocalAccountTokenFilterPolicy -path ` HKLM:SOFTWAREMicrosoftWindowsCurrentVersion PoliciesSystem -propertyType `DWord -value 1 如何在远程命令中使用 IP 地址 ----------------------------------------------------- 错误:WinRM 客户端无法处理该请求。如果身份验证方案与 Kerberos 不同,或者客户端计算机未加入到域中,则必须使用 HTTPS 传输 或者必须将目标计算机添加到 TrustedHosts 配置设置。 New-PSSession、Enter-PSSession 和 Invoke-Command cmdlet 的 ComputerName 参数接受 IP 地址作为其有效值。但是,因为 Kerberos 身份 验证不支持 IP 地址,所以每次指定 IP 地址时,都默认使用 NTLM 身份验证。 使用 NTLM 身份验证时,需要执行以下远程处理过程。 1. 为计算机配置 HTTPS 传输,或者将远程计算机的 IP 地址添加到本地 计算机上的 TrustedHosts 列表中。 有关说明,请参阅下面的"如何将计算机添加到 TrustedHosts 列表"。 2. 在所有远程命令中使用 Credential 参数。 即使是提交当前用户的凭据,此操作也是必需的。 如何从基于工作组的计算机进行远程连接 ------------------------------------------------------- 错误:WinRM 客户端无法处理该请求。如果身份验证方案与 Kerberos 不同,或者客户端计算机未加入到域中,则必须使用 HTTPS 传输或者 必须将目标计算机添加到 TrustedHosts 配置设置。 当本地计算机不在域中时,需要执行以下远程处理过程。 1. 为计算机配置 HTTPS 传输,或者将远程计算机的名称添加到本地 计算机上的 TrustedHosts 列表中。 有关说明,请参阅下面的"如何将计算机添加到 TrustedHosts 列表"。 2. 验证基于工作组的计算机上是否设置了密码。如果未设置密码或密码值为空, 则不能运行远程命令。 若要为用户帐户设置密码,请使用"控制面板"中的"用户帐户"。 3. 在所有远程命令中使用 Credential 参数。 即使是提交当前用户的凭据,此操作也是必需的。 如何将计算机添加到受信任主机列表 ----------------------------------------------- TrustedHosts 项可包含用逗号分隔的计算机名称、IP 地址以及完全 限定的域名的列表。允许使用通配符。 若要查看或更改受信任主机列表,请使用 WSMan: 驱动器。 TrustedHost 项位于 WSMan:localhostClient 节点。 只有计算机上 Administrators 组的成员有权更改计算机上的受信任主机列表。 注意:为 TrustedHosts 项设置的值会影响计算机的所有用户。 若要查看受信任主机列表,请使用以下命令: get-item wsman:localhostClientTrustedHosts 还可以使用 Set-Location cmdlet (alias = cd) 从 WSMan: 驱动器 导航到这个位置。 例如"cd WSMan:localhostClient; dir"。 若要将所有计算机添加到受信任主机列表,请使用以下命令将 *(全部)值 放入 ComputerName set-item wsman:localhostclient rustedhosts -value * 还可以使用通配符 (*) 将特定域中的所有计算机添加到受信任主机列表。 例如,以下命令将 Fabrikam域中的所有计算机添加到受信任主机列表。 set-item wsman:localhostclient rustedhosts *.fabrikam.com 若要将特定计算机的名称添加到受信任主机列表,请使用以下命令格式: set-item wsman:localhostClientTrustedHosts -value <ComputerName>[,<ComputerName>] 其中每个 <ComputerName> 值都必须具有以下格式: <Computer>.<Domain>.<Company>.<top-level-domain> 例如: set-item wsman:localhostClientTrustedHosts -value Server01.Domain01.Fabrikam.com 若要将计算机名称添加到现有受信任主机列表,请首先将当前值保存到变量中, 然后将该值设置到包含当前值和新值的以逗号分隔的列表中。 例如,若要将 Server01 计算机添加到现有受信任主机列表,请使用以下命令 $curValue = (get-item wsman:localhostClientTrustedHosts).value set-item wsman:localhostClientTrustedHosts -value "$curValue, Server01.Domain01.Fabrikam.com" 若要将特定计算机的 IP 地址添加到受信任主机列表,请使用以下命令格式: set-item wsman:localhostClientTrustedHosts -value <IP Address> 例如: set-item wsman:localhostClientTrustedHosts -value 172.16.0.0 若要将计算机添加到远程计算机的 TrustedHosts 列表,请使用 Connect-WSMan cmdlet 在本地计算机上的 WSMan: 驱动器中为远程计算机添加一个节点。然后使用 Set-Item 命令添加该计算机。 有关 Connect-WSMan cmdlet 的详细信息,请参阅 Connect-WSMan。 计算机配置问题疑难解答 本节讨论关于计算机、域或企业的特定配置的远程处理问题。 如何配置备用端口上的远程处理 -------------------------------------------- 错误:到指定远程主机的连接被拒绝。请验证 WS-Management 服务正在远程 主机上运行,且已配置为侦听正确端口和 HTTP URL 上的请求。 默认情况下,Windows PowerShell 远程处理使用端口 80 来进行 HTTP 传输。当用户 未在远程命令中指定 ConnectionURI 或 Port 参数时,将使用此默认端口。 若要更改 Windows PowerShell 使用的默认端口,请在 WSMan: 驱动器中使用 Set-Item cmdlet 更改侦听器叶节点中的 Port 值。 例如,以下命令将默认端口更改为 8080。 set-item wsman:localhostlistenerlistener*port -value 8080 如何配置使用代理服务器的远程处理 --------------------------------------------- 错误:客户端无法连接到请求中指定的目标。请验证该目标上的服务是否 正在运行以及是否正在接受请求。 由于 Windows PowerShell 远程处理使用 HTTP 协议,因此它受 HTTP 代理设置的 影响。在拥有代理服务器的企业中,用户无法直接访问 Windows PowerShell 远程计算机。 若要解决此问题,请使用远程命令中的代理设置选项。提供了以下设置: -- ProxyAccessType -- ProxyAuthentication -- ProxyCredential 若要设置特定命令的这些选项,请使用以下过程: 1. 使用 New-PSSessionOption cmdlet 的 ProxyAccessType、 ProxyAuthentication 和 ProxyCredential 参数创建具有企业代理 设置的会话选项对象。将该选项对象保存在变量中。 2. 使用包含该选项对象的变量作为 New-PSSession、Enter-PSSession 或 Invoke-Command 命令的 SessionOption 参数值。 例如,以下命令创建一个包含代理会话选项的会话选项对象,然后使用该对象 创建一个远程会话。 C:PS> $SessionOption = New-PSSessionOption -ProxyAccessType IEConfig ` -ProxyAuthentication Negotiate -ProxyCredential Domain01User01 C:PS> New-PSSession -ConnectionURI https://www.fabrikam.com 有关 New-PSSessionOption cmdlet 的详细信息,请 参阅 New-PSSessionOption。 若要设置当前会话中所有远程命令的这些选项,请在 $PSSessionOption 首选项 变量值中使用 New-PSSessionOption 创建的选项对象。有关 $PSSessionOption 首选项变量的详细信息,请参阅 about_Preference_Variables。 若要设置本地计算机上所有 Windows PowerShell 会话中所有远程命令的这些选项, 请将 $PSSessionOption 首选项变量添加到 Windows PowerShell 配置文件中。 有关 Windows PowerShell 配置文件的详细信息,请参阅 about_Profiles。 如何在 64 位计算机上检测 32 位会话 --------------------------------------------------- 错误:无法将"<tool-name>"项识别为 cmdlet、函数、脚本文件或 可运行程序的名称。请检查名称的拼写,如果包括路径,请确保 路径正确,然后重试。 如果远程计算机运行 64 位版本的 Windows,而远程命令使用 32 位会话 配置(如 Microsoft.PowerShell32),则 Windows 远程管理 (WinRM) 将加载 一个 WOW64 进程,Windows 会自动将所有对 %Windir%System32 目录的引用 重定向到 %windir%SysWOW64 目录。 因此,如果尝试使用 System32 目录中的工具,而这些工具在 SysWow64 目录中 没有对应项(如 Defrag.exe),则无法在该目录中找到这些工具。 若要查找会话中使用的处理器体系结构,请使用 PROCESSOR_ARCHITECTURE 环境 变量的值。以下命令将查找 $s 变量中的会话的处理器体系结构。 C:PS> $s = new-pssession -computername Server01 -configurationName CustomShell C:PS> invoke-command -session $s {$env:PROCESSOR_ARCHITECTURE} x86 有关会话配置的详细信息,请 参阅 about_session_configurations。 策略和首选项问题疑难解答 本节讨论关于本地和远程计算机上设置的策略和首选项的远程处理问题。 如何更改 IMPORT-PSSESSION 和 IMPORT-MODULE 的执行策略 ------------------------------------------------------------------------- 错误:Import-Module: 无法加载文件 <filename>,因为在此系统中禁止 执行脚本。 Import-PSSession 和 Export-PSSession cmdlet 创建包含未签名脚本文件和 格式设置文件的模块。 若要通过使用 Import-PSSession 或 Import-Module 导入由这些 cmdlet 创建的 模块,则当前会话中的执行策略不能为 Restricted 或 AllSigned。有关 Windows PowerShell 执行策略的信息,请参阅 about_Execution_Policies。 若要在不更改本地计算机的执行策略(设置在注册表中)的情况下导入这些模块, 请使用 Set-ExecutionPolicy 的 Scope 参数为单个进程设置限制性较弱的 执行策略。 例如,以下命令启动执行策略为 RemoteSigned 的进程。执行策略的更改仅影响 当前进程,不会更改 Windows PowerShell ExecutionPolicy 注册表设置。 set-executionpolicy -scope process -executionpolicy RemoteSigned 还可以使用 PowerShell.exe 的 ExecutionPolicy 参数启动执行策略限制性较弱的 单个会话。 powershell.exe -executionpolicy RemoteSigned 有关这些 cmdlet 的详细信息,请参阅 Import-PSSession、 Export-PSSession 和 Import-Module。有关执行策略的详细信息, 请参阅 about_Execution_Policies。有关 PowerShell.exe控制台 帮助选项的详细信息,请键入"powershell.exe -?"。 如何设置和更改配额 ---------------------------- 错误:从远程客户端接收的总数据量超过了允许的最大值。 可以使用配额来保护本地计算机和远程计算机的资源不被过度 使用(无论是无意的还是恶意的)。 基本配置中提供了以下配额。 -- WS-Management 提供程序 (WSMan:) 提供了几种配额设置,如 WSMan:<ComputerName>节点中的 MaxEnvelopeSizeKB 和 MaxProviderRequests 设置,以及 WSMan:<ComputerName>Service 节点中的 MaxConcurrentOperations、MaxConcurrentOperationsPerUser 和 MaxConnections 设置。 -- 可以使用 New-PSSessionOption cmdlet 的 MaximumReceivedDataSizePerCommandMB 和 MaximumReceivedObjectSizeMB 参数以及 $PSSessionOption 首选项变量来保护本地计算机。 -- 可以向会话配置添加限制(例如通过使用 Register-PSSessionConfiguration cmdlet 的 MaximumReceivedDataSizePerCommandMB 和 MaximumReceivedObjectSizeMB 参数)来保护远程计算机。 当配额与命令发生冲突时,Windows PowerShell 会生成错误。 若要解决此错误,请更改远程命令以符合配额。或者,确定配额的来源, 然后增加配额来允许完成命令。 例如,以下命令将远程计算机上 Microsoft.PowerShell 会话配置中的对象 大小配额从 10MB(默认值)增加为 11 MB。 Set-PSSessionConfiguration -name microsoft.powershell ` -MaximumReceivedObjectSizeMB 11 -Force 有关 New-PSSsessionOption cmdlet 的详细信息,请 参阅 New-PSSessionOption。 有关 WS-Management 配额的详细信息,请参阅 WS-Management 提供程序的帮助 主题(键入"get-help WSMan")。 如何解决超时错误 ----------------------------- 错误:WS-Management 服务无法在 OperationTimeout 中指定的时间内完成操作。 可以使用超时设置来保护本地计算机和远程计算机的资源不被过度使用(无论是 无意的还是恶意的)。当在本地和远程计算机上都设置了超时设置时, Windows PowerShell 会使用其中最短的超时设置。 基本配置中提供了以下超时设置。 -- WS-Management 提供程序 (WSMan:) 提供了几种客户端和服务端超时设置, 如 WSMan:<ComputerName> 节点中的 MaxTimeoutms 设置,以及 WSMan:<ComputerName>Service 节点中的 EnumerationTimeoutms 和 MaxPacketRetrievalTimeSeconds 设置。 -- 可以使用 New-PSSessionOption cmdlet 的 CancelTimeout、IdleTimeout、 OpenTimeout 和 OperationTimeout 参数以及 $PSSessionOption 首选项 变量来保护本地计算机。 -- 还可以通过在会话的会话配置中以编程方式设置超时值来保护远程计算机。 当超时值不允许完成操作时,Windows PowerShell 将终止该操作并生成错误。 若要解决此错误,请更改命令以在超时间隔内完成命令;或确定超时限制的来源, 并增大超时间隔来允许完成命令。 例如,以下命令使用 New-PSSessionOption cmdlet 创建一个 OperationTimeout 值为 4 分钟(以毫秒为单位)的会话选项对象,然后使用该会话选项对象创建 一个远程会话。 C:PS> $pso = new-pssessionoption -operationtimeout 240000 C:PS> new-pssession -computername Server01 -sessionOption $pso 有关 WS-Management 超时设置的详细信息,请参阅 WS-Management 提供程序的帮助 主题(键入"get-help WSMan")。 有关 New-PSSsessionOption cmdlet 的详细信息,请 参阅 New-PSSessionOption。 无响应行为疑难解答 本节讨论关于阻止命令完成以及阻止或延迟 Windows PowerShell 提示符返回的远程 处理问题。 如何中断命令 -------------------------- 有些 Windows 本机程序(如具有用户界面的程序、可提示输入的控制台应用程序 以及使用 Win32控制台 API 的控制台应用程序)在 Windows PowerShell 远程主机上 不能正常工作。 使用这些程序时,可能出现意外行为,例如没有输出、输出一部分或远程命令不能 完成。 若要结束无响应的程序,请按 CTRL + C。若要查看可能已报告的任何错误, 请在本地主机和远程会话中键入"$error"。 另请参阅 联机版本:http://go.microsoft.com/fwlink/?LinkID=135188 about_remote about_remote_requirements