方案指南:排查 WMI 连接和访问问题

本文介绍如何查看 Windows Management Instrumentation (WMI) 配置,以及如何诊断和排查 WMI 连接或访问问题。

下面是可能会遇到的 WMI 配置或连接问题的一些示例。 这些问题来自使用或依赖于 WMI 的不同产品和应用程序。

  • 创建 群集向导 尝试连接到远程计算机(群集节点),但无法检索数据。

    “创建群集向导”的屏幕截图,其中显示计算机无法访问错误。

    “添加节点向导”的屏幕截图,显示未能检索最大节点数错误。

  • 当 Active Directory 角色安装程序尝试与其主机通信时,Active Directory 域服务配置向导将失败,并出现以下错误:

    Adprep 无法通过 Windows Management Instrumentation(WMI)从服务器 testbox.contoso.com 检索数据。

    显示 Adprep 无法检索数据错误的Active Directory 域服务配置向导的屏幕截图。

  • 本地 WMI 查询无法使用 Get-WmiObject PowerShell cmdlet 并收到“拒绝访问”错误。

    get-wmiobject cmdlet 结果的屏幕截图,其中显示了“访问被拒绝”错误。

连接流

WMI 连接涉及多个组件和层。 高级别涉及以下组件:

  • 启动 WMI 连接或查询的客户端或管理应用程序

  • 用于本地和远程进程间通信的组件对象模型(COM)或分布式组件对象模型(DCOM)组件

  • 传输层或网络层(远程过程调用(RPC))

  • WMI 存储库和 WMI 服务

  • WMI 提供程序

  • 托管对象

    WMI 连接流的示意图。

识别问题

根据发生错误或失败的位置或返回错误的组件,问题可按如下所示进行分类:

  • 连接问题
  • 访问问题
  • 核心 WMI 提供程序错误代码

连接问题

在本地或远程建立与 WMI 基础结构的连接之前发生的 WMI 连接失败被视为连接问题。

COM/DCOM 体系结构在本地或远程、传输层(RPC)或防火墙返回问题或错误。 连接问题可能会出现各种错误,但最常见的错误如下:

  • 0x800706BA
    HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE)

  • 0x80041015
    发生了阻止正常操作的网络错误。

访问问题

当 WMI 连接或查询因访问失败或缺少一个或多个 WMI 组件的权限而失败时,会出现访问问题。

换句话说,WMI 基础结构中有多个区域,例如 COM/DCOM、WMI 命名空间、WMI 存储库和提供程序,用户需要适当的权限才能访问、使用或与其交互。 缺少权限或限制会导致 WMI 连接失败,你可能会收到以下错误:

  • 0x80070005
    E_ACCESS_DENIED
    DCOM 安全性拒绝的访问

  • 0x80041003
    WBEM_E_ACCESS_DENIED
    提供程序拒绝访问

核心 WMI 提供程序错误代码

即使成功连接到 WMI 并具有正确的权限,WMI 查询或连接也可能因为查询的根本问题、提供程序返回的错误、无效的类或无效命名空间而失败。

此问题可能是由于各种原因造成的,并且错误主要由 WMI 服务返回。

在这种情况下,返回的错误代码有助于了解问题。 下面是一些错误代码:

  • 0x80041002 - WBEM_E_NOT_FOUND

  • 0x80041004 - WBEM_E_PROVIDER_FAILURE

  • 0x80041062 - WBEM_E_PRIVILEGE_NOT_HELD

  • 0x8004100E - WBEM_E_INVALID_NAMESPACE

  • 0x80041010 - WBEM_E_INVALID_CLASS

  • 0x80041011 - WBEM_E_PROVIDER_NOT_FOUND

  • 0x80041012 - WBEM_E_INVALID_PROVIDER_REGISTRATION

  • 0x80041013 - WBEM_E_PROVIDER_LOAD_FAILURE

WMI 基础结构返回的错误的完整列表列在 WMI 错误常量

检查配置

如果可以根据返回的失败或错误确认问题是连接性或访问问题,请检查 WMI 的现有配置,或确保用户具有适当的权限。

  • 默认情况下,只有 Administrators 组的成员才能远程访问 WMI 命名空间。
  • 若要使用 WMI 连接到远程计算机,请确保为连接启用正确的 DCOM 设置和 WMI 命名空间安全设置。
  • WMI 具有远程连接中目标计算机所需的默认模拟、身份验证和身份验证服务(NTLM 或 Kerberos)设置。 本地计算机可能会使用目标系统不接受的不同默认值。 可以在连接调用中更改这些设置。
  • 与本地计算机上的 WMI 的连接的默认身份验证级别为 PktPrivacy.
  • WMI 远程连接受用户帐户控制 (UAC) 和 Windows 防火墙的影响。

