ManagementClass类解析和C#如何获取硬件的相关信息
在.NET的项目中,有时候需要获取计算机的硬件的相关信息,在C#语言中需要利用ManagementClass这个类来进行相关操作。
现在先来介绍一下ManagementClass类,首先看一下类的继承结构:

现在看一下MSDN对ManagementClass类的解释,对表示一个通用信息模型 (CIM) 管理类。 管理类是 WMI 类,如 Win32_LogicalDisk, ,该类型可表示一个磁盘驱动器,并 Win32_Process, ,它表示的进程 Notepad.exe 等。 此类的成员可以访问 WMI 数据,使用一个特定的 WMI 类路径。
一. 接下来我们来看一下ManagementClass类中一些较为常用的方法的源码:
1.GetInstances():此方法存在四个重载
下面提供一下GetInstances(EnumerationOptions options)重载版本的代码:
public ManagementObjectCollection GetInstances(EnumerationOptions options)
{
if ((null == Path) || (null == Path.Path) || ( == Path.Path.Length))
throw new InvalidOperationException(); Initialize ( false );
IEnumWbemClassObject enumWbem = null; EnumerationOptions o = (null == options) ? new EnumerationOptions() : (EnumerationOptions)options.Clone();
o.EnsureLocatable = false; o.PrototypeOnly = false; SecurityHandler securityHandler = null;
int status = (int)ManagementStatus.NoError; try
{
securityHandler = Scope.GetSecurityHandler();
status = scope.GetSecuredIWbemServicesHandler(Scope.GetIWbemServices() ).CreateInstanceEnum_(ClassName,
o.Flags,
o.GetContext(),
ref enumWbem
);
}
finally
{
if (securityHandler != null)
securityHandler.Reset();
} if (status < )
{
if ((status & 0xfffff000) == 0x80041000)
ManagementException.ThrowWithExtendedInfo((ManagementStatus)status);
else
Marshal.ThrowExceptionForHR(status);
} return new ManagementObjectCollection(Scope, o, enumWbem);
}
2.Get():

下面提供一下Get()重载版本的代码:
public ManagementObjectCollection Get()
{
Initialize ();
IEnumWbemClassObject ew = null;
SecurityHandler securityHandler = scope.GetSecurityHandler();
EnumerationOptions enumOptions = (EnumerationOptions)options.Clone(); int status = (int)ManagementStatus.NoError; try
{
if ((query.GetType() == typeof(SelectQuery)) &&
(((SelectQuery)query).Condition == null) &&
(((SelectQuery)query).SelectedProperties == null) &&
(options.EnumerateDeep == true))
{
enumOptions.EnsureLocatable = false; enumOptions.PrototypeOnly = false; if (((SelectQuery)query).IsSchemaQuery == false)
{
status = scope.GetSecuredIWbemServicesHandler( scope.GetIWbemServices() ).CreateInstanceEnum_(
((SelectQuery)query).ClassName,
enumOptions.Flags,
enumOptions.GetContext(),
ref ew);
}
else
{
status = scope.GetSecuredIWbemServicesHandler(scope.GetIWbemServices() ).CreateClassEnum_(((SelectQuery)query).ClassName,
enumOptions.Flags,
enumOptions.GetContext(),
ref ew );
}
}
else
{
enumOptions.EnumerateDeep = true;
status = scope.GetSecuredIWbemServicesHandler(scope.GetIWbemServices() ).ExecQuery_(
query.QueryLanguage,
query.QueryString,
enumOptions.Flags,
enumOptions.GetContext(),
ref ew );
}
}
catch (COMException e)
{
//
ManagementException.ThrowWithExtendedInfo(e);
}
finally
{
securityHandler.Reset();
} if ((status & 0xfffff000) == 0x80041000)
{
ManagementException.ThrowWithExtendedInfo((ManagementStatus)status);
}
else if ((status & 0x80000000) != )
{
Marshal.ThrowExceptionForHR(status);
}
return new ManagementObjectCollection(scope, options, ew);
}
3.GetSubclasses():此方法存在四个重载版本

