WMI一

本文详细介绍了WMI(Windows Management Instrumentation)作为Windows2K/XP管理系统的内核,如何简化了工具软件和脚本程序访问操作系统不同部分的过程。通过解析WMI中的对象、属性、类、命名空间、集合等概念,并提供了使用WMI的基本步骤及连接命名空间的方法,旨在帮助读者更好地理解和应用WMI进行系统管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是WMI

WMI是Windows 2K/XP管理系统的核心;对于其他的Win32操作系统,WMI是一个有用的插件。有了WMI,工具软件和脚本程序访问操作系统的不同部分时不需要使用不同的API;相反,操作系统的不同部分都可以插入WMI

也就是说,利用WMI我们能更方便地管理 Windows 资源 — 例如磁盘、事件日志、文件、文件夹、文件系统、网络组件、操作系统设置、性能数据、打印机、进程、注册表设置、安全性、服务、共享、用户、组等等。。

二、对WMI中一些名词的解释

首先看到下面的一个例子,这段代码能够输出物理内存的大小(不是用已有的函数):

$strComputer = "."
$wbemServices = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")
$wbemObjectSet= $wbemServices.InstancesOf("Win32_LogicalMemoryConfiguration")
For $wbemObject In $wbemObjectSet ConsoleWrite("Total Physical Memory (kb): " & $wbemObject.TotalPhysicalMemory) Next

在对代码解释前,我先解释一下一些名词的含义:

对象:所谓对象,就是建立COM组件时的返回值,像$wbemServices就是,我们称之为SwbemServicesWMI服务对象,至于$wbemObjectSet则叫做SwbemObject类实例集合对象,后文我还会提到SwbemLocator教本库对象。它们的层级关系如下:SwbemLocator教本库对象→SwbemServicesWMI服务对象→SwbemObject类实例集合对象→SwbemObject类的实例。

属性:以$wbemServices.InstancesOff为例,我们就说$wbemServices对象的InstancesOff属性。

类:WMI能实现的操作有很多种,不同种类的操作都是分开的,我们称之为类,上面代码中的"Win32_LogicalMemoryConfiguration"就是一个类。

命名空间:类也分很多种,功能相近的类分在一起就是命名空间,比如说上面代码中的\root\cimv2。而另一个常用的命名空间是root\DEFAULT。例如,事件日志、性能计数器、Windows 安装程序和 Win32 提供程序都存储在 root\cimv2 命名空间中。另一方面,注册表提供程序存储在 root\DEFAULT 命名空间中。

集合$wbemObjectSet的数据类型属于集合,用FOR...IN...能对其进行列举。

三、使用WMI的基本步骤

1.获取SwbemServicesWMI服务对象,或者说连接到目标计算机的命名空间

$strComputer = "."
$wbemServices = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")

2.获取类的集合对象

$wbemObjectSet= $wbemServices.InstancesOf("Win32_LogicalMemoryConfiguration")

3.使用指定对象的属性进行操作

For $wbemObject In $wbemObjectSet ConsoleWrite("Total Physical Memory (kb): " & $wbemObject.TotalPhysicalMemory) Next

上面三步仅仅是对WMI操作的概括,实际操作时每一步都很复杂,下面将对这3步逐一进行讲解。

四、连接到命名空间的方法

方法1.用moniker名字法建立WMI服务的连接

这一方法也就是本文的例子所用到的,它的要点就是通过编写一个moniker字符串作为ObjGet函数的参数,然后返回一个SwbemServices对象。

关于moniker字符串的完整格式如下:

"winmgmts:[{SecuritySettings}!][\\ComputerName][\Namespace][:ClassName][.KeyProperty='Value']"

"winmgmts:"是前缀, 表示为WMI服务,必须使用;第二部分用来验证权限和假冒级别的,省略。第三部分为计算机名字:"\\.\"是本机的计算机名字,默认可省略,,其余同上;第四部分命名空间:缺省的命名空间为"root\CIMV2",默认可省略。也就是说我给的那个例子中的相关代码可简写为:$wbemServices = ObjGet("winmgmts:"),但我绝不建议这样做。

第五部分为类名。第六部分为属性值。注意:当该moniker字符串不包括最后2项时(即为:"winmgmts:[\\ComputerName][\Namespace]"),则ObjGet(moniker字符串)返回的是一个命名空间的已验证的连接(SwbemServices对象);当不包括最后1项时,返回的是一个类(SWbemObject对象);当包括最后2项时,返回的是一个类的单独实例(SWbemObject对象)。

方法2.通过建立SwbemLocator对象

这第二种方法我并不推荐,因为操作很繁琐,但是这种方法却能直观反应WMI操作的原理。下面是具体步骤:

1.建立SwbemLocator对象

$objLocator = ObjCreate("WbemScripting.SWbemLocator")

2.通过ConnectServer属性登录到目标计算机,下面的代码是登录到本机

$objService = $objLocator.ConnectServer(".", "root\cimv2")

3.设置impersonation等级

$objService.Security_.ImpersonationLevel = 3

5.执行你的代码,还是以显示物理内存为例

