C#WMI 操作 【转载】

1、 什么是WMI 
WMI是英文Windows Management Instrumentation的简写,它的功能主要是:访问本地主机的一些信息和服务,可以管理远程计算机(当然你必须要拥有足够的权限),比如:重启,关机,关闭进程,创建进程等。 
2、 如何用WMI获得本地磁盘的信息? 
首先要在VS.NET中创建一个项目,然后在添加引用中引用一个.net的装配件:System.Management.dll,这样你的项目才能使用WMI。代码如下: 
using System; 
using System.Management;

class Sample_ManagementObject 

public static int Main(string[] args) 

SelectQuery query=new SelectQuery("Select * From Win32_LogicalDisk"); 
ManagementObjectSearcher searcher=new ManagementObjectSearcher(query); 
foreach(ManagementBaseObject disk in searcher.Get()) 

Console.WriteLine("/r/n"+disk["Name"] +" "+disk["DriveType"] + " " + disk["VolumeName"]); 
}

Console.ReadLine(); 
return 0; 


disk["DriveType"] 的返回值意义如下: 
1 No type 
2 Floppy disk 
3 Hard disk 
4 Removable drive or network drive 
5 CD-ROM 
6 RAM disk

3、如何用WMI获得指定磁盘的容量? 
using System; 
using System.Management; 
// This example demonstrates reading a property of a ManagementObject. 
class Sample_ManagementObject 

public static int Main(string[] args) 

ManagementObject disk = new ManagementObject( 
"win32_logicaldisk.deviceid=/"c:/""); 
disk.Get(); 
Console.WriteLine("Logical Disk Size = " + disk["Size"] + " bytes"); 
Console.ReadLine(); 
return 0; 

}

4、 如何列出机器中所有的共享资源? 
using System; 
using System.Management; 
class TestApp { 
[STAThread] 
static void Main() 

ManagementObjectSearcher searcher = new ManagementObjectSearcher( 
"SELECT * FROM Win32_share"); 
foreach (ManagementObject share in searcher.Get()) 

Console.WriteLine(share.GetText(TextFormat.Mof)); 

}


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

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

public static void Main(string[] args) 

ManagementClass _class = new ManagementClass(new ManagementPath("Win32_Share")); 
object[] obj = {"C://Temp","我的共享",0,10,"Dot Net 实现的共享",""}; 
_class.InvokeMethod("create",obj); 


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

6、 如何获得系统服务的运行状态? 
private void getServices() 

ManagementObjectCollection queryCollection; 
string[] lvData = new string[4]; 
try 

queryCollection = getServiceCollection("SELECT * FROM Win32_Service"); 
foreach ( ManagementObject mo in queryCollection) 

//create child node for operating system 
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(); 
//create list item 
ListViewItem lvItem = new ListViewItem(lvData,0); 
listViewServices.Items.Add(lvItem); 


catch (Exception e) 

MessageBox.Show("Error: " + e); 

}

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

class IpChanger 

[MTAThread] 
static void Main(string[] args) 

ReportIP(); 
// SwitchToDHCP(); 
SwitchToStatic(); 
Thread.Sleep( 5000 ); 
ReportIP(); 
Console.WriteLine( "end." ); 

static void SwitchToDHCP() 

ManagementBaseObject inPar = null; 
ManagementBaseObject outPar = null; 
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
ManagementObjectCollection moc = mc.GetInstances(); 
foreach( ManagementObject mo in moc ) 

if( ! (bool) mo["IPEnabled"] ) 
continue; 
inPar = mo.GetMethodParameters("EnableDHCP"); 
outPar = mo.InvokeMethod( "EnableDHCP", inPar, null ); 
break; 


static void SwitchToStatic() 

ManagementBaseObject inPar = null; 
ManagementBaseObject outPar = null; 
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
ManagementObjectCollection moc = mc.GetInstances(); 
foreach( ManagementObject mo in moc ) 