设置 DCOM 安全性以允许非管理员用户访问计算机

可以使用 控制面板 管理工具中找到的 DCOM 配置实用工具(DCOMCnfg.exe)为 WMI 配置 DCOM 设置。

此实用工具公开了使某些用户能够通过 DCOM 远程连接到计算机的设置。 使用此实用工具,可以设置安全性以启动、访问和配置 WMI 服务。

以下过程介绍如何向某些用户和组授予 DCOM 远程启动和激活权限。

如果计算机 A 远程连接到计算机 B,则可以在计算机 B 上设置这些权限,以允许计算机 B 上不属于 管理员 组的用户或组在计算机 B 上执行 DCOM 启动和激活调用。

若要手动向用户或组授予 DCOM 远程启动和激活权限,请执行以下步骤:

  1. 选择“开始>运行”,键入 DCOMCNFG,然后选择“确定”。
  2. “组件服务”窗口中,展开“组件服务>计算机”。 右键单击“我的电脑”,并选择“属性”。
  3. “我的计算机属性 ”对话框中,选择 “COM 安全性 ”选项卡。
  4. 在“启动和激活权限”下,选择“编辑限制”。
  5. “启动和激活权限 ”对话框中,选择“ 添加 ”(如果名称或组未显示在 “组”或“用户名 ”列表中)。 在“选择用户、计算机或组”对话框中,在“输入对象名称以选择”框中添加名称和组,然后选择“确定”。
  6. “启动和激活权限”对话框中,选择“组”或“用户名”列表中的用户和组。 在用户或组>的 P 授权下,选中“允许远程启动”和“远程激活”权限,然后选择“确定”。<

以下过程介绍如何向某些用户和组授予 DCOM 远程访问权限。 如果计算机 A 远程连接到计算机 B,则可以在计算机 B 上设置这些权限,以允许计算机 B 上不属于 管理员 组的用户或组连接到计算机 B。

若要授予 DCOM 远程访问权限,请执行以下步骤:

  1. 选择“开始>运行”,键入 DCOMCNFG,然后选择“确定”。
  2. “组件服务”窗口中,展开“组件服务>计算机”。 右键单击“我的电脑”,并选择“属性”。
  3. “我的计算机属性 ”对话框中,选择 “COM 安全性 ”选项卡。
  4. 在“访问权限”下,选择“编辑限制”。
  5. “访问权限”对话框中,在“组”或“用户名”框中选择“匿名登录”。 在“匿名登录的权限”下,选中“允许远程访问”权限,然后选择“确定”。

注意

还可以将用户添加到 目标计算机上的本地分布式 COM 用户组 。 默认情况下,此组具有在所有 Windows 计算机上访问 COM/DCOM 的所有权限。

允许用户访问特定的 WMI 命名空间

可以通过在命名空间的 WMI 控件中设置远程启用权限来允许或禁止用户访问特定的 WMI 命名空间。 如果用户尝试连接到不允许用户访问的命名空间,用户将收到错误0x80041003。

默认情况下,仅为管理员启用此权限。 管理员可以为非管理员用户启用对特定 WMI 命名空间的远程访问。

以下过程为非管理员用户设置 远程启用 权限。

  1. 使用 WMIMGMT.msc 连接到远程计算机。

  2. 右键单击 WMI 控件 并选择“ 属性”。

  3. “安全 ”选项卡中,选择命名空间,然后选择“ 安全性”。

    注意

    Root\cimv2 是默认命名空间。

  4. 在权限列表中找到或添加相应的帐户并检查 远程启用读取安全性

    注意

    若要确保将相同的权限继承到子文件夹或子名称空间,请选择“ 高级”。 然后,选择预期用户,并确保在“应用于”部分下选择了此命名空间和子名称空间

    选择了相应权限的 CIMV2 权限条目的屏幕截图。

