ManagementClass类解析和C#如何获取硬件的相关信息
在.NET的项目中,有时候需要获取计算机的硬件的相关信息,在C#语言中需要利用ManagementClass这个类来进行相关操作。
现在先来介绍一下ManagementClass类,首先看一下类的继承结构:
现在看一下MSDN对ManagementClass类的解释,对表示一个通用信息模型 (CIM) 管理类。管理类是 WMI 类,如Win32_LogicalDisk, ,该类型可表示一个磁盘驱动器,并Win32_Process, ,它表示的进程 Notepad.exe 等。此类的成员可以访问 WMI 数据,使用一个特定的 WMI 类路径。
一. 接下来我们来看一下ManagementClass类中一些较为常用的方法的源码:
1.GetInstances():此方法存在四个重载
下面提供一下GetInstances(EnumerationOptions options)重载版本的代码:
publicManagementObjectCollectionGetInstances(EnumerationOptionsoptions){if((null==Path)||(null==Path.Path)||(0==Path.Path.Length))thrownewInvalidOperationException();Initialize(false);IEnumWbemClassObjectenumWbem=null;EnumerationOptionso=(null==options)?newEnumerationOptions():(EnumerationOptions)options.Clone();o.EnsureLocatable=false;o.PrototypeOnly=false;SecurityHandlersecurityHandler=null;intstatus=(int)ManagementStatus.NoError;try{securityHandler=Scope.GetSecurityHandler();status=scope.GetSecuredIWbemServicesHandler(Scope.GetIWbemServices()).CreateInstanceEnum_(ClassName,o.Flags,o.GetContext(),refenumWbem);}finally{if(securityHandler!=null)securityHandler.Reset();}if(status<0){if((status&0xfffff000)==0x80041000)ManagementException.ThrowWithExtendedInfo((ManagementStatus)status);elseMarshal.ThrowExceptionForHR(status);}returnnewManagementObjectCollection(Scope,o,enumWbem);}
2.Get():
下面提供一下Get()重载版本的代码:
publicManagementObjectCollectionGet(){Initialize();IEnumWbemClassObjectew=null;SecurityHandlersecurityHandler=scope.GetSecurityHandler();EnumerationOptionsenumOptions=(EnumerationOptions)options.Clone();intstatus=(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(),refew);}else{status=scope.GetSecuredIWbemServicesHandler(scope.GetIWbemServices()).CreateClassEnum_(((SelectQuery)query).ClassName,enumOptions.Flags,enumOptions.GetContext(),refew);}}else{enumOptions.EnumerateDeep=true;status=scope.GetSecuredIWbemServicesHandler(scope.GetIWbemServices()).ExecQuery_(query.QueryLanguage,query.QueryString,enumOptions.Flags,enumOptions.GetContext(),refew);}}catch(COMExceptione){//ManagementException.ThrowWithExtendedInfo(e);}finally{securityHandler.Reset();}if((status&0xfffff000)==0x80041000){ManagementException.ThrowWithExtendedInfo((ManagementStatus)status);}elseif((status&0x80000000)!=0){Marshal.ThrowExceptionForHR(status);}returnnewManagementObjectCollection(scope,options,ew);}
3.GetSubclasses():此方法存在四个重载版本
下面提供一下GetSubclasses(EnumerationOptions options)重载版本的代码:
publicManagementObjectCollectionGetSubclasses(EnumerationOptionsoptions){if(null==Path)thrownewInvalidOperationException();Initialize(false);IEnumWbemClassObjectenumWbem=null;EnumerationOptionso=(null==options)?newEnumerationOptions():(EnumerationOptions)options.Clone();o.EnsureLocatable=false;o.PrototypeOnly=false;SecurityHandlersecurityHandler=null;intstatus=(int)ManagementStatus.NoError;try{securityHandler=Scope.GetSecurityHandler();status=scope.GetSecuredIWbemServicesHandler(Scope.GetIWbemServices()).CreateClassEnum_(ClassName,o.Flags,o.GetContext(),refenumWbem);}finally{if(securityHandler!=null)securityHandler.Reset();}if(status<0){if((status&0xfffff000)==0x80041000)ManagementException.ThrowWithExtendedInfo((ManagementStatus)status);elseMarshal.ThrowExceptionForHR(status);}returnnewManagementObjectCollection(Scope,o,enumWbem);}
以上是对ManagementClass类的部分谁明,此类型的所有公共静态成员都是线程安全的。不保证所有实例成员都是线程安全的。
二.ManagementClass类的部分应用:
///<summary>///获得CPU编号///</summary>///<returns></returns>publicstringGetCpuid(){varcpuid=string.Empty;varmc=newManagementClass("Win32_Processor");varmoc=mc.GetInstances();foreach(varoinmoc){varmo=(ManagementObject)o;cpuid=mo.Properties["ProcessorId"].Value.ToString();}returncpuid;}///<summary>///获取硬盘序列号///</summary>///<returns></returns>publicstringGetDiskSerialNumber(){//这种模式在插入一个U盘后可能会有不同的结果,如插入我的手机时varhDid=string.Empty;varmc=newManagementClass("Win32_DiskDrive");varmoc=mc.GetInstances();foreach(varoinmoc){varmo=(ManagementObject)o;hDid=(string)mo.Properties["Model"].Value;//这名话解决有多个物理盘时产生的问题,只取第一个物理硬盘break;}returnhDid;}///<summary>///获取网卡硬件地址///</summary>///<returns></returns>publicstringGetMacAddress(){varmac="";varmc=newManagementClass("Win32_NetworkAdapterConfiguration");varmoc=mc.GetInstances();foreach(varoinmoc){varmo=(ManagementObject)o;if(!(bool)mo["IPEnabled"])continue;mac=mo["MacAddress"].ToString();break;}returnmac;}///<summary>///获取IP地址///</summary>///<returns></returns>publicstringGetIpAddress(){varst=string.Empty;varmc=newManagementClass("Win32_NetworkAdapterConfiguration");varmoc=mc.GetInstances();foreach(varoinmoc){varmo=(ManagementObject)o;if(!(bool)mo["IPEnabled"])continue;varar=(Array)(mo.Properties["IpAddress"].Value);st=ar.GetValue(0).ToString();break;}returnst;}///<summary>///操作系统的登录用户名///</summary>///<returns></returns>publicstringGetUserName(){returnEnvironment.UserName;}///<summary>///获取计算机名///</summary>///<returns></returns>publicstringGetComputerName(){returnEnvironment.MachineName;}///<summary>///操作系统类型///</summary>///<returns></returns>publicstringGetSystemType(){varst=string.Empty;varmc=newManagementClass("Win32_ComputerSystem");varmoc=mc.GetInstances();foreach(varoinmoc){varmo=(ManagementObject)o;st=mo["SystemType"].ToString();}returnst;}///<summary>///物理内存///</summary>///<returns></returns>publicstringGetPhysicalMemory(){varst=string.Empty;varmc=newManagementClass("Win32_ComputerSystem");varmoc=mc.GetInstances();foreach(varoinmoc){varmo=(ManagementObject)o;st=mo["TotalPhysicalMemory"].ToString();}returnst;}///<summary>///显卡PNPDeviceID///</summary>///<returns></returns>publicstringGetVideoPnpid(){varst="";varmos=newManagementObjectSearcher("Select*fromWin32_VideoController");foreach(varoinmos.Get()){varmo=(ManagementObject)o;st=mo["PNPDeviceID"].ToString();}returnst;}///<summary>///声卡PNPDeviceID///</summary>///<returns></returns>publicstringGetSoundPnpid(){varst=string.Empty;varmos=newManagementObjectSearcher("Select*fromWin32_SoundDevice");foreach(varoinmos.Get()){varmo=(ManagementObject)o;st=mo["PNPDeviceID"].ToString();}returnst;}///<summary>///CPU版本信息///</summary>///<returns></returns>publicstringGetCpuVersion(){varst=string.Empty;varmos=newManagementObjectSearcher("Select*fromWin32_Processor");foreach(varoinmos.Get()){varmo=(ManagementObject)o;st=mo["Version"].ToString();}returnst;}///<summary>///CPU名称信息///</summary>///<returns></returns>publicstringGetCpuName(){varst=string.Empty;vardriveId=newManagementObjectSearcher("Select*fromWin32_Processor");foreach(varoindriveId.Get()){varmo=(ManagementObject)o;st=mo["Name"].ToString();}returnst;}///<summary>///CPU制造厂商///</summary>///<returns></returns>publicstringGetCpuManufacturer(){varst=string.Empty;varmos=newManagementObjectSearcher("Select*fromWin32_Processor");foreach(varoinmos.Get()){varmo=(ManagementObject)o;st=mo["Manufacturer"].ToString();}returnst;}///<summary>///主板制造厂商///</summary>///<returns></returns>publicstringGetBoardManufacturer(){varquery=newSelectQuery("Select*fromWin32_BaseBoard");varmos=newManagementObjectSearcher(query);vardata=mos.Get().GetEnumerator();data.MoveNext();varboard=data.Current;returnboard.GetPropertyValue("Manufacturer").ToString();}///<summary>///主板编号///</summary>///<returns></returns>publicstringGetBoardId(){varst=string.Empty;varmos=newManagementObjectSearcher("Select*fromWin32_BaseBoard");foreach(varoinmos.Get()){varmo=(ManagementObject)o;st=mo["SerialNumber"].ToString();}returnst;}///<summary>///主板型号///</summary>///<returns></returns>publicstringGetBoardType(){varst=string.Empty;varmos=newManagementObjectSearcher("Select*fromWin32_BaseBoard");foreach(varoinmos.Get()){varmo=(ManagementObject)o;st=mo["Product"].ToString();}returnst;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。