WMI入门

时间:2022-10-22 16:07:56

转:http://www.cnblogs.com/ceachy/archive/2013/03/21/WMI_What.html

WMI入门(一):什么是WMI

  WMI出现至今已经二十多年了,但很多人对它并不熟悉。知道它很好很强大,但不知道它从哪里来,怎么工作,使用范围是什么?现在我跟大家说说我的理解。。。

  WMI有一组API。我们不管使用VBScript、PowerShell脚本还是利用C#的来访问WMI的类库,都是因为WMI向外暴露的一组API。这些API是在系统安装WMI模块的时候安装的,通过他们我们能够能拿到我们想要的类。

  WMI有一个存储库。尽管WMI的多数实例数据都不存储在WMI中,但是WMI确实有一个存储库,用来存放提供程序提供的类信息,或者称为类的蓝图或者Schema。

  WMI有一个Service。WMI总是能够响应用户的访问,那是因为它有一个一直运行的Windows服务,名字叫Winmgmt。停止这个服务,所有对WMI的操作都将没有反应。

  WMI是可扩展的。人人都知道WMI能干很多事情,读取本机硬盘信息、读取远程计算机的用户信息、读取域用户信息等等。基本上,你能想到的获取或者更改资源的操作,它都能干。可谓吃得少,干得多。它为什么这么能干呢?这基于WMI的可扩展性。WMI对资源的操作,不是它自己实现了什么方法,而完全取决于向它注册的提供程序。

  WMI是管理员日常必备的强大工具之一,是脚本伴侣。当然也可以把一个大型系统建立在WMI以及WMI的提供程序之上。以下给两个使用WMI的例子:

示例一:

本示例利用VB Script检查本机的物理内存量:

WMI入门
strComputer = "."

Set wbemServices = Getobject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_LogicalMemoryConfiguration") For Each wbemObject In wbemObjectSet
WScript.Echo "Total Physical Memory (kb): " & wbemObject.TotalPhysicalMemory
Next
WMI入门

示例二:
本示例利用PowerShell检查本机的逻辑硬盘情况:

PS C:\Users\v-lukez> Get-WmiObject -Class Win32_LogicalDisk

结语:
  WMI功能强大,而且一直在发展,但是因为用的人不多,所以一直不温不火。希望更多的人能够慧眼识珠,看到的潜力。

WMI入门(二):如何使用WMI

  知道了WMI是什么以后,肯定想要知道如何使用WMI干活。它能写“Hello World”吗?WMI没那么无聊,它一上来就会问你“你想要什么?”或者“你想要更改什么?”。。。

WMI工具

  Windows本身提供了几个WMI工具供用户使用,包括WMIC.exe、WBEMTest.exe和WMI Administrative Tools等。前两个是系统自带的,最后一个需要自己下载安装。不过说实话,我最喜欢WMI Administrative Tools。下载WMI Administrative Tools在这里。下面以WMI Administrative Tools为例说明如何使用工具使用WMI。

  下载并安装WMI Administrative Tools之后,会有4个工具,最常用的是其中的WMI CIM Studio。在开始菜单里单击它,你会发现它是以网页形式在IE浏览器中打开的。

使用步骤如下:

  1、单击页面上部的电脑图标,会显示一个对话框,单击“Connect”按钮,如图1所示;

WMI入门

            图1

  2、任何时候出现如图2所示的登陆对话框,单击OK按钮即可;

WMI入门

            图2

  3、选择合适的命令空间(这里选择常用的root\cimv2),然后单击OK按钮,如图3所示;

WMI入门

            图3

  4、直接双击右侧类名,或者单击上部的望远镜按钮,在弹出的查找对话窗中输入你要查找的完整类名或者类名的一部分,单击Go按钮查找;并在查找结果中选择你要查看的类名,单击OK按钮,如图4所示;

WMI入门

            图4

  5、单击右上部倒数第4个实例按钮,即可得到本机所有安装的软件列表,如图5所示;

WMI入门

            图5

任何WMI类以及实例的查看均可参考以上步骤。