若要检查与特定命名空间中的特定类的连接,可以按照以下步骤使用 Windows Management Instrumentation Tester (WBEMTEST) 工具:

  1. 以管理员身份打开 WBEMTEST,然后选择“ 连接”。 默认情况下,控制台连接到本地 WMI 的 Root\cimv2 命名空间。
  2. 将命名空间更改为尝试测试其连接的命名空间。 如果是远程计算机,请以 \\<machinename>\Root\cimv2 格式输入它。

如果连接成功,WBEMTEST 主窗口将连接到提供的非默认命名空间。

默认情况下,WBEMTEST 连接使用已登录的用户凭据。 如果使用其他帐户进行连接,则尝试连接之前会弹出凭据。

以下示例演示如何使用 User1 的凭据连接到“RemoteMachine1”上的命名空间 root\ccm

“连接”窗口的屏幕截图,其中显示了尝试使用 User1 凭据连接到 RemoteMachine1 上的命名空间 root\ccm。

若要在已加入域的计算机和工作组计算机之间设置 WMI 连接,请考虑目标计算机的本地用户。

注意

如果使用目标计算机的内置本地管理员,则此用户已具有从其他计算机远程访问 WMI 的适当权限,并且不需要任何其他配置。

目标计算机的防火墙应允许传入的 WMI 连接,上述防火墙配置可以执行,如 Windows 防火墙设置部分所示。 然后,配置 DCOM 安全性和 WMI 命名空间,如“设置 DCOM 安全性”中所示,以允许非管理员用户访问计算机并允许用户访问特定的 WMI 命名空间部分。

Windows 防火墙设置

Windows 防火墙设置的 WMI 设置仅启用 WMI 连接,而不是其他 DCOM 应用程序。

必须在远程目标计算机上的 WMI 防火墙中设置例外。

WMI 例外允许 WMI 接收远程连接。 如果客户端应用程序创建自己的接收器,则必须将该接收器显式添加到防火墙例外,以允许回调成功。

可以通过 Windows 防火墙 UI 启用或禁用 WMI 流量。 为此,请按照下列步骤进行操作:

  1. 控制面板中,选择“安全>Windows 防火墙”。
  2. 选择“更改设置”,然后选择“异常”选项卡。
  3. “例外 ”窗口中,选中 “Windows Management Instrumentation”(WMI) 复选框以通过防火墙启用 WMI 流量。 若要禁用 WMI 流量,请清除复选框。

可以使用 WMI 规则组在命令提示符处通过防火墙启用或禁用 WMI 流量。

  • 在命令提示符处使用以下命令,通过防火墙启用 WMI 流量。

    netsh advfirewall firewall set rule group="windows management instrumentation (wmi)" new enable=yes
    
  • 使用以下命令通过防火墙禁用 WMI 流量。

    netsh advfirewall firewall set rule group="windows management instrumentation (wmi)" new enable=no
    

还可以对每个 DCOM、WMI 服务和接收器使用单个命令,而不是使用单个 WMI 规则组命令。

若要为 DCOM、WMI、回调接收器和传出连接启用单独的规则,请启用 WMI 流量:

  • 若要为 DCOM 端口 135 建立防火墙例外,请使用以下命令:

    netsh advfirewall firewall add rule dir=in name="DCOM" program=%systemroot%\system32\svchost.exe service=rpcss action=allow protocol=TCP localport=135
    
  • 若要为 WMI 服务建立防火墙例外,请使用以下命令:

    netsh advfirewall firewall add rule dir=in name ="WMI" program=%systemroot%\system32\svchost.exe service=winmgmt action = allow protocol=TCP localport=any
    
  • 若要为从远程计算机接收回调的接收器建立防火墙例外,请使用以下命令:

    netsh advfirewall firewall add rule dir=in name ="UnsecApp" program=%systemroot%\system32\wbem\unsecapp.exe action=allow
    
  • 若要为与本地计算机异步通信的远程计算机的传出连接建立防火墙例外,请使用以下命令:

    netsh advfirewall firewall add rule dir=out name ="WMI_OUT" program=%systemroot%\system32\svchost.exe service=winmgmt action=allow protocol=TCP localport=any
    

若要对 DCOM、WMI、回调接收器和传出连接使用单独的规则禁用 WMI 流量:

  • 若要禁用 DCOM 异常,请使用以下命令:

    netsh advfirewall firewall delete rule name="DCOM"
    
  • 若要禁用 WMI 服务异常,请使用以下命令:

    netsh advfirewall firewall delete rule name="WMI"
    
  • 若要禁用接收器异常,请使用以下命令:

    netsh advfirewall firewall delete rule name="UnsecApp"
    
  • 若要禁用传出异常,请使用以下命令:

    netsh advfirewall firewall delete rule name="WMI_OUT"
    