if( ! (bool) mo[ "IPEnabled" ] ) 
continue; 
inPar = mo.GetMethodParameters( "EnableStatic" ); 
inPar["IPAddress"] = new string[] { "192.168.1.1" }; 
inPar["SubnetMask"] = new string[] { "255.255.255.0" }; 
outPar = mo.InvokeMethod( "EnableStatic", inPar, null ); 
break; 


static void ReportIP() 

Console.WriteLine( "****** Current IP addresses:" ); 
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
ManagementObjectCollection moc = mc.GetInstances(); 
foreach( ManagementObject mo in moc ) 

if( ! (bool) mo[ "IPEnabled" ] ) 
continue; 
Console.WriteLine( "{0}/n SVC: '{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(string sad in addresses) 
Console.WriteLine( "/t'{0}'", sad ); 
Console.WriteLine( " Subnets :" ); 
foreach(string sub in subnets ) 
Console.WriteLine( "/t'{0}'", sub ); 



}

8、 如何利用WMI远程重启远程计算机? 
using System; 
using System.Management; 
namespace WMI3 

///

 
/// Summary description for Class1. 
///
 
class Class1 

static void Main(string[] args) 

Console.WriteLine("Computer details retrieved using Windows Management Instrumentation (WMI)"); 
Console.WriteLine("mailto:Written%2002/01/02%20By%20John%20O'Donnell%20-%[email protected]"); 
Console.WriteLine("======================================== 
================================="); 
//连接远程计算机 
ConnectionOptions co = new ConnectionOptions(); 
co.Username = "john"; 
co.Password = "john"; 
System.Management.ManagementScope ms = new System.Management.ManagementScope("////192.168.1.2//root//cimv2", co); 
//查询远程计算机 
System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_OperatingSystem"); 
ManagementObjectSearcher query1 = new ManagementObjectSearcher(ms,oq); 
ManagementObjectCollection queryCollection1 = query1.Get(); 
foreach( ManagementObject mo in queryCollection1 ) 

string[] ss={""}; 
mo.InvokeMethod("Reboot",ss); 
Console.WriteLine(mo.ToString()); 



}

9、 利用WMI创建一个新的进程? 
using System; 
using System.Management; 
// This sample demonstrates invoking a WMI method using parameter objects 
public class InvokeMethod 

public static void Main() 

//Get the object on which the method will be invoked 
ManagementClass processClass = new ManagementClass("Win32_Process"); 
//Get an input parameters object for this method 
ManagementBaseObject inParams = processClass.GetMethodParameters("Create"); 
//Fill in input parameter values 
inParams["CommandLine"] = "calc.exe"; 
//Execute the method 
ManagementBaseObject outParams = processClass.InvokeMethod ("Create", inParams, null); 
//Display results 
//Note: The return code of the method is provided in the "returnvalue" property of the outParams object 
Console.WriteLine("Creation of calculator process returned: " + outParams["returnvalue"]); 
Console.WriteLine("Process ID: " + outParams["processId"]); 

}

10、 如何通过WMI终止一个进程? 
using System; 
using System.Management; 
// This example demonstrates how to stop a system service. 
class Sample_InvokeMethodOptions 

public static int Main(string[] args) { 
ManagementObject service = 
new ManagementObject("win32_service=/"winmgmt/""); 
InvokeMethodOptions options = new InvokeMethodOptions(); 
options.Timeout = new TimeSpan(0,0,0,5); 
ManagementBaseObject outParams = service.InvokeMethod("StopService", null, options); 
Console.WriteLine("Return Status = " + outParams["Returnvalue"]); 
return 0; 

}

11、 如何用WMI 来获取远程机器的目录以及文件.比如如何列出一个目录下的所有文件,或者所有子目录;如何删除,舔加,更改文件? 
using System; 
using System.Management; 
// This example demonstrates reading a property of a ManagementObject. 
class Sample_ManagementObject 

public static int Main(string[] args) { 
ManagementObject disk = new ManagementObject( 
"win32_logicaldisk.deviceid=/"c:/""); 
disk.Get(); 
Console.WriteLine("Logical Disk Size = " + disk["Size"] + " bytes"); 
return 0; 


13、 一些技巧 
我使用WMI可以取出网卡的MAC地址,CPU的系列号,主板的系列号,其中主板的系列号已经核对过没有错的,其余的有待于验证,因为我使用的是笔记本,笔记本背面有一个主板的系列号,所以可以肯定主板系列号没有问题 
网卡的MAC地址 
SELECT MACAddress FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL) AND (Manufacturer <> 'Microsoft')) 
结果:08:00:46:63:FF:8C

CPU的系列号 
Select ProcessorId From Win32_Processor 
结果:3FEBF9FF00000F24

主板的系列号 
Select SerialNumber From Win32_BIOS 
结果:28362630-3700521 
获取硬盘ID 
String HDid; 
ManagementClass cimobject = new ManagementClass("Win32_DiskDrive"); 
ManagementObjectCollection moc = cimobject.GetInstances(); 
foreach(ManagementObject mo in moc) 

HDid = (string)mo.Properties["Model"].value; 
MessageBox.Show(HDid ); 
}

14、 一个使用WMI后的异常处理的问题 
下面是我整理的一段代码. 
ManagementObjectCollection queryCollection1; 
ConnectionOptions co = new ConnectionOptions(); 
co.Username = "administrator"; 
co.Password = "111"; 
try 

System.Management.ManagementScope ms = new System.Management.ManagementScope(@"//csnt3/root/cimv2", co); 
System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_OperatingSystem"); 
ManagementObjectSearcher query1 = new ManagementObjectSearcher(ms,oq); 
queryCollection1 = query1.Get(); 
foreach( ManagementObject mo in queryCollection1 ) 

string[] ss={""}; 
mo.InvokeMethod("Reboot",ss); 
Console.WriteLine(mo.ToString()); 


catch(Exception ee) 

Console.WriteLine("error"); 
}

15、Windows 管理规范 (WMI) 是可伸缩的系统管理结构,它采用一个统一的、基于标准的、可扩展的面向对象接口。WMI 为您提供与系统管理信息和基础 WMI API 交互的标准方法。WMI 主要由系统管理应用程序开发人员和管理员用来访问和操作系统管理信息。 
WMI 可用于生成组织和管理系统信息的工具,使管理员或系统管理人员能够更密切地监视系统活动。例如,可以使用 WMI 开发一个应用程序,用于在 Web 服务器崩溃时呼叫管理员。 
将 WMI 与 .NET 框架一起使用 
WMI 提供了大量的规范以便为许多高端应用程序(例如,Microsoft Exchange、Microsoft SQL Server 和 Microsoft Internet 信息服务 (IIS))实现几乎任何管理任务。管理员可以执行下列任务: 
? 监视应用程序的运行状况。 
? 检测瓶颈或故障。 
? 管理和配置应用程序。 
? 查询应用程序数据(使用对象关系的遍历和查询)。 
? 执行无缝的本地或远程管理操作。 
WMI 结构由以下三层组成: 
? 客户端 
使用 WMI 执行操作(例如,读取管理详细信息、配置系统和预订事件)的软件组件。 
? 对象管理器 
提供程序与客户端之间的中间装置,它提供一些关键服务,如标准事件发布和预订、事件筛选、查询引擎等。 
? 提供程序 
软件组件,它们捕获实时数据并将其返回到客户端应用程序,处理来自客户端的方法调用并将客户端链接到所管理的基础结构。 
通过定义完善的架构向客户端和应用程序无缝地提供了数据和事件以及配置系统的能力。在 .NET 框架中,System.Management 命名空间提供了用于遍历 WMI 架构的公共类。 
除了 .NET 框架,还需要在计算机上安装 WMI 才能使用该命名空间中的管理功能。如果使用的是 Windows Millennium Edition、Windows 2000 或 Windows XP,那么已经安装了 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 管理应用程序 | 检索管理对象的集合 | 查询管理信息 | 预订和使用管理事件 | 执行管理对象的方法 | 远程处理和连接选项 | 使用强类型对象
本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/8069.htm

获取CPU序列号代码 
string cpuInfo = "";//cpu序列号 
ManagementClass cimobject = new ManagementClass("Win32_Processor"); 
ManagementObjectCollection moc = cimobject.GetInstances(); 
foreach(ManagementObject mo in moc) 

cpuInfo = mo.Properties["ProcessorId"].value.ToString(); 
Console.WriteLine(cpuInfo); 
Console.ReadLine(); 

获取网卡硬件地址 
using System.Management; 
... 
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
ManagementObjectCollection moc = mc.GetInstances(); 
foreach(ManagementObject mo in moc) 

if((bool)mo["IPEnabled"] == true) 
Console.WriteLine("MAC address/t{0}", mo["MacAddress"].ToString()); 
mo.Dispose(); 


获取硬盘ID 
String HDid; 
ManagementClass cimobject = new ManagementClass("Win32_DiskDrive"); 
ManagementObjectCollection moc = cimobject.GetInstances(); 
foreach(ManagementObject mo in moc) 

HDid = (string)mo.Properties["Model"].value; 
MessageBox.Show(HDid ); 
}

16、在.NET中轻松获取系统信息(1) -WMI篇 
Montaque 
申明: 
1、个人的一点心得,仅供参考 
2、转载时候,请保留原本。 
概述: 
不知道大家有没有这种体会?有时候为了获取系统一点点信息,比如考虑一下操作系统的版本号,或者当前屏幕的分辨率。其实说到底就是读操作系统某个方面的一个属性值而已,然后就看到我们的程序中密密麻麻的Win32 API申明,调用,代码的可读性和维护性不言而喻。到了.NET,微软提供了更为丰富的类,有很多以前要调用API的方法可以在.NET中轻而易举的调用实现。今天简单介绍一个在.NET中如何通过与WMI(Windows 管理规范)的通讯,从而得到获取信息的目的。 
主要思路: 
举一个获取操作系统共享目录和获取主板号的例子,介绍如何利用System.Managment下面的类获取系统相关的信息: 
正文: 
WMI(Windows管理规范:Windows Management Instrumentation)是Microsoft基于Web的企业管理(WBEM)的实现,同时也是一种基于标准的系统管理接口。WMI最早出现在Microsoft Windows 2000系统上,但它同样可以安装在Windows NT 4和Windows 9x计算机上。WMI是一种轻松获取系统信息的强大工具。 
在.NET中,有一个System.Management名空间(系统默认没有引用,我们可以手动添加引用),通过下面的Class的操作,可以查询系统软硬件的信息,先看一个简单的例子: 
Imports System.Management 
Dim searcher As New ManagementObjectSearcher("SELECT * FROM Win32_share") 
Dim share As ManagementObject 
For Each share In searcher.Get() 
MessageBox.Show(share.GetText(TextFormat.Mof)) 
Next share 
运行的结果是列出了所有系统当前共享的目录、以及描述等等。 
分析一下上面的代码,可以看到一下几点: 
1、似乎是在进行数据库操作,有点像SQL语句。其实就是SQL操作,这种语句被成WQL(WMI Query Language),实际上是标准SQL的一个子集加上了WMI的扩展. 
2、WQL是个只读的查询语言,我们只能查询响应的数据,不能用UPDATE,INSERT等更新操作 
3、代码很简单、通俗易懂 
4、我们采用了一种MOF(托管对象格式)的显示。 
例子二:获取当前主板的信息 
上面的例子是一个软件方面的信息,下面看一个获取硬件信息的例子,获取主板的序列号以及制造商: 
Dim searcher As New ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard") 
Dim share As ManagementObject 
For Each share In searcher.Get() 
Debug.WriteLine("主板制造商:" & share("Manufacturer")) 
Debug.WriteLine("型号:" & share("Product")) 
Debug.WriteLine("序列号:" & share("SerialNumber")) 
Next share 
总结以及补充: 
WMI类也是分层次的,具体可以参考msdn中的WMI;转向.NET平台开发的时候,最好能多看一些关于.NET新特性的介绍,这样可以大幅度的提升代码的开发效率以及运行效率在编写某些Windows管理应用程序时,能够从自定义的驱动器选择列表框中进行选择无疑是非常专业的,使用Delphi或者C++的早期版本时我们都必须使用Win32所提供的许多关于获取磁盘信息的API函数来分别获取像卷标、序列号以及剩余空间等信息,现在我们将使用.net框架和WMI(Windows Management Instrumentation - Windows 管理规范 )来实现上述功能。

  一、 简介

  若仅简单获取逻辑驱动器的名称列表我们使用.Net框架的Environment.GetLogicalDrives即可,但是若想获得更多关于磁盘驱动器的信息我们可以使用.Net框架下的System.Management 命名空间所提供的类和委托等对大量管理信息和管理事件的集合进行访问,这些信息和事件都与 WMI有关,该命名空间下的类实际上也是对WMI的一种封装,应用程序和服务可以使用从 ManagementObjectSearcher 和 ManagementQuery 派生的类,查询感兴趣的管理信息,例如在磁盘上还剩多少可用空间、当前 CPU 利用率是多少、某一应用程序正连接到哪一数据库等等,现在我们就以 C# 语言编写获取详细的逻辑驱动器信息的示例来展示.Net框架System.Management 命名空间的相关类和WMI编程,如下图: 
 


  二、技术要点

  WMI最初是内置在 Windows 2000、Windows XP 和 Windows Server 2003 系列操作系统中核心的管理支持技术,目前WMI 已经是一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的 Windows 资源例如磁盘、事件日志、文件、文件夹、文件系统、网络组件、操作系统设置、性能数据、打印机、进程、注册表设置、安全性、服务、共享、用户、组等等。在 WMI 之前,能够以编程方式访问 Windows 资源的惟一方法就是通过 Win32 API,现在我们除了使用WMI 脚本管理任何通过 WMI 公开的 Windows 资源外,还可以通过.Net框架对于WMI封装的System.Management 命名空间来轻松实现。

  我们首先使用WMI查询来获取特定类名的SelectQuery实例,可以有两种方法创建该实例,一是可以传递一个已知的类名,譬如本文需要传递的类名为:Win32_LogicalDisk,代码如下:
 

SelectQuery selectQuery = new SelectQuery("win32_logicaldisk");


  或者使用wql查询来创建查询类的实例,代码如下:
 

SelectQuery selectQuery = new SelectQuery("select * from win32_logicaldisk");


  或者只获取类的部分属性,代码如下:
 

SelectQuery selectQuery = new SelectQuery("select Name,DriveType from win32_logicaldisk");


  WQL查询语言是 SQL 的一个子集,查询通过包含以下内容限制返回的数据量1、SELECT 子句,指定只返回某些属性的数据;2、WHERE 子句,指定要返回的实例。Win32_LogicalDisk类在默认的本地MSDN里是无法找到的,只有在联机的MSDN里,Win32 and COM Development下的WMI下才能找到,同样可以使用的类还有很多很多,包含登录用户信息的Win32_Account类、包含本地和共享打印机信息的Win32_PrinterShare类等等。Win32_LogicalDisk里所包含的驱动器属性相当丰富,如下图:
 


  然后使用该指定的SelectQuery查询创建ManagementObjectSearcher实例,此类是用于检索管理信息的较为常用的入口点之一,实例创建结束,我们需要调用Get方法执行查询以便检索管理对象的集合,当调用该方法时,ManagementObjectSearcher 在指定的范围内执行给定的查询,并返回与 ManagementObjectCollection 中的查询匹配的管理对象的集合,这是就可以在一个循环中遍历集合中的所有对象,并获取我们所感兴趣的对象的属性,代码如下:
 