下面提供一下GetSubclasses(EnumerationOptions options)重载版本的代码:
public ManagementObjectCollection GetSubclasses(EnumerationOptions options)
{
if (null == Path)
throw new InvalidOperationException(); Initialize ( false ) ;
IEnumWbemClassObject enumWbem = null;
EnumerationOptions o = (null == options) ? new EnumerationOptions() : (EnumerationOptions)options.Clone();
o.EnsureLocatable = false; o.PrototypeOnly = false;
SecurityHandler securityHandler = null;
int status = (int)ManagementStatus.NoError; try
{
securityHandler = Scope.GetSecurityHandler();
status = scope.GetSecuredIWbemServicesHandler( Scope.GetIWbemServices() ).CreateClassEnum_(ClassName,
o.Flags,
o.GetContext(),
ref enumWbem);
}
finally
{
if (securityHandler != null)
securityHandler.Reset();
} if (status < )
{
if ((status & 0xfffff000) == 0x80041000)
ManagementException.ThrowWithExtendedInfo((ManagementStatus)status);
else
Marshal.ThrowExceptionForHR(status);
} return new ManagementObjectCollection(Scope, o, enumWbem);
}
以上是对ManagementClass类的部分谁明,此类型的所有公共静态成员都是线程安全的。不保证所有实例成员都是线程安全的。
二.ManagementClass类的部分应用:
1.获得CPU编号
/// <summary>
/// 获得CPU编号
/// </summary>
/// <returns></returns>
public string GetCpuid()
{
var cpuid = string.Empty;
var mc = new ManagementClass("Win32_Processor");
var moc = mc.GetInstances();
foreach (var o in moc)
{
var mo = (ManagementObject) o;
cpuid = mo.Properties["ProcessorId"].Value.ToString();
}
return cpuid;
}
2.获取硬盘序列号
/// <summary>
/// 获取硬盘序列号
/// </summary>
/// <returns></returns>
public string GetDiskSerialNumber()
{
//这种模式在插入一个U盘后可能会有不同的结果,如插入我的手机时
var hDid = string.Empty;
var mc = new ManagementClass("Win32_DiskDrive");
var moc = mc.GetInstances();
foreach (var o in moc)
{
var mo = (ManagementObject) o;
hDid = (string)mo.Properties["Model"].Value;
//这名话解决有多个物理盘时产生的问题,只取第一个物理硬盘
break;
}
return hDid;
}
3.获取网卡硬件地址
/// <summary>
/// 获取网卡硬件地址
/// </summary>
/// <returns></returns>
public string GetMacAddress()
{
var mac = "";
var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
var moc = mc.GetInstances();
foreach (var o in moc)
{
var mo = (ManagementObject) o;
if (!(bool) mo["IPEnabled"]) continue;
mac = mo["MacAddress"].ToString();
break;
}
return mac;
}
4.获取IP地址
/// <summary>
/// 获取IP地址
/// </summary>
/// <returns></returns>
public string GetIpAddress()
{
var st = string.Empty;
var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
var moc = mc.GetInstances();
foreach (var o in moc)
{
var mo = (ManagementObject) o;
if (!(bool) mo["IPEnabled"]) continue;
var ar = (Array)(mo.Properties["IpAddress"].Value);
st = ar.GetValue().ToString();
break;
}
return st;
}
5.操作系统的登录用户名
/// <summary>
/// 操作系统的登录用户名
/// </summary>
/// <returns></returns>
public string GetUserName()
{
return Environment.UserName;
}
6.获取计算机名
/// <summary>
/// 获取计算机名
/// </summary>
/// <returns></returns>
public string GetComputerName()
{
return Environment.MachineName;
}
7.操作系统类型
/// <summary>
/// 操作系统类型
/// </summary>
/// <returns></returns>
public string GetSystemType()
{
var st = string.Empty;
var mc = new ManagementClass("Win32_ComputerSystem");
var moc = mc.GetInstances();
foreach (var o in moc)
{
var mo = (ManagementObject) o;
st = mo["SystemType"].ToString();
}
return st;
}
8.物理内存
/// <summary>
/// 物理内存
/// </summary>
/// <returns></returns>
public string GetPhysicalMemory()
{
var st = string.Empty;
var mc = new ManagementClass("Win32_ComputerSystem");
var moc = mc.GetInstances();
foreach (var o in moc)
{
var mo = (ManagementObject) o;
st = mo["TotalPhysicalMemory"].ToString();
}
return st;
}
9.显卡PNPDeviceID
/// <summary>
/// 显卡PNPDeviceID
/// </summary>
/// <returns></returns>
public string GetVideoPnpid()
{
var st = "";
var mos = new ManagementObjectSearcher("Select * from Win32_VideoController");
foreach (var o in mos.Get())
{
var mo = (ManagementObject) o;
st = mo["PNPDeviceID"].ToString();
}
return st;
}
10.声卡PNPDeviceID
/// <summary>
/// 声卡PNPDeviceID
/// </summary>
/// <returns></returns>
public string GetSoundPnpid()
{
var st = string.Empty;
var mos = new ManagementObjectSearcher("Select * from Win32_SoundDevice");
foreach (var o in mos.Get())
{
var mo = (ManagementObject) o;
st = mo["PNPDeviceID"].ToString();
}
return st;
}
11.CPU版本信息
/// <summary>
/// CPU版本信息
/// </summary>
/// <returns></returns>
public string GetCpuVersion()
{
var st = string.Empty;
var mos = new ManagementObjectSearcher("Select * from Win32_Processor");
foreach (var o in mos.Get())
{
var mo = (ManagementObject) o;
st = mo["Version"].ToString();
}
return st;
}
12.CPU名称信息
/// <summary>
/// CPU名称信息
/// </summary>
/// <returns></returns>
public string GetCpuName()
{
var st = string.Empty;
var driveId = new ManagementObjectSearcher("Select * from Win32_Processor");
foreach (var o in driveId.Get())
{
var mo = (ManagementObject) o;
st = mo["Name"].ToString();
}
return st;
}
13. CPU制造厂商
/// <summary>
/// CPU制造厂商
/// </summary>
/// <returns></returns>
public string GetCpuManufacturer()
{
var st = string.Empty;
var mos = new ManagementObjectSearcher("Select * from Win32_Processor");
foreach (var o in mos.Get())
{
var mo = (ManagementObject) o;
st = mo["Manufacturer"].ToString();
}
return st;
}
14.主板制造厂商
/// <summary>
/// 主板制造厂商
/// </summary>
/// <returns></returns>
public string GetBoardManufacturer()
{
var query = new SelectQuery("Select * from Win32_BaseBoard");
var mos = new ManagementObjectSearcher(query);
var data = mos.Get().GetEnumerator();
data.MoveNext();
var board = data.Current;
return board.GetPropertyValue("Manufacturer").ToString();
}
15.主板编号
/// <summary>
/// 主板编号
/// </summary>
/// <returns></returns>
public string GetBoardId()
{
var st = string.Empty;
var mos = new ManagementObjectSearcher("Select * from Win32_BaseBoard");
foreach (var o in mos.Get())
{
var mo = (ManagementObject) o;
st = mo["SerialNumber"].ToString();
}
return st;
}
16.主板型号
/// <summary>
/// 主板型号
/// </summary>
/// <returns></returns>
public string GetBoardType()
{
var st = string.Empty;
var mos = new ManagementObjectSearcher("Select * from Win32_BaseBoard");
foreach (var o in mos.Get())
{
var mo = (ManagementObject) o;
st = mo["Product"].ToString();
}
return st;
}
以上的获取硬件信息的方法可以直接封装在一个类中,可以在项目中直接引用,这样可以加快项目的开发速度。
ManagementClass类解析和C#如何获取硬件的相关信息的更多相关文章
- C#获取电脑的相关信息
/* 创建者:菜刀居士的博客 * 创建日期: 2014年08月31号 * 功能:获取电脑的相关信息 * */ namespace Net.String.ConsoleApplication { ...
- 获取Java系统相关信息
package com.test; import java.util.Properties; import java.util.Map.Entry; import org.junit.Test; pu ...
- .Net中获取打印机的相关信息
原文:.Net中获取打印机的相关信息 新项目中牵涉到对打印机的一些操作,最重要的莫过于获取打印机的状态,IP等信息,代码量不大,但是也是自己花了一点时间总结出来的,希望能帮助需要的朋友. Printe ...
- Cordova各个插件使用介绍系列(六)—$cordovaDevice获取设备的相关信息
详情请看:Cordova各个插件使用介绍系列(六)—$cordovaDevice获取设备的相关信息 在项目中需要获取到当前设备,例如手机的ID,联网状态,等,然后这个Cordova里有这个插件可以用, ...
- 通过request对象获取客户端的相关信息
通过request对象获取客户端的相关信息 制作人:全心全意 通过request对象可以获取客户端的相关信息.例如HTTP报头信息.客户信息提交方式.客户端主机IP地址.端口号等等. request获 ...
- NX二次开发-UF_ASSEM_ask_component_data获取装配部件的相关信息
NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_assem.h> ], void* user_ ...
- $_SERVER['HTTP_USER_AGENT']:在PHP中HTTP_USER_AGENT是用来获取用户的相关信息的,包括用户使用的浏览器,操作系统等信息
在PHP中HTTP_USER_AGENT是用来获取用户的相关信息的,包括用户使用的浏览器,操作系统等信息. 我机器:操作系统:WIN7旗舰版 64操作系统 以下为各个浏览器下$_SERVER['HTT ...
- Android实现获取应用程序相关信息列表的方法
本文所述为Androdi获取手机应用列表的方法,比如获取到Android应用的软件属性.大小和应用程序路径.应用名称等,获取所有已安装的Android应用列表,包括那些卸载了的,但没有清除数据的应用程 ...
- asp.net C#获取程序文件相关信息
代码如下 复制代码 using System.Reflection;using System.Runtime.CompilerServices; //// 有关程序集的常规信息是通过下列// 属性集控 ...
随机推荐
- LabVIEW 吸星大法 - 看见的好东西都是我的(下篇)
前言 写了多年的LabVIEW程序,你是否面临这样的问题 总是在做一些重复的工作,感觉很没有意思: 总在不停的写代码,做类似的控件,实现相同的功能,丝毫没有成就感: 总在天加班,没有时间去提高自己; ...
- redis主从复制配置
master配置 主要是下面配置 # ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the # intern ...
- Comparing the MSTest and Nunit Frameworks
I haven't seen much information online comparing the similarities and differences between the Nunit ...
- asp.net 使用DroDownList来实现二级联动
今天做新闻发布系统的时候,用到了二级联动,我把使用方法记录下来,以便日后查阅以及帮助新手朋友们.下面是效果图: 下面来讲解一下实现的方法: 1.在.aspx页面中,拖入两个DroDownList控件. ...
- Filter 数组过滤函数精解示例
'************************************************************************* '**模 块 名:Filter 数组过滤函数精解示 ...
- Your awesome titleHH
Welcome to Jekyll! Your awesome titleHH About Blogging Like a Hacker Welcome to Jekyll! Jan 9, 2016 ...
- SQL Server 变更数据捕获(CDC)监控表数据
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现过程(Realization) 补充说明(Addon) 参考文献(References) ...
- HTTPS工作原理
HTTPS是什么 HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,及以安全为目标的HTTP通道,简单说就是HTTP的安全版本. ...
- PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析
Python黑帽编程1.5 使用Wireshark练习网络协议分析 1.5.0.1 本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks At ...
- (源码下载)高灵活度,高适用性,高性能,轻量级的 ORM 实现
我在上一篇博客中简单说明了一个面向内存数据集的“ORM”的实现方法,也提到我的设计实现或许不能称之为“ORM”,姑且称之为 S-ORM吧. 可能有些小伙伴没有理解我的思路和目的,与传统ORM框架做了简 ...