[玩转系统] 使用 WMI
作者:精品下载站 日期:2024-12-14 03:05:44 浏览:15 分类:玩电脑
使用 WMI
WMI 和 CIM
Windows PowerShell 默认附带 cmdlet,用于与 Windows Management Instrumentation (WMI) 等其他技术配合使用。 WMI cmdlet 已弃用,并且在 PowerShell 6+ 中不可用,但此处对其进行了介绍,因为您可能会在 Windows PowerShell 上运行的旧脚本中遇到它们。对于新开发,请改用 CIM cmdlet。
PowerShell 中存在多个本机 WMI cmdlet,无需安装任何其他软件或模块。 Get-Command
可用于确定 Windows PowerShell 中存在哪些 WMI cmdlet。以下结果来自我运行 PowerShell 版本 5.1 的 Windows 10 实验室环境计算机。您的结果可能会有所不同,具体取决于您运行的 PowerShell 版本。
Get-Command -Noun WMI*
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-WmiObject 3.1.0.0 Microsof...
Cmdlet Invoke-WmiMethod 3.1.0.0 Microsof...
Cmdlet Register-WmiEvent 3.1.0.0 Microsof...
Cmdlet Remove-WmiObject 3.1.0.0 Microsof...
Cmdlet Set-WmiInstance 3.1.0.0 Microsof...
PowerShell 3.0 版中引入了通用信息模型 (CIM) cmdlet。 CIM cmdlet 经过精心设计,可在 Windows 和非 Windows 计算机上使用。
CIM cmdlet 全部包含在一个模块内。要获取 CIM cmdlet 列表,请使用 Get-Command
和 Module 参数,如以下示例所示。
Get-Command -Module CimCmdlets
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Export-BinaryMiLog 1.0.0.0 CimCmdlets
Cmdlet Get-CimAssociatedInstance 1.0.0.0 CimCmdlets
Cmdlet Get-CimClass 1.0.0.0 CimCmdlets
Cmdlet Get-CimInstance 1.0.0.0 CimCmdlets
Cmdlet Get-CimSession 1.0.0.0 CimCmdlets
Cmdlet Import-BinaryMiLog 1.0.0.0 CimCmdlets
Cmdlet Invoke-CimMethod 1.0.0.0 CimCmdlets
Cmdlet New-CimInstance 1.0.0.0 CimCmdlets
Cmdlet New-CimSession 1.0.0.0 CimCmdlets
Cmdlet New-CimSessionOption 1.0.0.0 CimCmdlets
Cmdlet Register-CimIndicationEvent 1.0.0.0 CimCmdlets
Cmdlet Remove-CimInstance 1.0.0.0 CimCmdlets
Cmdlet Remove-CimSession 1.0.0.0 CimCmdlets
Cmdlet Set-CimInstance 1.0.0.0 CimCmdlets
CIM cmdlet 仍然允许您使用 WMI,因此当有人声明“当我使用 PowerShell CIM cmdlet 查询 WMI 时...”时,请不要感到困惑。
正如我之前提到的,WMI 是一项独立于 PowerShell 的技术,您只需使用 CIM cmdlet 来访问 WMI。您可能会发现旧的 VBScript 使用 WMI 查询语言 (WQL) 来查询 WMI,如下例所示。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\" & strComputer & "\root\cimv2")
Set colBIOS = objWMIService.ExecQuery _
("Select * from Win32_BIOS")
For each objBIOS in colBIOS
Wscript.Echo "Manufacturer: " & objBIOS.Manufacturer
Wscript.Echo "Name: " & objBIOS.Name
Wscript.Echo "Serial Number: " & objBIOS.SerialNumber
Wscript.Echo "SMBIOS Version: " & objBIOS.SMBIOSBIOSVersion
Wscript.Echo "Version: " & objBIOS.Version
Next
您可以从该 VBScript 获取 WQL 查询,并将其与 Get-CimInstance
cmdlet 一起使用,无需任何修改。
Get-CimInstance -Query 'Select * from Win32_BIOS'
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 3810-1995-1654-4615-2295-2755-89
Version : VRTUAL - 4001628
这不是我通常使用 PowerShell 查询 WMI 的方式。但它确实有效,并且允许您轻松地将现有 VBScript 迁移到 PowerShell。当我开始编写一行代码来查询 WMI 时,我使用以下语法。
Get-CimInstance -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 3810-1995-1654-4615-2295-2755-89
Version : VRTUAL - 4001628
如果我只需要序列号,我可以将输出通过管道传输到 Select-Object
并仅指定 SerialNumber 属性。
Get-CimInstance -ClassName Win32_BIOS | Select-Object -Property SerialNumber
SerialNumber
------------
3810-1995-1654-4615-2295-2755-89
默认情况下,有几个在幕后检索但从未使用过的属性。在本地计算机上查询 WMI 时可能没有多大关系。但是,一旦开始查询远程计算机,返回该信息不仅需要额外的处理时间,而且还需要通过网络获取额外的不必要的信息。 Get-CimInstance
有一个Property 参数,用于限制检索的信息。这使得对 WMI 的查询更加高效。
Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber |
Select-Object -Property SerialNumber
SerialNumber
------------
3810-1995-1654-4615-2295-2755-89
前面的结果返回一个对象。要返回简单字符串,请使用 ExpandProperty 参数。
Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber |
Select-Object -ExpandProperty SerialNumber
3810-1995-1654-4615-2295-2755-89
您还可以使用点式语法来返回一个简单的字符串。这消除了通过管道传输到Select-Object
的需要。
(Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber).SerialNumber
3810-1995-1654-4615-2295-2755-89
使用 CIM cmdlet 查询远程计算机
我仍在以域用户身份的本地管理员身份运行 PowerShell。当我尝试使用 Get-CimInstance
cmdlet 从远程计算机查询信息时,收到访问被拒绝的错误消息。
Get-CimInstance -ComputerName dc01 -ClassName Win32_BIOS
Get-CimInstance : Access is denied.
At line:1 char:1
+ Get-CimInstance -ComputerName dc01 -ClassName Win32_BIOS
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (root\cimv2:Win32_BIOS:String) [Get-CimI
nstance], CimException
+ FullyQualifiedErrorId : HRESULT 0x80070005,Microsoft.Management.Infrastructure.Cim
Cmdlets.GetCimInstanceCommand
+ PSComputerName : dc01
许多人在谈到 PowerShell 时都会担心安全问题,但事实是您在 PowerShell 中拥有与在 GUI 中完全相同的权限。不多也不少。上一个示例中的问题是运行 PowerShell 的用户无权从 DC01 服务器查询 WMI 信息。我可以以域管理员身份重新启动 PowerShell,因为 Get-CimInstance
没有 Credential 参数。但是,相信我,这不是一个好主意,因为这样我从 PowerShell 运行的任何内容都将以域管理员身份运行。从安全角度来看,这可能是危险的,具体取决于具体情况。
根据最小权限原则,我使用 Credential 参数(如果命令有的话)在每个命令的基础上提升到我的域管理员帐户。 Get-CimInstance
没有 Credential 参数,因此这种情况下的解决方案是首先创建一个 CimSession。然后我使用 CimSession 而不是计算机名称来查询远程计算机上的 WMI。
$CimSession = New-CimSession -ComputerName dc01 -Credential (Get-Credential)
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential
CIM 会话存储在名为 $CimSession
的变量中。请注意,我还在括号中指定了 Get-Credential
cmdlet,以便它首先执行,在创建新会话之前提示我输入备用凭据。我将在本章后面向您展示另一种更有效的方法来指定备用凭据,但在使其变得更加复杂之前理解这个基本概念非常重要。
现在可以将上一示例中创建的 CIM 会话与 Get-CimInstance
cmdlet 结合使用,从远程计算机上的 WMI 查询 BIOS 信息。
Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 0986-6980-3916-0512-6608-8243-13
Version : VRTUAL - 4001628
PSComputerName : dc01
使用 CIM 会话而不是仅仅指定计算机名称还有几个额外的好处。当对同一台计算机运行多个查询时,使用 CIM 会话比为每个查询使用计算机名称更有效。创建 CIM 会话仅设置一次连接。然后,多个查询使用同一会话来检索信息。使用计算机名称需要 cmdlet 建立和断开与每个单独查询的连接。
Get-CimInstance
cmdlet 默认使用 WSMan 协议,这意味着远程计算机需要 PowerShell 版本 3.0 或更高版本才能连接。实际上,PowerShell 版本并不重要,而是堆栈版本。可以使用 Test-WSMan
cmdlet 确定堆栈版本。它需要是3.0版本。这是您在 PowerShell 3.0 及更高版本中找到的版本。
Test-WSMan -ComputerName dc01
wsmid : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor : Microsoft Corporation
ProductVersion : OS: 0.0.0 SP: 0.0 Stack: 3.0
较旧的 WMI cmdlet 使用 DCOM 协议,该协议与旧版本的 Windows 兼容。但在较新版本的 Windows 上,DCOM 通常会被防火墙阻止。 New-CimSessionOption
cmdlet 允许您创建与 New-CimSession
一起使用的 DCOM 协议连接。这允许使用 Get-CimInstance
cmdlet 与 Windows Server 2000 等旧版本的 Windows 进行通信。这也意味着在使用 Get-CimInstance 时,远程计算机上不需要 PowerShell。带有配置为使用 DCOM 协议的 CimSession 的 CimInstance
cmdlet。
使用 New-CimSessionOption cmdlet 创建 DCOM 协议选项并将其存储在变量中。
$DCOM = New-CimSessionOption -Protocol Dcom
为了提高效率,您可以将域管理员或提升的凭据存储在变量中,这样您就不必为每个命令不断输入它们。
$Cred = Get-Credential
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential
我有一台名为 SQL03 的服务器,运行 Windows Server 2008(非 R2)。它是最新的 Windows Server 操作系统,默认情况下未安装 PowerShell。
使用 DCOM 协议创建 SQL03 的 CimSession。
$CimSession = New-CimSession -ComputerName sql03 -SessionOption $DCOM -Credential $Cred
请注意,在上一个命令中,这次我指定了名为 $Cred
的变量作为 Credential 参数的值,而不必再次手动输入它们。
无论使用何种底层协议,查询的输出都是相同的。
Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 7237-7483-8873-8926-7271-5004-86
Version : VRTUAL - 4001628
PSComputerName : sql03
Get-CimSession
cmdlet 用于查看当前连接的 CimSession 以及它们正在使用的协议。
Get-CimSession
Id : 1
Name : CimSession1
InstanceId : 80742787-e38e-41b1-a7d7-fa1369cf1402
ComputerName : dc01
Protocol : WSMAN
Id : 2
Name : CimSession2
InstanceId : 8fcabd81-43cf-4682-bd53-ccce1e24aecb
ComputerName : sql03
Protocol : DCOM
检索之前创建的两个 CimSession 并将其存储在名为 $CimSession
的变量中。
$CimSession = Get-CimSession
使用一个命令查询两台计算机,一台使用 WSMan 协议,另一台使用 DCOM。
Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 0986-6980-3916-0512-6608-8243-13
Version : VRTUAL - 4001628
PSComputerName : dc01
SMBIOSBIOSVersion : 090006
Manufacturer : American Megatrends Inc.
Name : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber : 7237-7483-8873-8926-7271-5004-86
Version : VRTUAL - 4001628
PSComputerName : sql03
我撰写了大量有关 WMI 和 CIM cmdlet 的博客文章。最有用的功能之一是我创建的一个函数,用于自动确定是否应使用 WSMan 或 DCOM,并自动设置 CIM 会话,而无需手动确定哪一个。该博客文章的标题为 PowerShell Function to Create CimSessions to Remote Computers with Fallback to Dcom。
完成 CIM 会话后,您应该使用 Remove-CimSession
cmdlet 删除它们。要删除所有 CIM 会话,只需通过管道将 Get-CimSession
传输到 Remove-CimSession
。
Get-CimSession | Remove-CimSession
概括
在本章中,您了解了如何使用 PowerShell 在本地和远程计算机上处理 WMI。您还了解了如何使用 CIM cmdlet 与采用 WSMan 或 DCOM 协议的远程计算机一起工作。
审查
- WMI 和 CIM cmdlet 有什么区别?
- 默认情况下,
Get-CimInstance
cmdlet 使用什么协议? - 使用 CIM 会话而不是使用
Get-CimInstance
指定计算机名称有哪些好处? - 如何指定与
Get-CimInstance
一起使用的默认协议以外的替代协议? - 如何关闭或删除 CIM 会话?
推荐阅读
- about_WMI
- about_WMI_Cmdlet
- 关于_WQL
- CimCmdlet 模块
- 视频:使用 CIM Cmdlet 和 CIM 会话
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag