与原始的 WMI 相比,使用 .NET Framework 中的 WMI 编写客户端应用程序或提供程序具有多种优势,特别是对于使用 C#(而不是 C++)的开发人员。在这种情况下,编写提供程序意味着为在托管代码中编写的应用程序添加规范。
在编写客户端应用程序和提供程序时,.NET Framework 中的 WMI 具有下列优势:
-
利用公共语言运行库功能,例如垃圾回收、自定义索引器和字典。
此外,还提供其他公共语言运行库功能,例如自动内存管理、有效部署、面向对象的框架、基于证据的安全性以及异常处理。
-
类定义和实例发布与 .NET Framework 类一起规范化应用程序,以便应用程序可以为 WMI 提供数据。
System.Management.Instrumentation 中的类使您能够注册新提供程序、创建新类和发布实例,而不必使用托管对象格式 (MOF) 代码。
-
使用简单。
原始 WMI 的 C++ 应用程序有时很难开发,或开发时间很长。 System.Management 的类结构为在 .NET Framework 中开发的应用程序带来更多类似脚本的简单性。可以更快地开发应用程序和提供程序,并且更容易调试。
-
可以访问所有 WMI 数据。
与原始 WMI 相比,客户端应用程序可以对 WMI 数据进行相同的访问,并且可以执行所有相同的操作。提供程序规范化的应用程序限制性会更强一些。有关更多信息,请参见.NET Framework 中的 WMI 局限性。
下面例子是使用.NET的WMI实现对系统硬件信息进行获取的代码
using System.Management;
namespace Soyee.Comm
{
/// <summary>
/// 计算机信息类
/// </summary>
public class Computer
{
public string CpuID;
public string MacAddress;
public string DiskID;
public string IpAddress;
public string LoginUserName;
public string ComputerName;
public string SystemType;
public string TotalPhysicalMemory; // 单位:M
private static Computer _instance;
public static Computer Instance()
{
if (_instance == null )
_instance = new Computer();
return _instance;
}
public Computer()
{
CpuID = GetCpuID();
MacAddress = GetMacAddress();
DiskID = GetDiskID();
IpAddress = GetIPAddress();
LoginUserName = GetUserName();
SystemType = GetSystemType();
TotalPhysicalMemory = GetTotalPhysicalMemory();
ComputerName = GetComputerName();
}
string GetCpuID()
{
try
{
// 获取CPU序列号代码
string cpuInfo = "" ; // cpu序列号
ManagementClass mc = new ManagementClass( " Win32_Processor " );
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
cpuInfo = mo.Properties[ " ProcessorId " ].Value.ToString();
}
moc = null ;
mc = null ;
return cpuInfo;
}
catch
{
return " unknow " ;
}
finally
{
}
}
string GetMacAddress()
{
try
{
// 获取网卡硬件地址
string mac = "" ;
ManagementClass mc = new ManagementClass( " Win32_NetworkAdapterConfiguration " );
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if (( bool )mo[ " IPEnabled " ] == true )
{
mac = mo[ " MacAddress " ].ToString();
break ;
}
}
moc = null ;
mc = null ;
return mac;
}
catch
{
return " unknow " ;
}
finally
{
}
}
string GetIPAddress()
{
try
{
// 获取IP地址
string st = "" ;
ManagementClass mc = new ManagementClass( " Win32_NetworkAdapterConfiguration " );
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if (( bool )mo[ " IPEnabled " ] == true )
{
// st=mo["IpAddress"].ToString();
System.Array ar;
ar = (System.Array)(mo.Properties[ " IpAddress " ].Value);
st = ar.GetValue( 0 ).ToString();
break ;
}
}
moc = null ;
mc = null ;
return st;
}
catch
{
return " unknow " ;
}
finally
{
}
}
string GetDiskID()
{
try
{
// 获取硬盘ID
String HDid = "" ;
ManagementClass mc = new ManagementClass( " Win32_DiskDrive " );
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
HDid = ( string )mo.Properties[ " Model " ].Value;
}
moc = null ;
mc = null ;
return HDid;
}
catch
{
return " unknow " ;
}
finally
{
}
}
/// <summary>
/// 操作系统的登录用户名
/// </summary>
/// <returns></returns>
string GetUserName()
{
try
{
string st = "" ;
ManagementClass mc = new ManagementClass( " Win32_ComputerSystem " );
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
st = mo[ " UserName " ].ToString();
}
moc = null ;
mc = null ;
return st;
}
catch
{
return " unknow " ;
}
finally
{
}
}
/// <summary>
/// PC类型
/// </summary>
/// <returns></returns>
string GetSystemType()
{
try
{
string st = "" ;
ManagementClass mc = new ManagementClass( " Win32_ComputerSystem " );
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
st = mo[ " SystemType " ].ToString();
}
moc = null ;
mc = null ;
return st;
}
catch
{
return " unknow " ;
}
finally
{
}
}
/// <summary>
/// 物理内存
/// </summary>
/// <returns></returns>
string GetTotalPhysicalMemory()
{
try
{
string st = "" ;
ManagementClass mc = new ManagementClass( " Win32_ComputerSystem " );
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
st = mo[ " TotalPhysicalMemory " ].ToString();
}
moc = null ;
mc = null ;
return st;
}
catch
{
return " unknow " ;
}
finally
{
}
}
/// <summary>
/// 获取计算机名称
/// </summary>
/// <returns></returns>
string GetComputerName()
{
try
{
return System.Environment.GetEnvironmentVariable( " ComputerName " );
}
catch
{
return " unknow " ;
}
finally
{
}
}
}
}
本机测试效果:
LEMONGTREE
BFEBFBFF00000F41
ST380011A
192.168.0.122
LEMONGTREE/Administrator
00:16:76:50:B4:C3
X86-based PC
1071599616
按照这个例子举一反三就能获取系统所有硬件信息,这例子只是个简单的应用,希望大家能开发出更好的应用。
netken