您的位置:首页 > 编程语言 > C#

ManagementClass类解析和C#如何获取硬件的相关信息

2016-10-19 14:43 435 查看
在.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) || (0 == 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 < 0)
{
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) != 0)
{
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 < 0)
{
if ((status & 0xfffff000) == 0x80041000)
ManagementException.ThrowWithExtendedInfo((ManagementStatus)status);
else
Marshal.ThrowExceptionForHR(status);
}

return new ManagementObjectCollection(Scope, o, enumWbem);
}
以上是对ManagementClass类的部分谁明,此类型的所有公共静态成员都是线程安全的。不保证所有实例成员都是线程安全的。二.ManagementClass类的部分应用:
/// <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;
}

/// <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;
}

/// <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;
}

/// <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(0).ToString();
break;
}
return st;
}

/// <summary>
/// 操作系统的登录用户名
/// </summary>
/// <returns></returns>
public string GetUserName()
{
return Environment.UserName;
}

/// <summary>
/// 获取计算机名
/// </summary>
/// <returns></returns>
public string GetComputerName()
{
return Environment.MachineName;
}

/// <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;
}

/// <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;
}

/// <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;
}

/// <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;
}

/// <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;
}

/// <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;
}

/// <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;
}

/// <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();
}

/// <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;
}

/// <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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Class NET Management