主题
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 中的下列主题:
"About WMI:"
https://go.microsoft.com/fwlink/?LinkId=142212
"WMI Troubleshooting"
https://go.microsoft.com/fwlink/?LinkId=142213
此外,请参阅 Microsoft TechNet 脚本中心的“Secrets of Windows Management
Instrumentation – Troubleshooting and Tips”:
https://go.microsoft.com/fwlink/?LinkId=142214
另请参阅
联机版本:https://go.microsoft.com/fwlink/?LinkId=142219
Get-WmiObject
Invoke-WmiMethod
Register-WmiEvent
Remove-WmiObject
Set-WmiInstance