你的位置:首页 > ASP.net教程

[ASP.net教程]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) || (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类的部分应用:

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

   以上的获取硬件信息的方法可以直接封装在一个类中,可以在项目中直接引用,这样可以加快项目的开发速度。