楼主,我介绍你一个好东西吧: Management (WMI) Extensions for Visual Studio .NET 2003 Server Explorer http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=62d91a63-1253-4ea6-8599-68fb3ef77de1安装后在VS.NET的“服务器资源管理器”里面多了两个东西,“管理类”和“管理事件”,通过它你可以很快的生成你要的WMI功能,比如关机功能。步骤如下: 1,展开“管理类”,右击“操作系统”,然后选择“生成管理的类”,就可以得到所有有关操作系统的WMI功能了。你要的关机功能在:OperatingSystem.Win32Shutdown
Management (WMI) Extensions for Visual Studio .NET 2003 Server Explorer
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=62d91a63-1253-4ea6-8599-68fb3ef77de1安装后在VS.NET的“服务器资源管理器”里面多了两个东西,“管理类”和“管理事件”,通过它你可以很快的生成你要的WMI功能,比如关机功能。步骤如下:
1,展开“管理类”,右击“操作系统”,然后选择“生成管理的类”,就可以得到所有有关操作系统的WMI功能了。你要的关机功能在:OperatingSystem.Win32Shutdown
WMI的功能是十分强大的,通过WMI可以实现很多原来被认为很困难的工作,并且它也是.Net FrameWork SDK的很好的补充,尤其在现在,.Net FrameWork SDK功能还并不十分完备,有效的利用WMI的确可以简化很多本来很困难的问题。
利用WMI不仅可以解决本地机的很多问题,而且还可以用来编写网络应用程序,比如通过WMI获取远程计算机的各种数据信息、控制远程计算机的各种行为,而这就像操作本地机一样方便。而这只有一个前提条件,那就是必须知道远程计算机的超级用户和对应的口令。
一、简介C#中操作WMI使用的类库
.Net FrameWork SDK对WMI提供了全面的支持,.Net FrameWork SDK为C#能够操作WMI提供了一个专门的命名空间System.Management。在命名空间System.Management中提供了大量用以处理和WMI相关的类、接口和枚举。
命名空间System.Management中的成员是很复杂的,由于篇幅所限完全介绍这些成员是不可能的,也是没有要的。根据我的经验,认为要了解以及掌握在C#中使用WMI,下面六个类应该是学习的重点,分别是ConnectionOptions、ManagementScope、ObjectQuery、ManagementObjectSearcher、ManagementObject-Collection和ManagementObject。下面就简单介绍一下六个类。
1.ConnectionOptions类
ConnectionOptions类主要的功能是为建立的WMI连接提供所需的所有设置。在利用WMI对远程计算机进行操作的时候,首先要进行WMI连接,WMI连接主要是使用的是ManagementScope类,成功完成WMI连接就要提供远程计算机WMI用户名和口令。ConnectionOptions类可以通过其属性来提供这些信息。下表是ConnectionOptions类的一些主要属性及其简单的说明:
属性 说明
Authority 获取或设置将用于验证指定用户的权利
Locale 获取或设置将用于连接操作的区域设置
Password 提供用于WMI连接操作的口令
Username 提供用于WMI连接操作的用户名 2.ManagementScope类
通过ManagementScope类能够建立和远程计算机(或者本地计算机)的WMI连接,表示管理可操作范围。创建WMI连接可以通过二种方法:
(1)利用构造函数,当使用下面构造函数初始化ManagementScope类实例,同时也就建立了WMI连接,具体如下:
public ManagementScope(
string path ,
ConnectionOptions options
) ;
其中,参数path表示ManagementScope的服务器和命名空间,options包含有关连接的选项的ConnectionOptions。
使用构造函数是有风险的,因为如果不能根据提供的选项建立WMI连接,程序会抛出异常。下列代码是利用此构造函数构建建立ManagementScope实例,并建立于远程计算机majinhu的WMI连接:
System.Management.ConnectionOptions Conn = new ConnectionOptions();
Conn.Username = "WMI用户名";
Conn.Password = "此用户名对应口令";
System.Management.ManagementScope Ms = new ManagementScope("\\\\majinhu\\root\\cimv2", Conn) ;
//设定生成的WMI所需的所有设置
System.Management.ConnectionOptions Conn = new ConnectionOptions();
Conn.Username = textBox2.Text; //用户名
Conn.Password = textBox3.Text; //口令
//设定用于执行WMI操作的范围
System.Management.ManagementScope Ms = new ManagementScope( "\\\\" + textBox1.Text + "\\root\\cimv2", Conn);
try
{
//连接到实际操作的WMI范围
Ms.Connect();
//设定通过WMI要查询的内容
ObjectQuery Query = new ObjectQuery("select FreeSpace ,Size ,Name from Win32_LogicalDisk where DriveType=3");
//WQL语句,设定的WMI查询内容和WMI的操作范围,检索WMI对象集合
ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Ms, Query);
//异步调用WMI查询
ManagementObjectCollection ReturnCollection = Searcher.Get(); //****************察看硬盘信息********************************
double free = 0;
double use = 0;
double total = 0;
listBox1.Items.Clear();
//通过对产生的WMI的实例集合进行检索,获得硬盘信息
foreach (ManagementObject Return in ReturnCollection)
{
listBox1.Items.Add("========================");
listBox1.Items.Add("磁盘名称:" + Return["Name"].ToString());
free = Convert.ToInt64(Return["FreeSpace"]) / mb; //获得硬盘的可用空间
use = (Convert.ToInt64(Return["Size"]) - Convert.ToInt64(Return["FreeSpace"])) / mb;//获得硬盘的已用空间
//获得硬盘的合计空间
total = Convert.ToInt64( Return["Size"]) / mb;
listBox1.Items.Add( " 总计:" + total.ToString() + "MB");
listBox1.Items.Add( "已用空间:" + use.ToString() + "MB");
listBox1.Items.Add( "可用空间:" + free.ToString() + "MB");
}
//************************************************************ }
catch(Exception ee)
{
MessageBox.Show("连接" + textBox1.Text + "出错,出错信息为:" + ee.Message, "出现错误!");
}
textBox2-----远程计算机用户名
textBox3-----远程计算机密码