脚本操作WMI

  以前对WMI的操作都是通过VB Script进行的,现在更多人倾向于使用PowerShell来访问WMI类和对象。下面给出使用PowerShell命令查询本机安装的所有软件列表的示例:

WMI入门
PS C:\Users\luke> Get-WmiObject -Class Win32_Product | select name

name
----
HelpDesk
Windows Installer Clean Up
XML Notepad 2007
Microsoft Network Monitor 3.4
Microsoft Visual Studio 2010 Service Pack 1
ScreenRecorder
Microsoft Office Visual Web Developer 2007
Microsoft Office Visual Web Developer MUI (English) 2007
...
WMI入门

比使用带界面的WMI要简单的多,而且还可以有很多筛选条件。

.Net操作WMI

  使用.Net中的高级语言来操作WMI也非常的方便。下面示例演示C#操作WMI获得本机安装软件的列表的代码:

WMI入门
using System;
using System.Management; namespace WMIDemo
{
class Program
{
static void Main(string[] args)
{
ManagementPath wmiPath = new ManagementPath(@"\\.\root\cimv2:Win32_Product");
ManagementClass wmiClass = new ManagementClass(wmiPath); ManagementObjectCollection instances = wmiClass.GetInstances(); Console.WriteLine("Name, Vendor");
foreach (ManagementObject product in instances)
{
Console.WriteLine(String.Format("{0}, {1} ", product["Name"], product["Vendor"]));
}
}
}
}
WMI入门

结语  

  WMI是一个多面手,你个可以从各个测面来使用它。套用一句广告词:关于WMI,你怎么用?

WMI入门(三):我需要的类在哪里?

  使用WMI归根到底是对WMI类的访问,如何找到合适的类是其中关键的一步。我一直在为找不到合适的类和命名空间苦恼。你也有这样的问题吗?

类层次结构

  WMI的类是以命名空间和继承层次方式组织的,呈树形结构。命名空间的根是root,在它的下面还有十几个命名空间,最常用的是root\cimv2。命名空间的信息存储在静态类__Namespace类中,要查询当前命名空间下的所有命名空间,可以查看__Namespace类的实例。以下是在我的机器上使用PowerShell查询到的命名空间:

WMI入门
PS C:\Users\idsswtt> Get-WmiObject -Class __namespace -Namespace root | select name

name
----
subscription
DEFAULT
cimv2
Cli
Nap
MicrosoftIISv2
SECURITY
SmsDm
CCMVDI
RSOP
WebAdministration
ccm
WMI
directory
Policy
virtualization
Interop
Hardware
ServiceModel
Microsoft
aspnet
WMI入门

关于命名空间更详细的信息,可以写一个递归的脚本来取得,或者从WMI入门(二):如何使用WMI中提到的WMI CIM Studio工具中查到。

常用WMI类

  WMI体系结构中有成百上千个类。我们经常用到的只有其中一部分。其中有些是用来查询实例的,另一些用来查询类的Schema的。除了上面提到的__Namespace类,我们还会用到__Win32Provider类,来查询当前系统中都有哪些提供程序。这两个类是系统类。

  此外,还有两类WMI类我们经常用到:CIM_*类和Win32_*类。前者是WMI的核心类和公共类,很多时候也被称为CIM核心类和公共类。后者是Win32扩展类,我们查询实例多在Win32扩展类中查询。例如Win32_Product、Win32_LogicalDisk等。

WMI类查找手册?

  很遗憾的是,到目前为止。我没有发现一个好用的WMI类查找手册。但在微软MSDN网站上,有一个分类。我们可以依照这个分类来做查询。以下几个链接是我经常用到的,贴在这里,希望你能用到。

  WMI Reference

  Win32 Classes

  WMI Providers

结语

  看完上面我写的这些东西,如果你还是找不到你要的类,那你就只能怪微软了。我觉得微软为WMI做的还是太少,至少在类查询这一块儿是这样。在微软为WMI投入更多之前,我们只能依赖经验和搜索引擎来寻找适当的类了。

