WMI问题答案集锦http://www.uncj.net/news/show.aspx?id=77

解决方案 »

  1.   

    楼主,我介绍你一个好东西吧:
    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
      

  2.   

    WMI是Windows Management Instrumentation的简称,即“视窗管理规范”。早在Windows NT4.0时就已经开始支持WMI了,但WMI核心组件并没有随着NT4.0一起发布,如果要在NT4.0下支持WMI,就需要安装WMI的核心组件,你可以在VS.NET企业构建版中的第五张盘中的“WMI”目录中找到它。在NT4.0下安装WMI核心组件,必须保证NT 4.0版本为Service Pack 4.0或者更新的版本。如果您的机器使用的系统是Windows 2000或以后的版本,那么就没有这么麻烦了,因为WMI是默认安装的。
      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) ;
      

  3.   

    long mb = 1048576; //1024x1024 
    //设定生成的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, "出现错误!"); 
    }
      

  4.   

    textBox1-----输入的是远程计算机ip或计算机名
    textBox2-----远程计算机用户名
    textBox3-----远程计算机密码