……
SelectQuery selectQuery = new SelectQuery("select * from win32_logicaldisk");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);

int i=0;
foreach (ManagementObject disk in searcher.Get()) {
 //获取驱动器盘符
 listView1.Items.Add(disk["Name"].ToString());
}
……

三、 程序实现

  我们使用Visual Studio 2005来创建该示例程序,首先创建C#的Windows应用程序空白项目,为解决方案和项目取名为 GetLogicDrives,在默认的Form1窗体上我们各放置一个ListView和一个Button控件,保留控件的默认名称不变,将ListView1的View属性设为Details,双击ListView1的Columns属性,为详细信息视图添加5个列,分别为:盘符、卷标、类型、容量和可用空间,设置Button1的Text属性为Refresh,为该Button1添加单击事件,代码如下:
 

private void button1_Click(object sender, EventArgs e)
{
 listView1.Items.Clear();
 SelectQuery selectQuery = new SelectQuery("select * from win32_logicaldisk");
 ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);
 int i=0;
 foreach (ManagementObject disk in searcher.Get()) {
  //盘符
  listView1.Items.Add(disk["Name"].ToString()); 
  //卷标
  try
  {
   listView1.Items[i].SubItems.Add(disk["VolumeName"].ToString());
  }
  catch
  {
   listView1.Items[i].SubItems.Add("设备未准备好");
  }
  //驱动器类型
  string DriveType;
  try
  {
   DriveType = disk["DriveType"].ToString();
   switch (DriveType)
   {
    case "0":
     listView1.Items[i].SubItems.Add("未知设备");
     break;
    case "1":
     listView1.Items[i].SubItems.Add("未分区");
     break;
    case "2":
     listView1.Items[i].SubItems.Add("可移动磁盘");
     break;
    case "3":
     listView1.Items[i].SubItems.Add("硬盘");
     break;
    case "4":
     listView1.Items[i].SubItems.Add("网络驱动器");
     break;
    case "5":
     listView1.Items[i].SubItems.Add("光驱");
     break;
    case "6":
     listView1.Items[i].SubItems.Add("内存磁盘");
     break;
  }

 }
 catch
 {
  listView1.Items[i].SubItems.Add("未知类型");
 }
 //容量
 try
 {
  listView1.Items[i].SubItems.Add(GetSizeUseUnit(disk["Size"].ToString()));
 }
 catch
 {
  listView1.Items[i].SubItems.Add("设备未准备好");
 }
 //剩余空间
 try
 {
  listView1.Items[i].SubItems.Add(GetSizeUseUnit(disk["FreeSpace"].ToString()));
 }
 catch
 {
  listView1.Items[i].SubItems.Add("设备未准备好");
 }
 i++;
}
}


  我们使用了格式化显示磁盘空间容量的自定义函数GetSizeUseUnit,当不使用该函数时磁盘容量和可用空间的显示如下:

 

private string GetSizeUseUnit(string size)
{
 double dSpace = Convert.ToDouble(size);
 string sSpace = dSpace.ToString("N");
 string[] tmp;
 string rtnSize = "0";

 tmp = sSpace.Split(',');
 switch (tmp.GetUpperBound(0))
 {
  case 0:
   rtnSize = tmp[0] + " 字节";
   break;
  case 1:
   rtnSize = tmp[0] + "." + tmp[1].Substring(0,2) + " K";
   break;
  case 2:
   rtnSize = tmp[0] + "." + tmp[1].Substring(0, 2) + " M";
   break;
  case 3:
   rtnSize = tmp[0] + "." + tmp[1].Substring(0, 2) + " G";
   break;
  case 4:
   rtnSize = tmp[0] + "." + tmp[1].Substring(0, 2) + " T";
   break;
 }
 return rtnSize;
}


  使用了上述自定义格式化显示的函数后,磁盘容量和可用空间的显示就显得非常简洁和直观。

  最后,为了确保在窗体启动时自动获取驱动器信息,需要在窗体的Load事件中模拟对Button1的单击操作,代码如下:
 

