主题 about_WMI_cmdlets 简短说明 提供有关 Windows Management Instrumentation (WMI) 和 Windows PowerShell 的背景信息。 详细说明 本主题提供有关以下内容的信息:WMI 技术、用于 Windows PowerShell 的 WMI cmdlet、基于 WMI 的远程处理、WMI 加速器和 WMI 故障诊断。本主题 还提供了有关 WMI 的详细信息的链接。 关于 WMI Windows Management Instrumentation (WMI) 是 Microsoft 对“基于 Web 的企业管理”(WBEM) 的实现,WBEM 是一项业界倡议,用于为访问企业环境中的管 理信息开发一项标准技术。WMI 使用通用信息模型 (CIM) 行业标准来表示系统、 应用程序、网络、设备和其他托管组件。CIM 由分布式管理任务组 (DMTF) 进行开 发和维护。可以使用 WMI 来管理本地和远程计算机。例如,可以使用 WMI 执行以 下任务: -- 在远程计算机上启动进程。 -- 远程重新启动计算机。 -- 获取在本地或远程计算机上安装的应用程序的列表。 -- 查询本地或远程计算机上的 Windows 事件日志。 适用于 Windows PowerShell 的 WMI Cmdlet Windows PowerShell 通过一组在 Windows PowerShell 中默认可用的 cmdlet 实现 WMI 功能。可以使用这些 cmdlet 来完成管理本地和远程计算机所必需的 端到端任务。 其中包括以下 WMI cmdlet。 Cmdlet 说明 ------------------ ---------------------------------------------- Get-WmiObject 获取 WMI 类的实例或有关这些可用类的信息。 Invoke-WmiMethod 调用 WMI 方法。 Register-WmiEvent 订阅 WMI 事件。 Remove-WmiObject 删除 WMI 类和实例。 Set-WmiInstance 创建或修改 WMI 类的实例。 示例命令 下面的命令显示本地计算机的 BIOS 信息。 C:\PS> get-wmiobject win32_bios | format-list * 下面的命令显示有关三台远程计算机的 WinRM 服务的信息。 C:\PS> get-wmiobject -query "select * from win32_service where name='WinRM'" -computername server01, server01, server03 下面的命令更加复杂,它将退出某个程序的所有实例。 C:\PS> notepad.exe C:\PS> $np = get-wmiobject -query "select * from win32_process where name='notepad.exe'" C:\PS> $np | remove-wmiobject 基于 WMI 的远程处理 虽然通过 WMI 管理本地系统的功能非常有用,但是真正使 WMI 成为强大管理 工具的功能却是远程处理功能。WMI 使用 Microsoft 的分布式组件对象 模型 (DCOM) 来连接并管理系统。某些系统可能必须经过配置才允许 DCOM 连接。 防火墙设置和锁定的 DCOM 权限可能阻止 WMI 远程管理系统的能力。 WMI 类型加速器 Windows PowerShell 包含 WMI 类型加速器。这些 WMI 类型 加速器(快捷方式)与非类型加速器方式相比,可更直接地 访问 WMI 对象。 对于 WMI,支持下面的类型加速器: [WMISEARCHER] - 搜索 WMI 对象的快捷方式。 [WMICLASS] - 访问类的静态属性和方法的快捷方式。 [WMI] - 获取类的单个实例的快捷方式。 [WMISEARCHER] 是 ManagementObjectSearcher 的类型加速器。 它可接受一个字符串构造函数来创建搜索器,然后可以基于该搜索器执行 GET()。 例如: PS> $s = [WmiSearcher]'Select * from Win32_Process where Handlecount > 1000' PS> $s.Get() |sort handlecount |ft handlecount,__path,name -auto handlecount __PATH name ----------- ------ ---- 1105 \\SERVER01\root\cimv2:Win32_Process.Handle="3724" powershell... 1132 \\SERVER01\root\cimv2:Win32_Process.Handle="1388" winlogon.exe 1495 \\SERVER01\root\cimv2:Win32_Process.Handle="2852" iexplore.exe 1699 \\SERVER01\root\cimv2:Win32_Process.Handle="1204" OUTLOOK.EXE 1719 \\SERVER01\root\cimv2:Win32_Process.Handle="1912" iexplore.exe 2579 \\SERVER01\root\cimv2:Win32_Process.Handle="1768" svchost.exe [WMICLASS] 是 ManagementClass 的类型加速器。它有一个 字符串构造函数,该构造函数接受 WMI 类的本地或绝对 WMI 路径, 并返回绑定到该类的对象。 例如: PS> $c = [WMICLASS]"root\cimv2:WIn32_Process" PS> $c |fl * Name : Win32_Process __GENUS : 1 __CLASS : Win32_Process __SUPERCLASS : CIM_Process __DYNASTY : CIM_ManagedSystemElement __RELPATH : Win32_Process __PROPERTY_COUNT : 45 __DERIVATION : {CIM_Process, CIM_LogicalElement, CIM_ManagedSystemElement} __SERVER : SERVER01 __NAMESPACE : ROOT\cimv2 __PATH : \\SERVER01\ROOT\cimv2:Win32_Process [WMI] 是 ManagementObject 的类型加速器。它有一个字符串构造函数, 该构造函数接受 WMI 实例的本地或绝对 WMI 路径,并返回绑定到该 实例的对象。 例如: PS> $p = [WMI]'\\SERVER01\root\cimv2:Win32_Process.Handle="1204"' PS> $p.Name OUTLOOK.EXE WMI 故障诊断 下面的问题是在您尝试连接到远程计算机时可能出现的最常见问题。 问题 1:远程计算机未联机。 如果计算机脱机,您将无法使用 WMI 连接该计算机。您可能收到以下 错误消息: "远程服务器计算机不存在或不可用" 如果收到此错误消息,请验证该计算机是否联机。 尝试对远程计算机执行 ping 操作。 问题 2:您没有远程计算机上的本地管理员权限。 为了远程使用 WMI,您必须有远程计算机上的本地管理员权限。如果没有, 则将拒绝访问该计算机。 验证命名空间安全性: a. 单击"开始",右键单击"我的电脑",然后单击"管理"。 b. 在"计算机管理"中,展开"服务和应用程序",右键单击"WMI 控件", 然后单击"属性"。 c. 在"WMI 控件属性"对话框中,单击"安全"选项卡。 问题 3:防火墙阻止访问远程计算机。 WMI 使用 DCOM(分布式 COM)和 RPC(远程过程调用)协议来遍历网络。 默认情况下,很多防火墙会阻止 DCOM 和 RPC 通信。 如果防火墙阻止这些协议,那么连接将失败。例如,Microsoft Windows XP Service Pack 2 中的 Windows 防火墙配置为自动阻止所有未经请求的 网络通信,包括 DCOM 和 WMI。在其默认配置中,Windows 防火墙拒绝 传入的 WMI 请求,并且您将收到以下错误消息: “远程服务器计算机不存在或不可用” 有关 WMI 的详细信息 有关 WMI 的详细信息,请参阅 MSDN (Microsoft Developer Network) Library 中的下列主题: "关于 WMI:" https://go.microsoft.com/fwlink/?LinkId=142212 "WMI 故障诊断" https://go.microsoft.com/fwlink/?LinkId=142213 此外,请参阅 Microsoft TechNet 脚本中心的"Windows Management Instrumentation的秘密 - 疑难解答和提示": https://go.microsoft.com/fwlink/?LinkId=142214 另请参阅 联机版本:https://go.microsoft.com/fwlink/?LinkId=142219 Get-WmiObject Invoke-WmiMethod Register-WmiEvent Remove-WmiObject Set-WmiInstance