WMI入门的更多相关文章

  1. WMI入门教程之WMI中的类在哪里?

    Powershell专栏: https://www.jb51.net/list/list_234_1.htm https://www.pstips.net/get-wmiobject-becomes- ...

  2. 【转】PowerShell入门(九):访问.Net程序集、COM和WMI

    转至:http://www.cnblogs.com/ceachy/archive/2013/02/28/PowerShell_DotNet_COM_WMI.html PowerShell可以设计的大而 ...

  3. [EntLib]微软企业库5.0 学习之路——第一步、基本入门

    话说在大学的时候帮老师做项目的时候就已经接触过企业库了但是当初一直没明白为什么要用这个,只觉得好麻烦啊,竟然有那么多的乱七八糟的配置(原来我不知道有配置工具可以进行配置,请原谅我的小白). 直到去年在 ...

  4. BI之SSIS入门最新版Visual Studio调试技巧

    简介 最近公司业务需要用到BI SSIS,SSIS是什么?"SSIS是Microsoft SQL Server Integration Services的简称,是生成高性能数据集成解决方案( ...

  5. 数据库技术丛书:SQL Server 2016 从入门到实战(视频教学版) PDF

    1:书籍下载方式: SQL Server2016从入门到实战 PDF 下载  链接:https://pan.baidu.com/s/1sWZjdud4RosPyg8sUBaqsQ 密码:8z7w 学习 ...

  6. UWP开发入门(25)——通过Radio控制Bluetooth, WiFi

    回顾写了许久的UWP开发入门,竟然没有讲过通过Windows.Devices.Radios.Radio来控制Bluetooth和WiFi等功能的开关.也许是因为相关的API设计的简单好用,以至于被我给 ...

  7. VBS脚本编程(10)——编写WMI脚本

    WMI介绍 1.WMI是什么? WMI--Windows管理规范(Windows Management instrumentation). 是一项核心的Windows管理技术. 采用统一的.基于开放标 ...

  8. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  9. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

随机推荐

  1. linux shell脚本使用结构化命令(2)

    一.for命令 二.while命令 三.until命令 1.for命令基本格式 for var in list do commands done oracle@suse:~/testshell> ...

  2. c#的学习

    C#,读做 "C sharp",中文译音暂时没有,非专业人士一般读"C井",专业人士一般读"C sharp".C#是一种安全的.稳定的.简单 ...

  3. cocos2d-x ios 设置横屏/竖屏(全)

    Cocos2d-x项目\iOS\RootViewController.mm文件中. 以下方法任选其一即可…      本人机子函数二ok! 函数一: (BOOL)shouldAutorotateToI ...

  4. 16. Linux 文件目录权限

    # 文件参数 d:表示是一个目录-:表示这是一个普通的文件l: 表示这是一个符号链接文件,实际上它指向另一个文件b.c:分别表示区块设备和其他的外围设备,是特殊类型的文件s.p:这些文件关系到系统的数 ...

  5. spring mvc 存取值

    (转) 1,使用HttpServletRequest获取 @RequestMapping("/login.do") public String login(HttpServletR ...

  6. unable to create …

    问题描述: 在新建Android Application时会出现unable to create the selected property page 解决方法: 将用户PATH路径中的jdk路径放到 ...

  7. 使用C#的AssemblyResolve事件动态解析加载失败的程序集

    我们知道反射是 依赖注入 模式的基础,依赖注入要求只在项目中引用定义接口的程序集,而不引用接口实现类的程序集,因为接口实现类的程序集应该是通过反射来动态加载的,这样才能保证接口与其实现类之间的松耦合. ...

  8. Mina源码阅读笔记(二)- IoBuffer的封装

    在阅读IoBuffer源码之前,我们先看Mina对IoBuffer的描述:A byte buffer used by MINA applications. This is a replacement ...

  9. C# 6.0:在catch和finally中使用await

    Asyn方法是一个现在很常用的方法,当使用async和await时,你或许曾有这样的经历,就是你想要在catch块或finally块中使用它们,比如当出现一个exception而你希望将日志记在文件或 ...

  10. <网络编程>套接字介绍

    1.端口:IANA(Internet Assigned Numbers Authority)维护着一个端口号分配状况的清单. 众所周知的端口(0-1023):由IANA分配和控制,可能的话,相同的端口 ...