排查不同方案的问题

大多数连接问题是由于权限不正确、没有权限或外部因素(如防火墙或防病毒软件)导致的。 因此,查看配置可能会解决问题。

除了默认配置之外,一些其他设置可能会影响连接。

  • 查看客户端应用程序或源(Microsoft-Windows-DistributedCOM)记录的任何错误的应用程序和系统事件日志,并查找可能根据方案在源或目标计算机上记录的任何相关错误或事件。

  • 在 事件查看器>Applications 和服务日志>查看 Windows 防火墙的事件日志,Microsoft>具有高级安全>防火墙的 Windows>防火墙,以便防火墙阻止来自 WMI 的任何连接。

    启用某些组策略设置以修改 RPC 和 DCOM 的默认行为和权限。 例如:

    • 此组策略可以限制未经身份验证的 RPC 调用,这可能会导致错误:

      RPC 服务器不可用。 (HRESULT 异常:0x800706BA)

      计算机配置\管理模板\系统\远程过程调用\限制未经身份验证的 RPC 客户端

      此设置控制 RPC 服务器运行时如何处理连接到 RPC 服务器的未经身份验证的 RPC 客户端。 此策略设置会影响所有 RPC 应用程序,包括 WMI。

    • 此组策略可以配置自定义 DCOM 权限:

      计算机配置\Windows 设置\安全设置\本地策略\安全选项\DCOM:安全描述符定义语言(SDDL)语法中的计算机启动限制

      此设置允许你通过两种方式指定 ACL。 可以在 SDDL 中键入安全描述符,或者授予或拒绝 对用户和组的本地访问和远程访问 权限。

  • 查看目标计算机上的 RPC 动态端口范围:

    • netsh int ipv4 show dynamicport tcp
    • netsh int ipv4 show dynamicport udp
    • netsh int ipv6 show dynamicport tcp
    • netsh int ipv6 show dynamicport udp

    将其与工作计算机进行比较。 如果端口范围不是默认的,或限制为较小的范围,则可能会影响 WMI 连接。 Windows 的服务概述和网络端口要求显示 RPC 所需的默认端口范围。

如果问题是访问问题或核心 WMI 错误,则传入的查询将记录为 事件查看器>Applications 和服务日志>Microsoft Windows WMI-Activity/Operational 中的日志Microsoft-Windows-WMI-Activity>>/Operational 中的操作事件。

在某些情况下,本地 WMI 连接可能会失败。

可以通过右键单击 WMI 控件并选择“属性”来使用 WMIMGMT.msc 检查本地 WMI 连接。

下面是本地 WMI 失败时发生的一些错误:

  • 无法连接到 <本地计算机> ,因为“WMI: 找不到”

    WMI 控件(本地)属性窗口的屏幕截图,其中显示了“找不到 WMI”错误。

  • 无法连接到 <本地计算机> ,因为“Win32:系统找不到指定的路径”。

    显示系统找不到指定路径错误的 WMI 控件(本地)属性窗口的屏幕截图。

  • 由于“WMI: 泛型失败”,无法连接到<本地计算机>

    显示 WMI 泛型失败错误的 WMI 控件(本地)属性窗口的屏幕截图。

如果 WMI 存储库中存在任何故障,或者存在任何损坏,则有时可能会导致此类错误。

可以在提升的命令提示符窗口中使用以下命令对实时或当前使用的 WMI 存储库执行一致性检查。

winmgmt /verifyrepository

还可以使用 /verifyrepository <path>. 运行此命令。 指定 path 参数时,可以验证存储库的任何已保存副本。

在这种情况下,path 参数应包含保存的存储库副本的完整路径。 保存的存储库应该是整个存储库文件夹的副本。

以下过程介绍如何重新编译 WMI 提供程序 MOF 文件并重新注册 WMI 提供程序 DLL。 这包括所有内置提供程序以及放置在默认路径中的提供程序。 在提升的命令提示符窗口中运行以下命令。

注意

