首页 > 开发 > 综合 > 正文

Visual C#中用WMI获取远程计算机信息

2024-07-21 02:27:34
字体:
来源:转载
供稿:网友
如果不使用wmi,想要获取远程计算机的系统数据,最常用的方法就是在远程计算机上运行一个客户端程序,本地机通过和这个客户端程序来获取远程计算机的系统数据。这种实现方法无论是程序设计还是后面的程序分发都是及其困难的。而使用wmi,一切就显得非常简单。下面介绍的这个示例,其功能是利用wmi获取远程计算机硬盘数据。各位只需对这个程序稍加修改,就可以获得远程计算机的其他数据。下面是具体的实现步骤:

  版权声明:任何获得天极网授权的网站,转载时请务必保留作者信息和以下链接
  天极开发asp.net专栏:http://dev.yesky.com/msdn/msdnc

  1. 首先启动visual studio .net,依次选择"文件"、"新建"、"项目"菜单后,在弹出"新建项目"对话框中将"项目类型"设置为"visual c#项目",将"模板"设置为"windows应用程序",在"名称"文本框中输入"获得远程计算机硬盘信息",在"位置"的文本框中输入"e:/vs.net项目",然后单击"确定"按钮。这样在"e:/vs.net项目"目录中就创建了一个新的文件夹"获得远程计算机硬盘信息",里面存放的就是"获得远程计算机硬盘信息"的项目文件。

  2. 由于visual studio .net缺省的编译环境中并没有包括命名空间"system.management"所位于的文件"system.management.dll",所以首先要在项目文件中引入此dll文件。具体的步骤如下:

  选中【解决方案资源管理器】中的【引用】,单击鼠标右键,在弹出的菜单中,选择【添加引用】,具体如图05所示:


图05:添加引用

  在弹出【添加引用】对话框中,选择【.net】页面,在【组件名称】栏中选择【system.managemen】后,单击【选择】按钮,此时在【选定的组件】栏中就加入了【system.managemen】,然后单击【确定】按钮,则在visual studio .net集成开发环境中就引入命名空间"system.managemen"。具体如图06所示:


图06:添加引用

  3. 在【解决方案资源管理器】窗口中,双击form1.cs文件,进入form1.cs文件的编辑界面。

  4. 在form1.cs文件的开头,用下列导入命名空间代码替代系统缺省的导入命名空间代码。

using system ;
using system.drawing ;
using system.collections ;
using system.componentmodel ;
using system.windows.forms ;
using system.data ;
using system.management ;
//wmi操作类位于的命名空间
  5. 把visual studio .net当前窗口切换到【form1.cs(设计)】窗口,并从【工具箱】中的【windows窗体组件】中往窗体中拖入下列组件,并执行相应操作:

  三个textbox组件,分别输入远程计算机名称或ip地址,远程计算机的超级用户帐户和口令。

  一个listbox组件,用以显示远程计算机硬盘信息。

  三个label组件。

  一个button组件,名称为button1,拖入窗体后,双击此组件,则系统会在form1.cs中自动产生其click事件对应的处理代码。

  6. 按照表05中的数据调整各组件属性对应的数值:

组件类型组件名称属性设置结果
formform1text获取远程计算机硬盘信息
form1formborderstyle fixedsingle
form1maximizebox false
labellabel1 text 远程计算机名或ip地址:
label2text拥有wmi权限的用户名:
label3 text口令:
textboxtextbox1text""
textbox2text""
textbox3passwordchar*
textbox3text""
buttonbutton1text 获得硬盘信息
 button1flatstyleflat
      表05:【获得远程计算机硬盘信息】项目窗体中各组件的主要属性设定数值表

  并按照图07中各组件的位置和排列顺序调整窗体中组件的位置和排列顺序:


图07:【获得远程计算机硬盘信息】项目的设计界面

  7. 把visual studio .net的当前窗口切换到form1.cs文件的编辑窗口,并用下列代码替换form1.cs中的button1的click事件对应的处理代码。下列代码的作用是对远程计算机进行wmi查询,提起查询得到数据,并显示结果:

private void button1_click ( object sender , system.eventargs e )
{
 long mb = 1048576 ;
 //1024x1024
 //设定生成的wmi所需的所有设置
 system.management.connectionoptions conn = new connectionoptions ( ) ;
 //设定用于wmi连接操作的用户名
 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 ( "磁盘名称:" + 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 ,"出现错误!" ) ;
 }
}

  8. 至此,在上述步骤都正确完成后,【获取远程计算机硬盘信息】项目的全部工作也就完成了。此时单击快捷键f5运行程序。在正确输入远程计算机的ip地址或用户名,远程计算机超级用户名和口令后,单击【获取硬盘信息】按钮,则程序会获取的指定计算机的硬盘的数据并显示出来,具体如图08所示:


图08:【获得远程计算机硬盘信息】的运行界面

  怎么样,是否有一种做黑客的感觉。下面将介绍使用wmi完成一项更"酷"的程序。通过此程序将重启或关闭远程计算机。菜鸟学堂:
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表