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

来源:互联网 发布:雕刻机软件 编辑:程序博客网 时间:2024/05/16 08:43

   在.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;        }


本文出自 “彭泽0902” 博客,请务必保留此出处http://pengze0902.blog.51cto.com/7693836/1863419

0 0
原创粉丝点击