private void Form1_Load(object sender, EventArgs e)
{
 button1_Click(sender, e);
}


  四、 总结
  
  我们利用.net框架System.Management 命名空间所提供的WMI封装非常简单的实现了获取逻辑驱动器的详细信息,除了上述信息我们还可以轻松的获取Windows资源大部分信息,比起使用Win32API要更加简单和有效。该示例程序在Windows XP SP2 + Visual Studio 2005 下编译和调试通过。

//win32_logicaldisk
//导入dll:解决方案 ==> 引用 ==> 添加引用 ==> COM ==> System.Management.dll --C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322
using System;
using System.Management;
class disk //数据管理对象
{
   public static void Main()
    {
      //创建 C: 的实例
       ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=/"c:/"");
       disk.Get(); 
       Console.WriteLine("磁盘大小"+disk["Size"]+"bytes"); //打印C:大小,单位bytes
    }




确定计算机名称或 IP 地址是物理计算机还是虚拟 IP 地址 CIMV2:Win32_ComputerSystem
在远程计算机上运行进程 CIMV2:Win32_Process
确定远程计算机中是否存在某个目录 CIMV2:Win32_Directory 
停止/启动 IIS System.Diagnostics.Process
将程序集添加到全局程序集缓存 (GAC) System.Diagnostics.Process
注册和配置 GAM 组件 COMAdmin 目录 (COM 1.0) 
创建 Web 站点 System.DirectoryServices.DirectoryEntry 

//可以用此方法来选择集合中的部份记录 "SELECT * FROM Win32_Service WHERE Name = 'ServiceName'",

"Win32_LogicalDisk" 类 //通过它我们可以查看到本地驱动器

ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * From Win32_LogicalDisk "); //查询
ManagementObjectCollection queryCollection = query.Get(); //Get获取集合并赋给 Collention
foreach ( ManagementObject mo in queryCollection) //偏历集合

    Console.WriteLine("type:"+mo["DriveType"].ToString());
    sConsole.WriteLine("Drive: " + mo["Name"].ToString()); //打印出所有驱动器
}


"Win32_Environment" 类 //环境变量
using System;
using System.Management;
public class EnumerateInstances
{
   public static void Main() 
    {
       SelectQuery query = new SelectQuery("Win32_Environment");
       ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 
      foreach (ManagementBaseObject envVar in searcher.Get())
          Console.WriteLine("Variable : {0}, Value = {1}",envVar["Name"],envVar["VariableValue"]);
    }
}

"Win32_OperatingSystem" 类 //操作系统信息
Console.WriteLine( "操作系统: " + mo["Caption"]);
Console.WriteLine( "版本号: " + mo["Version"]);
Console.WriteLine( "制造商: " + mo["Manufacturer"]);
Console.WriteLine( "计算机名: " +mo["csname"]);
Console.WriteLine("Windows目录: " + mo["WindowsDirectory"]);

"Win32_Service" 类 //系统服务

//输出默认站点的目录结构
using System; 
using System.DirectoryServices; 
class IISFolderList 

   static void ListFolder(DirectoryEntry paraEntry, int paraIndent) 
    { 
      for(int i=paraIndent; i>0; i--) 
       Console.Write(' '); 
       Console.WriteLine(paraEntry.Name); 
       paraIndent++; 
      foreach(DirectoryEntry tempEntry in paraEntry.Children) 
          ListFolder(tempEntry,paraIndent); 
       paraEntry.Dispose(); 
    } 
   static void Main(string[] args) 
    { 
       ListFolder(new DirectoryEntry("IIS://localhost/W3SVC/1/Root"),0); 
    } 

 

原文:https://blog.csdn.net/highfly2008/article/details/3860892

你可能感兴趣的:(C#)