`
tiandirensoon
  • 浏览: 591752 次
文章分类
社区版块
存档分类
最新评论

WMI使用技巧集

 
阅读更多

WMI使用技巧集
 很多的朋友对WMI可能见过但理解不深,我也是十分想了解关于WMI的知识,可一直找不对太合适的资料,在网上的一些资料不是有很多错误,就是讲解不清,我有空的时候将关于WMI的知识集中一下,放在这里便于大家学习。本贴会不断增加。
1、什么是WMI
WMI是英文WindowsManagementInstrumentation的简写,它的功能主要是:访问本地主机的一些信息和服务,可以管理远程计算机(当然你必须要拥有足够的权限),比如:重启,关机,关闭进程,创建进程等。
2、如何用WMI获得本地磁盘的信息?
首先要在VS.NET中创建一个项目,然后在添加引用中引用一个.net的装配件:System.Management.dll,这样你的项目才能使用WMI。代码如下:
usingSystem;
usingSystem.Management;

classSample_ManagementObject
{
publicstaticintMain(string[]args)
{
SelectQueryquery=newSelectQuery("Select*FromWin32_LogicalDisk");
ManagementObjectSearchersearcher=newManagementObjectSearcher(query);
foreach(ManagementBaseObjectdiskinsearcher.Get())
{
Console.WriteLine("/r/n"+disk["Name"]+""+disk["DriveType"]+""+disk["VolumeName"]);
}


Console.ReadLine();

return0;

}

}

disk["DriveType"]的返回值意义如下:

1Notype
2Floppydisk
3Harddisk
4Removabledriveornetworkdrive
5CD-ROM
6RAMdisk


3、如何用WMI获得指定磁盘的容量?
usingSystem;
usingSystem.Management;

//ThisexampledemonstratesreadingapropertyofaManagementObject.
classSample_ManagementObject
{
publicstaticintMain(string[]args)
{
ManagementObjectdisk=newManagementObject(
"win32_logicaldisk.deviceid=/"c:/"");
disk.Get();
Console.WriteLine("LogicalDiskSize="+disk["Size"]+"bytes");
Console.ReadLine();
return0;
}
}


4、如何列出机器中所有的共享资源?
usingSystem;
usingSystem.Management;

classTestApp{
[STAThread]
staticvoidMain()
{
ManagementObjectSearchersearcher=newManagementObjectSearcher(
"SELECT*FROMWin32_share");
foreach(ManagementObjectshareinsearcher.Get())
{
Console.WriteLine(share.GetText(TextFormat.Mof));
}
}


}
别忘记在引用中把System.Management添加进来。


5、怎样写程控制让系统中的某个文件夹共享或取消共享.?
首先,这需要以有相应权限的用户登录系统才行。然后,试试下面的代码:
usingSystem;
usingSystem.Management;

classCreateShare
{
publicstaticvoidMain(string[]args)
{
ManagementClass_class=newManagementClass(newManagementPath("Win32_Share"));

object[]obj={"C://Temp","我的共享",0,10,"DotNet实现的共享",""};

_class.InvokeMethod("create",obj);
}
}

object[]obj={"C://Temp","我的共享",0,10,"DotNet实现的共享",""};
改为
object[]obj={"C://Temp","我的共享",0,null,"DotNet实现的共享",""};
就可以实现授权给最多用户了。


6、如何获得系统服务的运行状态?
privatevoidgetServices()
{
ManagementObjectCollectionqueryCollection;
string[]lvData=newstring[4];

try
{
queryCollection=getServiceCollection("SELECT*FROMWin32_Service");
foreach(ManagementObjectmoinqueryCollection)
{
//createchildnodeforoperatingsystem
lvData[0]=mo["Name"].ToString();
lvData[1]=mo["StartMode"].ToString();
if(mo["Started"].Equals(true))
lvData[2]="Started";
else
lvData[2]="Stop";
lvData[3]=mo["StartName"].ToString();

//createlistitem
ListViewItemlvItem=newListViewItem(lvData,0);
listViewServices.Items.Add(lvItem);
}
}
catch(Exceptione)
{
MessageBox.Show("Error:"+e);
}
}


7、通过WMI修改IP,而实现不用重新启动?
usingSystem;
usingSystem.Management;
usingSystem.Threading;

namespaceWmiIpChanger
{
classIpChanger
{
[MTAThread]
staticvoidMain(string[]args)
{
ReportIP();
//SwitchToDHCP();
SwitchToStatic();
Thread.Sleep(5000);
ReportIP();
Console.WriteLine("end.");
}

staticvoidSwitchToDHCP()
{
ManagementBaseObjectinPar=null;
ManagementBaseObjectoutPar=null;
ManagementClassmc=newManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollectionmoc=mc.GetInstances();
foreach(ManagementObjectmoinmoc)
{
if(!(bool)mo["IPEnabled"])
continue;

inPar=mo.GetMethodParameters("EnableDHCP");
outPar=mo.InvokeMethod("EnableDHCP",inPar,null);
break;
}
}

staticvoidSwitchToStatic()
{
ManagementBaseObjectinPar=null;
ManagementBaseObjectoutPar=null;
ManagementClassmc=newManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollectionmoc=mc.GetInstances();
foreach(ManagementObjectmoinmoc)
{
if(!(bool)mo["IPEnabled"])
continue;

inPar=mo.GetMethodParameters("EnableStatic");
inPar["IPAddress"]=newstring[]{"192.168.1.1"};
inPar["SubnetMask"]=newstring[]{"255.255.255.0"};
outPar=mo.InvokeMethod("EnableStatic",inPar,null);
break;
}
}

staticvoidReportIP()
{
Console.WriteLine("******CurrentIPaddresses:");
ManagementClassmc=newManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollectionmoc=mc.GetInstances();
foreach(ManagementObjectmoinmoc)
{
if(!(bool)mo["IPEnabled"])
continue;

Console.WriteLine("{0}/nSVC:'{1}'MAC:[{2}]",(string)mo["Caption"],
(string)mo["ServiceName"],(string)mo["MACAddress"]);

string[]addresses=(string[])mo["IPAddress"];
string[]subnets=(string[])mo["IPSubnet"];

Console.WriteLine("Addresses:");
foreach(stringsadinaddresses)
Console.WriteLine("/t'{0}'",sad);

Console.WriteLine("Subnets:");
foreach(stringsubinsubnets)
Console.WriteLine("/t'{0}'",sub);
}
}
}
}


8、如何利用WMI远程重启远程计算机?
usingSystem;
usingSystem.Management;
namespaceWMI3
{
///<summary>
///SummarydescriptionforClass1.
///</summary>
classClass1
{
staticvoidMain(string[]args)
{
Console.WriteLine("ComputerdetailsretrievedusingWindowsManagementInstrumentation(WMI)");
Console.WriteLine("mailto:Written%2002/01/02%20By%20John%20O'Donnell%20-%20csharpconsulting@hotmail.com");
Console.WriteLine("========================================
=================================");
//连接远程计算机
ConnectionOptionsco=newConnectionOptions();
co.Username="john";
co.Password="john";
System.Management.ManagementScopems=newSystem.Management.ManagementScope("////192.168.1.2//root//cimv2",co);
//查询远程计算机
System.Management.ObjectQueryoq=newSystem.Management.ObjectQuery("SELECT*FROMWin32_OperatingSystem");

ManagementObjectSearcherquery1=newManagementObjectSearcher(ms,oq);
ManagementObjectCollectionqueryCollection1=query1.Get();
foreach(ManagementObjectmoinqueryCollection1)
{
string[]ss={""};
mo.InvokeMethod("Reboot",ss);
Console.WriteLine(mo.ToString());
}
}
}
}


9、利用WMI创建一个新的进程?
usingSystem;
usingSystem.Management;

//ThissampledemonstratesinvokingaWMImethodusingparameterobjects
publicclassInvokeMethod
{
publicstaticvoidMain()
{

//Gettheobjectonwhichthemethodwillbeinvoked
ManagementClassprocessClass=newManagementClass("Win32_Process");

//Getaninputparametersobjectforthismethod
ManagementBaseObjectinParams=processClass.GetMethodParameters("Create");

//Fillininputparametervalues
inParams["CommandLine"]="calc.exe";

//Executethemethod
ManagementBaseObjectoutParams=processClass.InvokeMethod("Create",inParams,null);

//Displayresults
//Note:Thereturncodeofthemethodisprovidedinthe"returnvalue"propertyoftheoutParamsobject
Console.WriteLine("Creationofcalculatorprocessreturned:"+outParams["returnvalue"]);
Console.WriteLine("ProcessID:"+outParams["processId"]);
}
}


10、如何通过WMI终止一个进程?
usingSystem;
usingSystem.Management;

//Thisexampledemonstrateshowtostopasystemservice.
classSample_InvokeMethodOptions
{
publicstaticintMain(string[]args){
ManagementObjectservice=
newManagementObject("win32_service=/"winmgmt/"");
InvokeMethodOptionsoptions=newInvokeMethodOptions();
options.Timeout=newTimeSpan(0,0,0,5);

ManagementBaseObjectoutParams=service.InvokeMethod("StopService",null,options);

Console.WriteLine("ReturnStatus="+outParams["Returnvalue"]);

return0;
}
}


11、如何用WMI来获取远程机器的目录以及文件.比如如何列出一个目录下的所有文件,或者所有子目录;如何删除,舔加,更改文件?
usingSystem;

usingSystem.Management;

//ThisexampledemonstratesreadingapropertyofaManagementObject.

classSample_ManagementObject

{

publicstaticintMain(string[]args){

ManagementObjectdisk=newManagementObject(

"win32_logicaldisk.deviceid=/"c:/"");

disk.Get();

Console.WriteLine("LogicalDiskSize="+disk["Size"]+"bytes");

return0;

}

}


12、参考资料
可以参考下列内容:

msdnWMISDK:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_start_page.asp

WMI使用说明(csdn):
http://www.csdn.net/develop/article/15/15346.shtm

WMI技术的应用for.net(csdn):
http://www.csdn.net/develop/article/16/16419.shtm

在.NET中轻松获取系统信息(1)-WMI篇(csdn):
http://www.csdn.net/develop/article/15/15744.shtm


:)

13、一些技巧
我使用WMI可以取出网卡的MAC地址,CPU的系列号,主板的系列号,其中主板的系列号已经核对过没有错的,其余的有待于验证,因为我使用的是笔记本,笔记本背面有一个主板的系列号,所以可以肯定主板系列号没有问题

网卡的MAC地址

SELECTMACAddressFROMWin32_NetworkAdapterWHERE((MACAddressIsNotNULL)AND(Manufacturer<>'Microsoft'))

结果:08:00:46:63:FF:8C


CPU的系列号

SelectProcessorIdFromWin32_Processor

结果:3FEBF9FF00000F24


主板的系列号

SelectSerialNumberFromWin32_BIOS

结果:28362630-3700521
获取硬盘ID
StringHDid;
ManagementClasscimobject=newManagementClass("Win32_DiskDrive");
ManagementObjectCollectionmoc=cimobject.GetInstances();
foreach(ManagementObjectmoinmoc)
{
HDid=(string)mo.Properties["Model"].value;

MessageBox.Show(HDid);
}


14、一个使用WMI后的异常处理的问题
下面是我整理的一段代码.

ManagementObjectCollectionqueryCollection1;
ConnectionOptionsco=newConnectionOptions();
co.Username="administrator";
co.Password="111";
try
{
System.Management.ManagementScopems=newSystem.Management.ManagementScope(@"//csnt3/root/cimv2",co);
System.Management.ObjectQueryoq=newSystem.Management.ObjectQuery("SELECT*FROMWin32_OperatingSystem");
ManagementObjectSearcherquery1=newManagementObjectSearcher(ms,oq);

queryCollection1=query1.Get();
foreach(ManagementObjectmoinqueryCollection1)
{
string[]ss={""};
mo.InvokeMethod("Reboot",ss);
Console.WriteLine(mo.ToString());
}
}
catch(Exceptionee)
{

Console.WriteLine("error");

}


15、Windows管理规范(WMI)是可伸缩的系统管理结构,它采用一个统一的、基于标准的、可扩展的面向对象接口。WMI为您提供与系统管理信息和基础WMIAPI交互的标准方法。WMI主要由系统管理应用程序开发人员和管理员用来访问和操作系统管理信息。
WMI可用于生成组织和管理系统信息的工具,使管理员或系统管理人员能够更密切地监视系统活动。例如,可以使用WMI开发一个应用程序,用于在Web服务器崩溃时呼叫管理员。
将WMI与.NET框架一起使用
WMI提供了大量的规范以便为许多高端应用程序(例如,MicrosoftExchange、MicrosoftSQLServer和MicrosoftInternet信息服务(IIS))实现几乎任何管理任务。管理员可以执行下列任务:
"监视应用程序的运行状况。
"检测瓶颈或故障。
"管理和配置应用程序。
"查询应用程序数据(使用对象关系的遍历和查询)。
"执行无缝的本地或远程管理操作。
WMI结构由以下三层组成:
"客户端
使用WMI执行操作(例如,读取管理详细信息、配置系统和预订事件)的软件组件。
"对象管理器
提供程序与客户端之间的中间装置,它提供一些关键服务,如标准事件发布和预订、事件筛选、查询引擎等。
"提供程序
软件组件,它们捕获实时数据并将其返回到客户端应用程序,处理来自客户端的方法调用并将客户端链接到所管理的基础结构。
通过定义完善的架构向客户端和应用程序无缝地提供了数据和事件以及配置系统的能力。在.NET框架中,System.Management命名空间提供了用于遍历WMI架构的公共类。
除了.NET框架,还需要在计算机上安装WMI才能使用该命名空间中的管理功能。如果使用的是WindowsMillenniumEdition、Windows2000或WindowsXP,那么已经安装了WMI。否则,将需要从MSDN下载WMI。
用System.Management访问管理信息
System.Management命名空间是.NET框架中的WMI命名空间。此命名空间包括下列支持WMI操作的第一级类对象:
"ManagementObject或ManagementClass:分别为单个管理对象或类。
"ManagementObjectSearcher:用于根据指定的查询或枚举检索ManagementObject或ManagementClass对象的集合。
"ManagementEventWatcher:用于预订来自WMI的事件通知。
"ManagementQuery:用作所有查询类的基础。
System.Management类的使用编码范例对.NET框架环境很适合,并且WMI在任何适当的时候均使用标准基框架。例如,WMI广泛利用.NET集合类并使用推荐的编码模式,如.NET异步操作的“委托”模式。因此,使用.NET框架的开发人员可以使用他们的当前技能访问有关计算机或应用程序的管理信息。
请参见
使用WMI管理应用程序|检索管理对象的集合|查询管理信息|预订和使用管理事件|执行管理对象的方法|远程处理和连接选项|使用强类型对象

获取CPU序列号代码
stringcpuInfo="";//cpu序列号
ManagementClasscimobject=newManagementClass("Win32_Processor");
ManagementObjectCollectionmoc=cimobject.GetInstances();
foreach(ManagementObjectmoinmoc)
{
cpuInfo=mo.Properties["ProcessorId"].value.ToString();
Console.WriteLine(cpuInfo);
Console.ReadLine();
}
获取网卡硬件地址
usingSystem.Management;
...
ManagementClassmc=newManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollectionmoc=mc.GetInstances();
foreach(ManagementObjectmoinmoc)
{
if((bool)mo["IPEnabled"]==true)
Console.WriteLine("MACaddress/t{0}",mo["MacAddress"].ToString());
mo.Dispose();
}
}
获取硬盘ID
StringHDid;
ManagementClasscimobject=newManagementClass("Win32_DiskDrive");
ManagementObjectCollectionmoc=cimobject.GetInstances();
foreach(ManagementObjectmoinmoc)
{
HDid=(string)mo.Properties["Model"].value;
MessageBox.Show(HDid);
}


16、在.NET中轻松获取系统信息(1)-WMI篇
Montaque
申明:
1、个人的一点心得,仅供参考
2、转载时候,请保留原本。

概述:
不知道大家有没有这种体会?有时候为了获取系统一点点信息,比如考虑一下操作系统的版本号,或者当前屏幕的分辨率。其实说到底就是读操作系统某个方面的一个属性值而已,然后就看到我们的程序中密密麻麻的Win32API申明,调用,代码的可读性和维护性不言而喻。到了.NET,微软提供了更为丰富的类,有很多以前要调用API的方法可以在.NET中轻而易举的调用实现。今天简单介绍一个在.NET中如何通过与WMI(Windows管理规范)的通讯,从而得到获取信息的目的。
主要思路:
举一个获取操作系统共享目录和获取主板号的例子,介绍如何利用System.Managment下面的类获取系统相关的信息:

正文:
WMI(Windows管理规范:WindowsManagementInstrumentation)是Microsoft基于Web的企业管理(WBEM)的实现,同时也是一种基于标准的系统管理接口。WMI最早出现在MicrosoftWindows2000系统上,但它同样可以安装在WindowsNT4和Windows9x计算机上。WMI是一种轻松获取系统信息的强大工具。
在.NET中,有一个System.Management名空间(系统默认没有引用,我们可以手动添加引用),通过下面的Class的操作,可以查询系统软硬件的信息,先看一个简单的例子:

ImportsSystem.Management
DimsearcherAsNewManagementObjectSearcher("SELECT*FROMWin32_share")
DimshareAsManagementObject
ForEachshareInsearcher.Get()
MessageBox.Show(share.GetText(TextFormat.Mof))
Nextshare
运行的结果是列出了所有系统当前共享的目录、以及描述等等。

分析一下上面的代码,可以看到一下几点:
1、似乎是在进行数据库操作,有点像SQL语句。其实就是SQL操作,这种语句被成WQL(WMIQueryLanguage),实际上是标准SQL的一个子集加上了WMI的扩展.
2、WQL是个只读的查询语言,我们只能查询响应的数据,不能用UPDATE,INSERT等更新操作
3、代码很简单、通俗易懂
4、我们采用了一种MOF(托管对象格式)的显示。

例子二:获取当前主板的信息
上面的例子是一个软件方面的信息,下面看一个获取硬件信息的例子,获取主板的序列号以及制造商:
DimsearcherAsNewManagementObjectSearcher("SELECT*FROMWin32_BaseBoard")
DimshareAsManagementObject
ForEachshareInsearcher.Get()
Debug.WriteLine("主板制造商:"&share("Manufacturer"))
Debug.WriteLine("型号:"&share("Product"))
Debug.WriteLine("序列号:"&share("SerialNumber"))
Nextshare
总结以及补充:
WMI类也是分层次的,具体可以参考msdn中的WMI;转向.NET平台开发的时候,最好能多看一些关于.NET新特性的介绍,这样可以大幅度的提升代码的开发效率以及运行效率。

分享到:
评论

相关推荐

    c#与WMI使用技巧集第1/2页

     首先要在VS.NET中创建一个项目,然后在添加引用中引用一个.net的装配件:System.Management.dll,这样你的项目才能使用WMI。代码如下: using System; using System.Management; class Sample_...

    Visual C++ 2005 编程技巧大全光盘

    包括ToolStrip控件应用、泛型应用、注册表管理、WMI管理规范使用、XML文件处理、多线程处理、程序异常处理、文件压缩及解压缩、文件加密解密、文件访问权限、API函数调用、GDI+图像文字特效处理、数据更新并发冲突...

    Visual C++编程技巧精选集 光盘

    前言 第1章 消息框和对话框 1.如何在窗口程序中创建消息框 2.如何使用资源字符串设置消息框内容 3.如何在消息框中动态显示资源字符串 4.如何设置消息提示框的标题文字 ...第22章 WMI查询和管理 第23章 注册表综合应用

    亮剑.NET深入体验与实战精要2

    操作与使用技巧 61 1.6.4 常见开发调试技巧 66 1.6.5 错误异常处理方法 70 本章常见技术面试题 76 常见面试技巧之面试前的准备 76 本章小结 77 第2章 细节决定成败 79 2.1 Equals()和运算符==的区别 80 2.2 const和...

    亮剑.NET深入体验与实战精要3

    操作与使用技巧 61 1.6.4 常见开发调试技巧 66 1.6.5 错误异常处理方法 70 本章常见技术面试题 76 常见面试技巧之面试前的准备 76 本章小结 77 第2章 细节决定成败 79 2.1 Equals()和运算符==的区别 80 2.2 const和...

    asp.net知识库

    .net中的正则表达式使用高级技巧 (一) C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET...

    深入解析Windows操作系统中文.part2.rar

    Filemon诊断技巧 712 12.4 NTFS设计目标和特性 717 高端(High-End)文件系统的需求 717 NTFS的高级特性 719 12.5 NTFS文件系统驱动程序 729 12.6 NTFS在磁盘上的结构 732 卷(volume) 732 簇(cluster) 732 主...

    vc++ 应用源码包_1

    但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的处理.另外WMI除了查询还能修改,比如3389端口,账号,密码,服务启动与关闭只要你想做的几乎都可以,因为WMI代替我们去与硬件打交到了,甚至是系统...

    vc++ 应用源码包_2

    但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的处理.另外WMI除了查询还能修改,比如3389端口,账号,密码,服务启动与关闭只要你想做的几乎都可以,因为WMI代替我们去与硬件打交到了,甚至是系统...

    vc++ 应用源码包_6

    但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的处理.另外WMI除了查询还能修改,比如3389端口,账号,密码,服务启动与关闭只要你想做的几乎都可以,因为WMI代替我们去与硬件打交到了,甚至是系统...

    vc++ 应用源码包_5

    但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的处理.另外WMI除了查询还能修改,比如3389端口,账号,密码,服务启动与关闭只要你想做的几乎都可以,因为WMI代替我们去与硬件打交到了,甚至是系统...

    vc++ 应用源码包_3

    但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的处理.另外WMI除了查询还能修改,比如3389端口,账号,密码,服务启动与关闭只要你想做的几乎都可以,因为WMI代替我们去与硬件打交到了,甚至是系统...

    vc++ 开发实例源码包

    但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的处理.另外WMI除了查询还能修改,比如3389端口,账号,密码,服务启动与关闭只要你想做的几乎都可以,因为WMI代替我们去与硬件打交到了,甚至是系统...

    电脑快捷方式

    wmimgmt.msc----打开windows管理体系结构(WMI) wordpad--------写字板 wuaucpl.cpl----自动更新 wupdmgr--------windows更新程序 write----------写字板 wscript--------windows脚本宿主设置 wscui.cpl-...

Global site tag (gtag.js) - Google Analytics