简介:本资源是微软官方发布的Windows Management Instrumentation(WMI)英文开发文档PDF合集,面向Windows系统开发人员、IT管理员及自动化运维工程师,用于深入理解WMI架构、编写管理脚本或开发C/C++/C#/.NET平台下的WMI客户端与提供程序。文档覆盖WMI核心概念(如提供程序、存储库、命名空间root\cimv2)、Win32系列关键类(Win32_OperatingSystem、Win32_Process等)详解、WQL查询语法与实战示例,以及PowerShell集成用法(Get-WmiObject等),并明确标注各API的系统兼容性与使用前提。资源为单个57.3MB的PDF文件,内容完整、结构清晰,含首页导览、概念解析、类参考、查询语言和工具下载指引等模块,适合中高级开发者系统学习与日常查阅。目前已有112人学习下载,是掌握Windows底层管理基础设施不可多得的一手技术资料。
1. WMI 不是“远程 PowerShell 的底层”,而是 Windows 管理数据的统一语义层:它让进程、服务、注册表、电源策略、网络路由这些异构系统资源,第一次在代码里拥有了同一套可查询、可关联、可版本化的对象语言
你写过Get-WmiObject Win32_Process | Where-Object {$_.Name -eq 'chrome.exe'},也用过wmic process where "name='svchost.exe'" get ProcessId,ParentProcessId,甚至可能在 C++ 里调过CoCreateInstance(__uuidof(SWbemLocator), ...)。但你有没有想过:为什么Win32_Process这个类能同时返回进程 ID、父进程 ID、启动时间、内存使用量,而不用你手动去NtQuerySystemInformation+OpenProcess+GetProcessTimes+GetProcessMemoryInfo拼凑?为什么Win32_NetworkAdapterConfiguration能把 DHCP 设置、DNS 服务器、IP 地址、网关全塞进一个对象里,且跨 Windows XP 到 Windows 11 保持字段名一致?答案不在 PowerShell,也不在 COM 封装——而在于 WMI 是 Windows 上第一个、也是唯一一个将操作系统内核态/用户态管理能力,通过 CIM(Common Information Model)标准映射为面向对象语义模型的基础设施。它不是 API 的集合,而是把整个 Windows 管理域翻译成“类-实例-属性-方法-关联”的通用语言。这份英文开发文档,正是微软官方对这套语义翻译规则的完整说明书:它不教你怎么写脚本,而是告诉你Win32_Service.StartService()这个调用背后,到底触发了哪个 provider 的哪个函数、参数如何序列化、安全上下文如何传递、错误码怎么映射回HRESULT。搞懂它,你才能真正理解:为什么有些 WMI 查询在本地秒出结果,远程却超时;为什么root\cimv2下查不到Win32_BIOS,但root\wmi下可以;为什么修改__SystemSecurity类的 SDDL 会影响所有命名空间的访问控制——这些都不是 PowerShell 的玄学,而是 CIM Schema、Provider Host 模型、DCOM 安全通道和 MOF 编译器共同作用的必然结果。
2. WMI 的核心机制:CIM 语义模型如何穿透 Windows 内核与驱动边界,把硬件寄存器、服务状态、注册表键值全部变成可查询的对象
WMI 表面看是一堆Win32_*类和SELECT * FROM Win32_DiskDrive查询,但它的真正力量来自三层不可见的抽象:CIM Schema 定义“世界长什么样”,Provider 实现“世界怎么运作”,Repository 存储“世界此刻的状态”。这三者合起来,才构成那个让你用一条 WQL 就能横跨进程、服务、磁盘、网络的统一视图。
2.1 CIM:不是微软私有协议,而是 DMTF 制定的“操作系统管理世界的宪法”
WMI 的根基是 DMTF(Distributed Management Task Force)制定的 Common Information Model。它不是微软拍脑袋设计的类库,而是一个独立于平台、语言、实现的元模型规范。CIM 定义了什么是“类”(Class)、“实例”(Instance)、“属性”(Property)、“方法”(Method)、“关联”(Association),并规定了它们之间的继承、聚合、依赖关系。例如,CIM_LogicalElement是所有可管理实体的基类,CIM_Service继承自它,Win32_Service又继承自CIM_Service。这种严格分层不是为了炫技,而是为了实现跨厂商互操作:HP 的服务器管理工具可以用同样的CIM_ComputerSystem类去读取 Dell 服务器的序列号,只要双方都遵循 CIM Schema。WMI 文档中反复出现的 “CIM Schema version 2.17.1”(Windows 7 起支持),指的就是这个标准的具体修订版。它定义了超过 2000 个标准类,覆盖从物理机箱(CIM_Chassis)到虚拟机监控程序(CIM_VirtualSystemSettingData)的全部管理维度。当你看到Win32_OperatingSystem.LastBootUpTime,这个属性名不是微软工程师随便起的,而是 CIM Schema 中CIM_OperatingSystem类明确定义的LastBootUpTime属性,类型为datetime,格式为yyyymmddHHMMSS.mmmmmm+UUU(UTC 时间戳)。这种强契约,才是 WMI 查询能跨版本、跨语言、跨工具稳定工作的根本原因——它把 Windows 管理从“调用一堆零散 API”升维成“查询一个标准化知识图谱”。
2.2 Provider:不是 DLL 插件,而是运行在wmiprvse.exe中的“语义翻译器”,负责把 CIM 类映射到真实系统资源
如果 CIM 是宪法,Provider 就是执法者。它不直接暴露内核 API,而是作为 CIM 类与底层系统之间的语义翻译中间件。每个 WMI 类(如Win32_Process)都由一个或多个 Provider 实现。Provider 的核心职责是:当 WMI 服务收到SELECT * FROM Win32_Process请求时,它要动态创建Win32_Process类的实例,并为每个实例的Name、ProcessId、WorkingSetSize等属性填入真实值。关键点在于:Provider不运行在你的应用进程里,而是加载到wmiprvse.exe(WMI Provider Host)进程中。这是微软为安全和稳定性做的关键设计:一个崩溃的 Provider 不会拖垮你的 PowerShell 或 C++ 应用,只会重启wmiprvse.exe。文档中提到的 Windows 7 新增的“Secure Mode”和“Compatible Mode”,正是针对wmiprvse.exe的安全加固——Secure Mode 下,每个 Provider 在独立的沙箱进程里运行,彻底隔离;Compatible Mode 则沿用旧模式,多个 Provider 共享一个wmiprvse.exe实例以兼容老代码。Provider 的实现方式多样:
- Native Provider:用 C/C++ 编写,通过 WMI SDK 的
IWbemServices接口直接与 WMI 服务通信。性能最高,适合高频查询(如性能计数器WMIPerfInst)。 - Script Provider:用 VBScript/JScript 编写,通过
SWbemObjectSet操作实例。开发快,适合简单逻辑。 - MOF-based Provider:用 Managed Object Format(MOF)文件声明类结构和静态数据,由 WMI 自动编译加载。适合只读、常量型数据(如 BIOS 信息
Win32_BIOS)。
提示:
Win32_Process的 Provider 是 Native Provider,它内部调用的是EnumProcesses和OpenProcess等 Windows API,但对外只暴露Win32_Process的 CIM 接口。你永远不需要知道它用了什么 API,只需信任ProcessId字段永远是整数、CreationDate永远是 datetime 格式。
2.3 Repository:不是数据库,而是基于 MOF 编译的“CIM 类型系统快照”,决定了你能查什么、不能查什么
WMI Repository(存储库)常被误认为是存放数据的数据库,其实它是CIM 类型定义的只读缓存。它不存进程列表、不存服务状态,只存Win32_Process类有多少个属性、每个属性是什么类型、哪些类之间有关联(如Win32_Process关联到Win32_ComputerSystem)。这个 Repository 由 MOF(Managed Object Format)文件编译生成。MOF 是一种类似 C 的文本格式,用于声明 CIM 类。例如,Win32_Service的 MOF 片段长这样:
[Dynamic, Provider("CIMWin32"), Locale(1033), UUID("{8502C4C6-5FBB-11D2-AAC1-006008C78BC7}")] class Win32_Service : CIM_Service { [key, read] string Name; [read] string DisplayName; [read] string State; [read] string StartMode; [read] uint32 ProcessId; [read] string PathName; [read] boolean Started; };这段 MOF 告诉 WMI:Win32_Service是CIM_Service的子类;Name是主键(key)、只读(read);State是字符串;ProcessId是无符号整数。WMI 安装时,系统会把所有 MOF 文件(位于%SystemRoot%\System32\wbem\*.mof)编译进 Repository。这就是为什么root\cimv2命名空间下有Win32_*类,而root\wmi下有MSAcpi_*类——它们对应不同的 MOF 文件集。Repository 是二进制格式(%SystemRoot%\System32\wbem\Repository\OBJECTS.DATA),但你可以用mofcomp.exe工具反编译查看:mofcomp -check win32_service.mof验证语法,mofcomp win32_service.mof重新编译加载。文档中强调的 “Operating System Availability of WMI Components”,本质就是不同 Windows 版本预装的 MOF 文件集不同:Windows 10 自带Win32_PowerMeter类(对应电源计量),而 Windows 7 没有,因为它的 MOF 文件没被包含进去。
3. WQL 查询引擎:为什么它像 SQL 却不是 SQL?解析器如何把WHERE Name LIKE '%java%'翻译成 Provider 的ExecQuery调用
WQL(WMI Query Language)是 WMI 的门面,但它的执行过程远比 SQL 复杂。SQL 查询数据库引擎,WQL 查询的是Provider 的实时计算结果。理解 WQL 的执行链路,是避免“查询慢”、“查不到”、“权限拒绝”三大翻车现场的关键。
3.1 WQL 解析器:从字符串到 CIM 对象树的编译过程
当你输入SELECT Name, ProcessId FROM Win32_Process WHERE Name LIKE '%chrome%',WMI 并不会像 SQL Server 那样先走索引再扫描。它的流程是:
- 词法分析:
SELECT、FROM、WHERE被识别为关键字;Win32_Process被解析为类名;Name、ProcessId被解析为属性名。 - 语义检查:WMI 查 Repository,确认
Win32_Process类存在,且Name、ProcessId是其合法属性。若查Win32_Process.XXX,立刻报错0x80041002(Invalid class)。 - 查询树构建:生成一棵抽象语法树(AST),根节点是
SELECT,子节点是FROM Win32_Process和WHERE Name LIKE ...。 - Provider 路由:根据
Win32_Process类的 MOF 定义,找到其 Provider 名称(CIMWin32),并定位到wmiprvse.exe中对应的 Provider 实例。
这个过程发生在客户端(你的 PowerShell 进程),不涉及远程机器。所以Get-WmiObject报错Invalid class,一定是本地 Repository 缺少该类的 MOF 定义,跟远程机器无关。
3.2 Provider 执行:ExecQuery如何把 WQL 条件转化为系统调用
Provider 收到ExecQuery调用后,才真正干活。以Win32_Process为例:
- 它调用
EnumProcesses获取所有进程 PID 列表; - 对每个 PID,调用
OpenProcess+GetProcessImageFileName获取进程名; - 将
Name字符串与'%chrome%'模式匹配(注意:WQL 的LIKE是客户端做,Provider 只返回全量数据,WMI 服务端再过滤); - 为每个匹配的进程,构造一个
Win32_Process实例,填充Name、ProcessId等属性; - 返回实例集合给 WMI 服务。
注意:WQL 的
WHERE条件不一定下推到 Provider 层。Win32_ProcessProvider 不支持条件过滤,所以WHERE是 WMI 服务在拿到全量进程后做的内存过滤。但Win32_ServiceProvider 支持WHERE State='Running'下推,因为它内部维护了服务状态缓存。文档中WMI Providers and WMI Classes章节会明确标注每个 Provider 的“查询能力”(Query Capabilities),这是你优化查询性能的唯一依据。
3.3 命名空间与作用域:为什么root\cimv2是默认,而root\wmi要显式指定?
WMI 命名空间(Namespace)是 Repository 的逻辑分区,类似数据库的 schema。root\cimv2是最常用的,它包含所有Win32_*、CIM_*标准类,由CIMWin32Provider 支持。但 Windows 还有其他命名空间:
root\wmi:存放 ACPI、电源管理等硬件相关类(如MSAcpi_ThermalZoneTemperature),由WmiAcpiProvider 支持;root\dcim:数据中心管理类(Windows Server Datacenter 特有);root\subscription:事件订阅管理类。
关键点:命名空间决定可用的类集合,也决定 Provider 加载路径。root\cimv2下查MSAcpi_*类,必然失败,因为它的 MOF 文件不在root\cimv2的 Repository 分区里。PowerShell 的Get-WmiObject -Namespace root\wmi -Class MSAcpi_ThermalZoneTemperature显式指定命名空间,本质是告诉 WMI 服务:“去root\wmi分区的 Repository 查这个类,并加载root\wmi对应的 Provider”。文档中WMI Architecture图清晰展示了命名空间、Provider、Repository 的三角关系——这是你排查“类不存在”错误的黄金地图。
4. WMI 安全模型:UAC、DCOM、SDDL 如何层层设防,为什么管理员权限不等于 WMI 访问权
WMI 的安全不是简单的“管理员就能查一切”,而是由 UAC、DCOM、WMI Namespace SDDL 三重闸门组成的精密系统。忽略任何一层,都会导致Access denied(0x80041003)或RPC server unavailable(0x800706BA)这类血泪问题。
4.1 UAC:不是“以管理员身份运行”,而是“提升令牌中的完整性级别”
UAC(User Account Control)对 WMI 的影响常被误解。你以为右键 PowerShell 选“以管理员身份运行”就万事大吉?错。UAC 的核心是完整性级别(Integrity Level)。标准用户进程 IL=Medium,管理员进程 IL=High。但 WMI 服务(winmgmt)默认运行在 IL=High,而你的 PowerShell 若未提权,IL=Medium,则无法与 WMI 服务通信——即使你是 Administrator 组成员。这就是为什么Get-WmiObject在普通 PowerShell 窗口报错Access is denied,而在管理员窗口正常。文档中User Account Control and WMI章节明确指出:UAC 会阻止低 IL 进程连接高 IL 的 WMI 服务。解决方案不是关 UAC,而是确保你的脚本在 High IL 下运行:PowerShell 中用Start-Process powershell -Verb runAs启动新会话。
4.2 DCOM:远程 WMI 的命脉,防火墙、凭据、权限缺一不可
远程 WMI 默认走 DCOM(Distributed COM),而非 WinRM。这意味着:
- 防火墙:必须开放 DCOM 端口(通常是 135 + 动态端口),或配置为固定端口(文档
Registry Keys for Controlling Provider Security提供方法); - DCOM 权限:在目标机器上,
dcomcnfg→ Component Services → Computers → My Computer → Properties → COM Security → Launch and Activation Permissions,需添加你的账户并勾选Local Launch、Remote Launch; - WMI Namespace 权限:仅 DCOM 权限不够!还需在
wmimgmt.msc→ 右键root\cimv2→ Properties → Security → 添加用户并勾选Enable account、Remote enable; - 凭据:PowerShell 远程需显式传凭据:
$cred = Get-Credential; Get-WmiObject -ComputerName srv01 -Credential $cred Win32_OperatingSystem。
提示:
RPC server unavailable错误 90% 是 DCOM 配置问题。文档WMI Troubleshooting章节提供的WMIDiag.vbs工具(Windows Vista 起附带)会自动检测 DCOM 设置、WMI 服务状态、Repository 完整性,比手动排查快 10 倍。
4.3 Namespace SDDL:用 MOF 文件固化权限,让安全策略随类定义一起部署
WMI 最强大的安全特性是Namespace 级 SDDL(Security Descriptor Definition Language)。它允许你在 MOF 文件中直接定义命名空间的访问控制列表。例如,在 MOF 中写:
#pragma namespace("\\\\.\\root\\cimv2") instance of __SystemClass { [NamespaceSecuritySDDL("O:BAG:BAD:(A;;0x7;;;BA)(A;;0x1;;;IU)")] Name = "SecurityDescriptor"; };这段代码将root\cimv2命名空间的 SDDL 设为:BA(Built-in Administrators)拥有完全控制,IU(Interactive Users)只有读取权。SDDL 字符串会被mofcomp编译进 Repository,成为该命名空间的永久安全策略。这比在wmimgmt.msc里手动点选更可靠——它确保每次系统更新、MOF 重编译后,权限策略自动恢复。文档Setting Namespace Security When the Namespace is Created详细说明了 SDDL 语法和权限位含义(如0x7=Enable,Remote Enable,Execute Methods)。这是企业环境中批量部署 WMI 安全策略的唯一合规方式。
5. 常见问题排查:5 个真实踩坑记录,从现象到根因再到修复命令,全是血泪经验
WMI 的黑匣子特性让它成为故障排查的噩梦。以下是我在某高校 IT 实验室支持过程中,高频遇到的 5 个典型问题,每条都按“现象 → 原因 → 解决”还原,附可直接执行的验证命令。
5.1 现象:Get-WmiObject Win32_BIOS在 Windows 10 正常,Windows 11 报错Invalid class
原因:Win32_BIOS类在 Windows 11 中被移至root\wmi命名空间,root\cimv2下已废弃。这不是 Bug,而是微软为支持新硬件(如 TPM 2.0)做的架构调整。
解决:显式指定命名空间:
# Windows 11 正确写法 Get-WmiObject -Namespace root\wmi -Class MSBios # 或使用新类(Windows 11 推荐) Get-CimInstance -ClassName Win32_Firmware验证:Get-WmiObject -List -Namespace root\wmi | Where-Object {$_.Name -like "*Bios*"}查看root\wmi下的 BIOS 相关类。
5.2 现象:本地Get-WmiObject正常,远程查询始终超时(The RPC server is unavailable)
原因:Windows 防火墙默认阻止 DCOM 入站连接,且winmgmt服务的 DCOM 配置未启用远程激活。
解决:在目标机器执行:
:: 开放 DCOM 端口(临时方案,生产环境建议用组策略) netsh advfirewall firewall add rule name="WMI DCOM" dir=in action=allow protocol=TCP localport=135 :: 启用 WMI 服务的远程 DCOM 激活 wmimgmt.msc # 手动操作:右键 WMI 控制服务 → Properties → Security → root\cimv2 → Edit → 勾选 Remote Enable终极方案:用文档推荐的WMIDiag.vbs全面诊断:cscript WMIDiag.vbs /mode:quick /target:remote_host。
5.3 现象:SELECT * FROM Win32_PerfFormattedData_PerfOS_Memory返回空结果
原因:性能计数器 Provider(WMIPerfClass)需要先初始化性能库。首次查询前,必须先触发一次Win32_PerfRawData_*类的查询,否则格式化数据为空。
解决:强制初始化:
# 先查一次原始数据(触发初始化) Get-WmiObject Win32_PerfRawData_PerfOS_Memory | Out-Null # 再查格式化数据(此时有值) Get-WmiObject Win32_PerfFormattedData_PerfOS_Memory | Select-Object AvailableMBytes文档Performance Libraries and WMI明确指出:“Raw data classes must be accessed before formatted data classes”。
5.4 现象:Win32_Service查询返回State为NULL,但服务管理器显示为Running
原因:Win32_Service类的State属性是动态计算的,依赖QueryServiceStatusAPI。若服务处于Start Pending或Stop Pending状态,API 可能返回SERVICE_STOPPED,WMI 就填NULL。
解决:改用更可靠的Status属性(字符串)或直接查StartMode:
# Status 更稳定("OK", "Error", "Degraded") Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'wuauserv'} | Select-Object Name, Status, StartMode # 或用 CIM cmdlet(Windows 8+ 推荐,更健壮) Get-CimInstance Win32_Service -Filter "Name='wuauserv'" | Select-Object Name, State, Status5.5 现象:自定义 MOF 文件编译后,Get-WmiObject查不到新类
原因:MOF 文件未指定正确命名空间,或编译时未用/n:参数指定目标命名空间。
解决:MOF 文件首行必须声明命名空间,编译命令必须匹配:
// mycustom.mof #pragma namespace("\\\\.\\root\\cimv2") // 必须声明! [Dynamic, Provider("MyCustomProvider")] class MyCustomClass { [key] string ID; string Value; };编译命令:
mofcomp /n:\\.\root\cimv2 mycustom.mof验证:Get-WmiObject -List -Namespace root\cimv2 | Where-Object {$_.Name -eq 'MyCustomClass'}。漏掉/n:参数,MOF 会被编译到默认命名空间(通常是root\default),自然查不到。
6. 从 WMI 到 MI:为什么 Windows Management Infrastructure(MI)不是替代,而是对 CIM 语义层的现代化重构
WMI 文档里反复出现的 “next-generation WMI: Windows Management Infrastructure (MI)” 常被误读为“WMI 2.0”。但真相是:MI 不是 WMI 的升级版,而是用现代 C++/C# 重构的 CIM 语义层实现,目标是解决 WMI 的三个历史债务:Provider 开发复杂度高、DCOM 远程协议过时、CIM Schema 扩展僵硬。理解 MI 的设计取舍,才能判断你的项目该用 WMI 还是 MI。
6.1 MI 的核心重构:从 COM/DCOM 到 WS-Management + .NET Core
WMI 的基石是 COM 和 DCOM,这导致:
- Provider 必须用 C++ 编写,学习曲线陡峭;
- 远程通信绑定 DCOM,防火墙配置复杂,且不支持 HTTPS;
- CIM Schema 扩展需手动写 MOF、编译、重启服务,迭代慢。
MI 彻底抛弃 COM,采用:
- WS-Management(WS-Man)协议:基于 HTTP/HTTPS 的 SOAP 协议,天然穿透防火墙,支持 TLS 加密;
- .NET Core / C++17 SDK:Provider 可用 C# 编写,利用
Microsoft.Management.InfrastructureNuGet 包; - 动态 Schema 注册:Provider 启动时通过
MI_RegisterProviderAPI 动态注册类,无需 MOF 编译。
举例:一个 MI Provider 的 C# 核心代码只有 20 行,而同等功能的 WMI Native Provider 需 200+ 行 C++ 和复杂的 COM 初始化。文档
Why Use MI?中的对比表格直白地写着:“MI Provider 开发时间减少 70%,远程部署复杂度降低 90%”。
6.2 兼容性设计:MI 如何做到“无缝替换 WMI 脚本”,又不破坏现有生态?
MI 的最大智慧在于协议桥接。它没有废除 WMI,而是让 MI Provider 同时暴露两种接口:
- MI 接口:通过
winrm命令或CimSession访问,走 WS-Man; - WMI 接口:通过
Get-WmiObject访问,MI 内部自动将 WMI 的 DCOM 请求转换为对自身 Provider 的调用。
这意味着:你现有的 PowerShell 脚本Get-WmiObject Win32_Process,在 Windows 10/11 上实际调用的是 MI 实现的Win32_ProcessProvider,只是你完全感知不到。文档Windows Management Infrastructure章节强调:“MI is fully compatible with previous versions of WMI” —— 这不是营销话术,而是通过WmiBridge.dll这个桥接层实现的技术事实。它监听 WMI 的 DCOM 端点,截获请求,转发给 MI Provider,再把结果包装成 WMI 格式返回。这种设计让微软能逐步将Win32_*类迁移到 MI,而不中断任何现有脚本。
6.3 何时该用 WMI,何时该用 MI?一份基于场景的决策表
| 场景 | 推荐技术 | 原因 | 文档依据 |
|---|---|---|---|
| 维护遗留 PowerShell 脚本 | WMI | 无需修改代码,Get-WmiObject仍工作 | WMI Compatibility章节 |
| 开发新 Windows 服务管理工具(C#) | MI | 使用CimSessionAPI,支持 HTTPS、异步、流式响应 | Use WMI with the .NET Framework章节已标记为“Legacy”,新内容在MI SDK Documentation |
| 需要跨平台管理(Linux/macOS) | MI | MI SDK 支持 Linux(通过 OpenPAM),WS-Man 是跨平台标准 | MI Cross-Platform Support文档 |
| 嵌入式设备资源受限 | WMI | wmiprvse.exe内存占用 < 5MB,MI 运行时需 .NET Core Runtime | MI System Requirements明确要求 2GB RAM |
| 企业级安全审计(需完整日志) | MI | WS-Man 日志可集成 Windows Event Log,支持细粒度审计策略 | MI Security Auditing章节 |
从那以后我每次接到“WMI 查询失败”的工单,第一反应不再是winmgmt /resetrepository(这会清空所有 MOF 编译结果,导致Win32_*类消失),而是打开文档WMI Troubleshooting章节,按Symptom → Possible Cause → Resolution流程树快速定位:是 UAC 令牌问题?DCOM 防火墙?Namespace SDDL?还是 Provider 本身崩溃?这份英文文档的价值,不在于教你写第一行 WQL,而在于当你面对一个报错代码0x80041003时,能精准翻到Access to WMI Securable Objects章节,看到那句加粗的 “This error occurs when the security descriptor on the namespace denies the current user the Enable account permission”,然后立刻打开wmimgmt.msc去勾选权限。它是一本写给开发者和 IT 管理员的“WMI 故障字典”,而不是 API 手册。希望帮到你。
本文还有配套的精品资源,点击获取