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; //// 有关程序集的常规信息是通过下列// 属性集控 ...
随机推荐
- HDU3465 树状数组逆序数
Life is a Line Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)T ...
- C++风格的回调对象方法. 采用template实现
今天看了一篇文章,收藏一下代码.读一读很有激情 #include <iostream> #include <string> #include <vector> us ...
- DoTween 应用设置
一.下载 官方下载地址:http://dotween.demigiant.com/download.php 二.安装 1.把下载到压缩包中的DOTween文件夹拷贝到项目文件中 2.安装DOTween ...
- HTML基础篇之知识点补充和拓展
<tbody>标签 <tbody>如果表格内容非常多的时候,如果加上这个标签它会让这个表格全部下载好才会显示.用在表格标签上面. 如果您使用 thead.tfoot 以及 tb ...
- 《寒江独钓_Windows内核安全编程》中修改类驱动分发函数
最近在阅读<寒江独钓_Windows内核安全编程>一书的过程中,发现修改类驱动分发函数这一技术点,书中只给出了具体思路和部分代码,没有完整的例子. 按照作者的思路和代码,将例子补充完整,发 ...
- CocoaPods pod install
加参数可以提升更新的速度 方法1: pod install --verbose --no-repo-update pod update --verbose --no-repo-update 方法2: ...
- SQL Server 2016 CTP2.3 的关键特性
SQL Server 2016 CTP2.3 的关键特性 数据库方面的增强 Row Level Security已经支持In-memory OLTP 表.用户现在可以对内存优化表实施row-level ...
- 飞流直下的精彩 -- 淘宝UWP中瀑布流列表的实现
在淘宝UWP中,搜索结果列表是用户了解宝贝的重要一环,其中的图片效果对吸引用户点击搜索结果,查看宝贝详情有比较大的影响.为此手机淘宝特意在搜索结果列表上采用了2种表现方式:一种就是普通的列表模式,而另 ...
- 多彩的Console打印新玩法
Chrome应该是每一个Web开发者必备的工具之一.它有而强大的Devtool,辅助我们的JavaScript调试,审视DOM元素,CSS即时修改等.以及它还有一个的庞大的插件系统,同时我们也可以很容 ...
- J2EE项目修改编码问题
一:项目编码修改 新建项目后,右键项目-->Properties-->Resource,这时可以修改编码为UTF-8. 二:JSP页面编码修改 Window --> Preferen ...