$objLocator = ObjCreate("WbemScripting.SWbemLocator") $objService = $objLocator.ConnectServer(".", "root\cimv2") $objService.Security_.ImpersonationLevel = 3
;和第一个例子不同,这里使用了ExecQuery属性来获取Win32_LogicalMemoryConfiguration类的对象 $wbemObjectSet = $objService.ExecQuery("SELECT * FROM Win32_LogicalMemoryConfiguration")
For $wbemObject In $wbemObjectSet ConsoleWrite("Total Physical Memory (kb): " & $wbemObject.TotalPhysicalMemory) Next

posted on 2011-11-29 09:39 流沙- 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/darkdance/archive/2011/11/29/2267053.html

03-21
<think>好的,我需要回答用户关于Windows Management Instrumentation (WMI)的使用指南或示例教程的问题。首先,我需要回顾用户提供的引用内容,看看有哪些相关信息可以利用。用户提供了五个引用链接,涵盖了WMI的简介、攻击向量、编程示例、类集合以及具体的使用命令。 首先,我应该从WMI的基本概念开始介绍,这对应引用[1]和引用[4]。引用[1]提到了WMI的简介和攻击向量,而引用[4]详细说明了WMI类集合的用途。因此,我需要解释WMI是什么,它的主要功能,以及它在系统管理中的作用。 接下来,用户可能需要了解如何使用WMI,特别是编程示例。引用[3]提到了VBA示例,引用[5]给出了PowerShell命令Get-WmiObject Win32_Process的使用。我需要分别展示不同语言中的使用方式,比如PowerShell、VBScript/VBA和C#,这样用户可以有多方面的参考。同时,确保代码示例正确,符合用户提到的LaTeX格式要求,不过代码块应该用反引号包裹,而不是LaTeX的数学表达式。 然后,根据引用[2],WMI控件的配置也是个重要部分。用户可能需要知道如何访问和配置WMI设置,比如远程连接、安全设置等。这部分需要简明扼要地列出步骤,并引用相关来源。 另外,用户可能对WMI的实际应用场景感兴趣,比如系统监控、远程管理等,这可以结合引用[4]中的类集合来举例说明,如Win32_Process、Win32_Service等类的使用。 在生成相关问题部分,需要涵盖基础概念、具体操作、安全性和实际应用等方面的问题,这样用户可以根据自己的需求进步探索。例如,如何通过WMI监控系统性能,或者WMI的安全隐患,这些都是用户可能关心的点。 需要注意的是,回答中所有引用的地方要自然添加引用标识,比如在介绍WMI配置时引用[2],在代码示例处引用[3]和[5]。同时,要确保使用中文回答,结构清晰,分步骤说明,并避免使用Markdown格式,保持文本的自然流畅。 最后,检查LaTeX语法是否正确,虽然用户的问题中数学表达式不多,但如果有变量或公式出现,要用$...$或$$...$$包裹。不过当前内容中可能较少涉及数学表达式,主要集中在代码示例和文字描述上。 总结下,回答的结构应该是: 1. WMI简介(引用[1][4]) 2. 使用方法(PowerShell、VBScript/VBA、C#示例,引用[3][5]) 3. WMI配置(引用[2]) 4. 应用场景(引用[4][5]) 5. 相关问题 确保每个部分都有对应的引用标注,并且语言简洁明了,符合用户的要求。</think>### Windows Management Instrumentation (WMI) 使用指南 #### 1. WMI 简介 Windows Management Instrumentation (WMI) 是 Windows 系统管理的核心工具,提供统的接口用于查询和操作系统配置、硬件状态、进程信息等数据。它基于 CIM(公共信息模型)标准,通过类(Class)和实例(Instance)描述系统资源,支持本地和远程管理[^1][^4]。 #### 2. 基础使用方法 ##### PowerShell 示例 通过 `Get-WmiObject` 命令可快速获取系统信息。例如,获取当前运行的进程: ```powershell Get-WmiObject Win32_Process | Select Name, ProcessId ``` 此命令返回进程名称和 ID[^5]。 ##### VBScript/VBA 示例 以下代码通过 VBA 查询操作系统版本: ```vb Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem") For Each objItem in colItems MsgBox "OS 版本: " & objItem.Caption Next ``` 此脚本通过 `Win32_OperatingSystem` 类获取系统信息[^3]。 ##### C# 示例 通过 .NET 的 `System.Management` 命名空间访问 WMI: ```csharp using System.Management; var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service"); foreach (ManagementObject service in searcher.Get()) { Console.WriteLine("服务名称: " + service["Name"]); } ``` 此代码遍历所有系统服务。 #### 3. WMI 配置 通过 **WMI 控件**(`wmimgmt.msc`)可配置本地或远程计算机的 WMI 设置: - **安全设置**:控制用户/组的访问权限。 - **远程连接**:启用防火墙规则(如 DCOM 端口)并配置身份验证模式[^2]。 #### 4. 典型应用场景 - **系统监控**:通过类如 `Win32_Processor`(CPU 状态)、`Win32_DiskDrive`(磁盘信息)实时获取硬件数据。 - **远程管理**:跨网络管理服务(`Win32_Service`)或进程(`Win32_Process`)。 - **自动化脚本**:批量部署软件或配置系统参数[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值