zoukankan      html  css  js  c++  java
  • 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;
            }

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

  • 相关阅读:
    C++学习9 this指针详解
    福建省第八届 Triangles
    UVA 11584 Partitioning by Palindromes
    POJ 2752 Seek the Name, Seek the Fame
    UVA 11437 Triangle Fun
    UVA 11488 Hyper Prefix Sets (字典树)
    HDU 2988 Dark roads(kruskal模板题)
    HDU 1385 Minimum Transport Cost
    HDU 2112 HDU Today
    HDU 1548 A strange lift(最短路&&bfs)
  • 原文地址:https://www.cnblogs.com/pengze0902/p/5977247.html
Copyright © 2011-2022 走看看