以下步骤涉及重启 WMI 服务。

  1. 停止 WMI 服务并将其设置为 disabled

    sc config winmgmt start= disabled
    net stop winmgmt /y
    
  2. 导航到 WBEM 文件夹:

    %systemdrive%
    cd %windir%\system32\wbem
    
  3. 重新注册 WMI 提供程序:

    for /f %s in ('dir /b *.dll') do regsvr32 /s %s
    
  4. 将 WMI 服务设置回 Auto 并启动服务:

    sc config winmgmt start= Auto
    net start winmgmt 
    
  5. 重新编译 MOF 文件:

    dir /b *.mof *.mfl | findstr /v /i uninstall > moflist.txt & for /F %s in (moflist.txt) do mofcomp %s 
    

注意

有多个外部博客和站点可以重置 WMI 存储库或重新生成 WMI 存储库。 这会在安装操作系统时将 WMI 存储库设置回其初始状态。 WMI 将丢失一段时间内收集有关系统本身、应用程序、服务和其他实体的所有信息。 因此,除非Microsoft支持执行 WMI 存储库,否则不建议重新生成 WMI 存储库。

网络级别的连接流

以下跟踪是使用两台计算机之间的网络监视器捕获的网络跟踪的输出,同时使用 WMIC.exe 执行 WMI 查询。

这有助于确定问题是否为网络连接问题。

  • 连接到目标计算机上的端口 135 上的终结点映射器:

    65        9:07:30 AM 3/21/2017        6.2302032        svchost.exe        10.0.0.6        10.0.0.22        TCP        TCP:Flags=......S., SrcPort=49229, DstPort=DCE endpoint resolution(135), PayloadLen=0, Seq=3759018265, Ack=0, Win=8192 ( Negotiating scale factor 0x8 ) = 8192        {TCP:8, IPv4:7}
    
  • 请求 IRemoteSCMActivator 的 RPC 接口 UUID:

    68        9:07:30 AM 3/21/2017        6.2366981        svchost.exe        10.0.0.6        10.0.0.22        MSRPC        MSRPC:c/o Bind: IRemoteSCMActivator(DCOM) UUID{000001A0-0000-0000-C000-000000000046}  Call=0x5  Assoc Grp=0x0  Xmit=0x16D0  Recv=0x16D0         {MSRPC:9, TCP:8, IPv4:7}
    
  • 连接到目标计算机的终结点映射器提供的其中一个动态端口:

    77        9:07:30 AM 3/21/2017        6.3539124        WMIC.exe        10.0.0.6        10.0.0.22        TCP        TCP:Flags=......S., SrcPort=49230, DstPort=49154, PayloadLen=0, Seq=2143969401, Ack=0, Win=8192 ( Negotiating scale factor 0x8 ) = 8192        {TCP:10, IPv4:7}
    
  • 连接到计算机“TargetMachine”的命名空间 Root\CIMV2

    96        9:07:30 AM 3/21/2017        6.4702188        WMIC.exe        10.0.0.6        10.0.0.22        WMI        WMI:IWbemLevel1Login:NTLMLogin Request, NetworkResource=\\TargetMachine\ROOT\CIMV2 PreferredLocale=ms_409,en-US,en Flags=0        {MSRPC:11, TCP:10, IPv4:7}
    
  • 查询执行:

    116        9:07:31 AM 3/21/2017        6.7577443        WMIC.exe        10.0.0.6        10.0.0.22        WMI        WMI:IWbemServices:ExecQuery Request, *Encrypted*        {MSRPC:11, TCP:10, IPv4:7}
    

数据收集

在打开支持案例以进一步调查问题之前,可以按照使用 TSS 收集信息中的 步骤收集用户体验问题来收集信息。 还可以通过在最近遇到此问题的计算机上使用 WMI-Collect 工具收集信息。 步骤如下:

注意

在重现问题时,可以在源计算机和目标计算机上执行以下步骤。

  1. 下载WMI-Collect.zip并将其解压缩到 C:\temp文件夹。

  2. 在提升的 PowerShell 命令提示符下,从保存脚本的文件夹运行 WMI-Collect.ps1 脚本。 例如:

        C:\temp\WMI-Collect.ps1 -Logs -Trace -Network
    
  3. 使用“按 Enter 停止捕获:”消息,使 PowerShell 命令提示符保持打开状态。

    注意

    不要使跟踪保持启用超过一分钟。

  4. Enter 停止跟踪。

  5. 该脚本创建一个子文件夹,其中包含所有跟踪和诊断信息的结果。 压缩文件夹。 创建支持案例后,可以将此文件上传到安全工作区进行分析。