- 浏览: 12626 次
最新评论
用C#和WMI获取逻辑驱动器详细信息
2010年08月18日
一、 简介
若仅简单获取逻辑驱动器的名称列表我们使用.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,代码如下:
或者使用wql查询来创建查询类的实例,代码如下:
或者只获取类的部分属性,代码如下:
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(dis k["Size"].ToString())); } catch { listView1.Items[i].SubItems.Add("设备未准备好"); } //剩余空间 try { listView1.Items[i].SubItems.Add(GetSizeUseUnit(dis k["FreeSpace"].ToString())); } catch { listView1.Items[i].SubItems.Add("设备未准备好"); } i++; } }
发表评论
-
IP组播技术介绍及实现例子
2012-01-20 08:49 644IP组播技术介绍及实现 ... -
Windows钩子编程1
2012-01-20 08:49 543Windows钩子编程1 2010年12月29日 一、什 ... -
铸造厂ERP--设备管理信息子系统
2012-01-20 08:49 771铸造厂ERP--设备管理信息子系统 2011年01月01日 ... -
十二星娃冷血排行(娱乐的态度看看就好。。。姐姐我进前三甲了。。。)と各种测试~~
2012-01-19 13:54 882十二星娃冷血排行(娱乐 ... -
〖微小说〗盖大楼【二十六】
2012-01-19 13:54 576〖微小说〗盖大楼【二十六】 2011年11月25日 女友 ... -
围脖文字
2012-01-19 13:54 575围脖文字 2011年11月09日 ... -
2010年11月
2012-01-19 13:54 6092010年11月 2010年11月23日 ... -
星座女们。
2012-01-19 13:54 705星座女们。 2011年06月01 ... -
Incredible S 应用小教程(HTC G11)
2012-01-17 03:44 811Incredible S 应用小教程(HTC G11) 20 ... -
这样做电脑速度回到当初刚买时
2012-01-17 03:44 878这样做电脑速度回到当 ... -
如何将Windows XP加速到极限
2012-01-17 03:44 695如何将Windows XP加速到极 ... -
题库2
2012-01-17 03:44 843题库2 2011年12月26日 6.在下列的说法中,错误 ... -
计算机基础6
2012-01-17 03:43 544计算机基础6 2011年08月1 ... -
小学生期末评语经典大全
2012-01-16 02:21 582小学生期末评语经典大全 2011年12月15日 1.你是 ... -
小学二年级操行评语1
2012-01-16 02:21 807小学二年级操行评语1 2 ... -
如何批改小学生作文2
2012-01-16 02:21 586如何批改小学生作文2 2009年10月08日 我的妈妈 ... -
论文 小学生作文教学研究
2012-01-16 02:20 503论文 小学生作文教学研 ... -
小学生作文教学生活化
2012-01-16 02:20 466小学生作文教学生活化 2010年07月22日 小学 ...
相关推荐
主要用于wmi方式获取c盘序列号,多用于生成硬件识别码,wmi可以获取很多设备信息,可以扩展到其他设备。但是wmi速度慢,而且有一定的局限性,有些环境获取不了,比如虚拟机。另一种更底层的方式是使用...
电脑硬件信息 硬盘 CD-ROM USB 添加自己的属性 用C#和WMI获取逻辑驱动器详细信息 获取磁盘信息的API函数来分别获取像卷标、序列号以及剩余空间等信息 .Net框架System.Management 命名空间的相关类和WMI编程
C#非wmi获取CPU处理器使用率,各核心使用率。
如何获取硬件信息(CPU ID,主板信息,硬盘序列,系统信息 ,内存信息,BIOS信息等),非常全,所有WMI Class 都包
C# 调用WMI 获取系统信息,源代码及示例。
C#中用WMI获取服务器信息-A
开发环境:Visual Studio V2010 .NET Framework 4 Client ...namespace Splash.IO.PORTS{/// <summary>/// 即插即用设备信息结构/// </summary>public struct PnPEntityInfo{public String PNPDeviceID; // 设备I
1、C#读取显卡硬件信息
c#使用WMI更改IP地址注释写的非常清楚,示例简单,可用性高
此软件显示了所有WMI能够抓取出来的所有信息.
近期公司要让写个远程监控进程的内存和cpu百分比,自己写了个程序,主要功能就是监控多台机器指定进程的cpu占比和内存消耗
WMI获取远程服务器CPU,内存使用率函数源代码,主要解决Win32_LogicalMemoryConfiguration不能用的问题
通过C#程序实时读取硬件信息及更新显示,本人亲测!
CC++通过WMI和系统API函数获取获取系统硬件配置信息
利用WMI技术获取系统相关信息: 1.硬件配置 2.设备驱动 3.环境变量 4.内存信息 5.网卡信息 6.处理器信息 7.进程信息 8.显卡信息 并能查询WMI各类数据
通过C++实现用WMI获取操作系统补丁信息,脱离了以往获取此类信息对注册表的依赖。此代码是MFC中的DLL,同时采用了虚拟接口技术。
C#利用WMI技术可以远程重启,关闭主机,也可以远程操作主机。
使用wmi查询驱动设备信息
Python用WMI模块获取Windows系统的硬件信息:硬盘分区、使用情况,内存大小,CPU型号,当前运行的进程,自启动程序及位置,系统的版本等信息。 本文实例讲述了python使用wmi模块获取windows下的系统信息 监控系统 ...
使用j-Interop实现java连接wmi获取windows系统信息的例子 可以直接导入MyEclipse运行,能够获取CPU,主板,显卡,声卡,网卡,以及CPU使用率,内存使用率等