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("rn"+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.2rootcimv2",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;
}
}
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(@"csnt3rootcimv2",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管理应用程序|检索管理对象的集合|查询管理信息|预订和使用管理事件|执行管理对象的方法|远程处理和连接选项|使用强类型对象
当前1/2页12下一页阅读全文
【c#与WMI使用技巧集第1/2页】相关文章: