C#使用访问WMI的接口获取计算机硬件和操作系统信息,WMI代码生成器介绍【ManagementObjectSearcher、ManagementClass】

简介: ManagementObjectSearcher 用于获取基于指定查询的管理对象集合。是获取管理信息最常用的入口点。例如,可以遍历所有的硬盘驱动、网络适配器、进程和系统上的其他管理对象,或者...

ManagementObjectSearcher

ManagementObjectSearcher类

ManagementObjectSearcher 用于获取基于指定查询的管理对象集合。是获取管理信息最常用的入口点。

例如,可以遍历所有的硬盘驱动、网络适配器、进程和系统上的其他管理对象,或者查询所有的正在使用、服务停止等的网络连接(query for all network connections that are up, services that are paused, and so on)。

其查询主要使用的是WMI查询,以及可选的ManagementScope,当调用Get()方法时才会执行对应的查询,返回一个管理对象集合(a collection of management objects)。

ManagementObjectSearcher 类在System.Management命名空间下。

Environment类也可以获取一些简单的系统信息,比如: Environment.MachineName获得计算机名, Environment.UserName获得操作系统登录用户名, Environment.Is64BitOperatingSystem是否是64位操作系统, Environment.ProcessorCount当前系统的处理器数, Environment.NewLine当前环境的换行符等。

WMI —— Windows Management Instrumentation

WMI是用来获取Windows系统信息(软硬件、网络等)的技术,并提供可供vbspowershell.NET/C# 等各种工具或编程语言使用的接口。

WMI底层是基于COM的。同时WMI在性能上并不是很好。

WMI目前已经不推荐使用,其最新版本(或替代品)为Windows Management Infrastructure(MI),它与WMI完全兼容,使用WMI方式可以访问MI,现代编程更推荐直接使用MI。

Why Use MI?介绍到,MI使用新的本地API和.NET API(不再需要使用复杂的COM代码与WMI交互),SDK开箱即用,减少开发时间;与PowerShell紧密集成;基于最新的标准。

其具体使用可直接参见官方文档。How to Implement a Managed MI Client

获取常用系统和硬件信息

使用可以访问WMI的ManagementObjectSearcher对象,可以获取很多需要的计算机的硬件或操作系统的信息。

使用步骤

  1. 添加引用:System.Management
  2. 引入命名空间:using System.Management;
  3. 创建 ManagementObjectSearcher 对象,执行查询语句和可选的一些参数。

比如 var searcher = new ManagementObjectSearcher("select * from " + Key);

其中的key为WMI提供的API类,其常用列表见后续

  1. 调用 searcher.Get() 执行查询,获得 ManagementObjectCollection 集合
  2. 遍历 ManagementObjectCollection 集合获得 ManagementObject
  3. 通过 managementObject[name]ManagementObject.GetPropertyValue(name) 获得想要的属性值。

若不知道name,可以先遍历打印一下:

foreach (var property in managementObject.Properties)
{
    Console.WriteLine(property.Name+":"+property.Value);
}

使用实例(ManagementObjectSearcher查询获取)

获取CPU序列号

//获取CPU序列号
public string[] GetCPUSerialNumber()
{
   var cpuSerialNumbers = new List<string>();

   using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Processor"))
   {
       var moCollects = searcher.Get();
       foreach (ManagementObject mo in moCollects)
       {
           cpuSerialNumbers.Add(mo["ProcessorId"].ToString().Trim());
       }
       return cpuSerialNumbers.ToArray(); 
   }
}

获取主板序列号

BIOS的 serialnumber有的时候无法获取,会返回 Not Applicable
//获取主板序列号
public string GetBIOSSerialNumber()
{
   using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_BIOS"))
   {
       string sBIOSSerialNumber = "";

       foreach (ManagementObject mo in searcher.Get())
       {
           sBIOSSerialNumber = mo.GetPropertyValue("SerialNumber").ToString().Trim();
           break;
       }
       return sBIOSSerialNumber; 
   }
}

获取硬盘序列号

//获取硬盘序列号
public string[] GetHardDiskSerialNumber()
{
      var diskSerialNumbers = new List<string>();
      using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia"))
      {
          foreach (ManagementObject mo in searcher.Get())
          {
              diskSerialNumbers.Add(mo["SerialNumber"].ToString().Trim());
          }
          return diskSerialNumbers.ToArray(); 
      }
}

获取网卡地址

可根据需要再排除虚拟机相关网卡。

/// <summary>
/// 获取网卡地址
/// </summary>
/// <returns></returns>
public string[] GetNetCardMACAddress()
{
      using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL) AND (Manufacturer <> 'Microsoft'))"))
      {
          var macSerialNumbers = new List<string>();


          foreach (ManagementObject mo in searcher.Get())
          {
              macSerialNumbers.Add(mo["MACAddress"].ToString().Trim());
          }
          return macSerialNumbers.ToArray();
      }
}

获取串口信息

/// <summary>
/// 获得串口信息。获取的不准确,比如会获取到蓝牙设备
/// </summary>
/// <returns></returns>
public static string[] GetComInfo()
{
   List<string> Comstrs = new List<string>();
   using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PnPEntity"))
   {
       var hardInfos = searcher.Get();
       foreach (var comInfo in hardInfos)
       {
           var nameValue = comInfo.Properties["Name"].Value;
           if (nameValue != null && nameValue.ToString().Contains("COM")) // 是否需要.ToUpper()?
           {
               try
               {
                   //通讯端口(COM1) 转变为 COM1:通讯端口
                   string com = nameValue.ToString();
                   string[] strcom = com.Split(new char[2] { '(', ')' });

                   Comstrs.Add(strcom[1] + ":" + strcom[0]);
               }
               catch { }

               }
       }
       searcher.Dispose();
   }
   return Comstrs.ToArray();
}

获取一个进程的父进程

/// <summary>
/// 获取父进程。如果出错可能返回null
/// </summary>
/// <param name="process"></param>
/// <returns></returns>
public static Process GetParent(this Process process)
{
   try
   {
       //using (var query = new ManagementObjectSearcher("SELECT * FROM Win32_Process WHERE ProcessId=" + process.Id))
       using (var query = new ManagementObjectSearcher("root\\CIMV2", "SELECT ParentProcessId FROM Win32_Process WHERE ProcessId=" + process.Id))
       {
           return query
             .Get()
             .OfType<ManagementObject>()
             .Select(p => Process.GetProcessById((int)(uint)p["ParentProcessId"]))
             .FirstOrDefault();
       }
   }
   catch
   {
       return null;
   }
}

/// <summary>
/// 获取一个进程的父进程Id
/// </summary>
/// <param name="processId"></param>
/// <returns></returns>
public static int ParentProcessId(int processId)
{
   try
   {
       using (var query = new ManagementObjectSearcher("root\\CIMV2", "SELECT ParentProcessId FROM Win32_Process WHERE ProcessId=" + processId))
       {
           return query
             .Get()
             .OfType<ManagementObject>()
             .Select(p =>(int)(uint)p["ParentProcessId"])
             .FirstOrDefault();
       }
   }
   catch
   {
       return 0;
   }
}

使用实例(ManagementClass对象方法)

/// <summary>
/// 获取所有的进程
/// </summary>
/// <param name="tb"></param>
public static string ListAllProcesses()
{
   // list out all processes and write them into a stringbuilder
   using (ManagementClass MgmtClass = new ManagementClass("Win32_Process"))
   {
       StringBuilder sb = new StringBuilder();
       foreach (ManagementObject mo in MgmtClass.GetInstances())
       {
           sb.Append("Name:\t" + mo["Name"] + Environment.NewLine);
           sb.Append("ID:\t" + mo["ProcessId"] + Environment.NewLine);
           sb.Append(Environment.NewLine);
       }
       return sb.ToString();
   }
}

WMI代码生成器介绍(生成C#、VB、VB.Net代码)

WMI Code creator是微软官方提供的一个生成C#、VB、VB.Net使用WMI代码的工具。

通过它,可以很方便的生成需要的代码,而不用查找需要用到哪些WMI类、去哪找对应的类、属性又是哪些等各种烦人的问题。

点击进入直接下载。

或者从 InvaderZim85/WmiCodeCreator下载一个非官方的比较新的版本。

如下,查询BIOS

使用WMI Code creator可以执行如下操作:

  • 查询WMI命名空间
  • 执行方法
  • 接收事件通知
  • 浏览WMI命名空间。

通过选择Target Computer,可以生成本地计算机、远程计算机的代码。

附:常见的WMI的API类

ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + Key)查询中常见的key值。

硬件

  • Win32_Processor —— CPU 处理器
  • Win32_PhysicalMemory —— 物理内存条
  • Win32_Keyboard —— 键盘
  • Win32_PointingDevice —— 点输入设备,包括鼠标。
  • Win32_FloppyDrive —— 软盘驱动器
  • Win32_DiskDrive —— 硬盘驱动器
  • Win32_CDROMDrive —— 光盘驱动器
  • Win32_BaseBoard —— 主板
  • Win32_BIOS —— BIOS 芯片
  • Win32_ParallelPort —— 并口
  • Win32_SerialPort —— 串口
  • Win32_SerialPortConfiguration —— 串口配置
  • Win32_SoundDevice —— 多媒体设置,一般指声卡。
  • Win32_SystemSlot —— 主板插槽 (ISA & PCI & AGP)
  • Win32_USBController —— USB 控制器
  • Win32_NetworkAdapter —— 网络适配器
  • Win32_NetworkAdapterConfiguration —— 网络适配器设置
  • Win32_Printer —— 打印机
  • Win32_PrinterConfiguration —— 打印机设置
  • Win32_PrintJob —— 打印机任务
  • Win32_TCPIPPrinterPort —— 打印机端口
  • Win32_POTSModem —— MODEM
  • Win32_POTSModemToSerialPort —— MODEM 端口
  • Win32_DesktopMonitor —— 显示器
  • Win32_DisplayConfiguration —— 显卡
  • Win32_DisplayControllerConfiguration —— 显卡设置
  • Win32_VideoController —— 显卡细节。
  • Win32_VideoSettings —— 显卡支持的显示模式。

操作系统

  • Win32_TimeZone —— 时区
  • Win32_SystemDriver —— 驱动程序
  • Win32_DiskPartition —— 磁盘分区
  • Win32_LogicalDisk —— 逻辑磁盘
  • Win32_LogicalDiskToPartition —— 逻辑磁盘所在分区及始末位置。
  • Win32_LogicalMemoryConfiguration —— 逻辑内存配置
  • Win32_PageFile —— 系统页文件信息
  • Win32_PageFileSetting —— 页文件设置
  • Win32_BootConfiguration —— 系统启动配置
  • Win32_ComputerSystem —— 计算机信息简要
  • Win32_OperatingSystem —— 操作系统信息
  • Win32_StartupCommand —— 系统自动启动程序
  • Win32_Service —— 系统安装的服务
  • Win32_Group —— 系统管理组
  • Win32_GroupUser —— 系统组帐号
  • Win32_UserAccount —— 用户帐号
  • Win32_Process —— 系统进程
  • Win32_Thread —— 系统线程
  • Win32_Share —— 共享
  • Win32_NetworkClient —— 已安装的网络客户端
  • Win32_NetworkProtocol —— 已安装的网络协议
  • Win32_PnPEntity —— all device

参考

相关文章
|
11天前
|
Linux 编译器 开发者
Linux设备树解析:桥接硬件与操作系统的关键架构
在探索Linux的庞大和复杂世界时🌌,我们经常会遇到许多关键概念和工具🛠️,它们使得Linux成为了一个强大和灵活的操作系统💪。其中,"设备树"(Device Tree)是一个不可或缺的部分🌲,尤其是在嵌入式系统🖥️和多平台硬件支持方面🔌。让我们深入了解Linux设备树是什么,它的起源,以及为什么Linux需要它🌳。
Linux设备树解析:桥接硬件与操作系统的关键架构
|
1月前
|
IDE C# 开发工具
C#系列之接口介绍
C#系列之接口介绍
|
3月前
|
达摩院 Linux API
阿里达摩院MindOpt求解器V1.1新增C#接口
阿里达摩院MindOpt求解器发布最新版本V1.1,增加了C#相关API和文档。优化求解器产品是求解优化问题的专业计算软件,可广泛各个行业。阿里达摩院从2019年投入自研MindOpt优化求解器,截止目前经历27个版本的迭代,取得了多项国内和国际第一的成绩。就在上个月,2023年12月,在工信部产业发展促进中心等单位主办的首届能源电子产业创新大赛上,MindOpt获得电力用国产求解器第一名。本文将为C#开发者讲述如何下载安装MindOpt和C#案例源代码。
136 3
阿里达摩院MindOpt求解器V1.1新增C#接口
|
3月前
|
编译器 C# 开发者
C# 11.0中的新特性:覆盖默认接口方法
C# 11.0进一步增强了接口的灵活性,引入了覆盖默认接口方法的能力。这一新特性允许类在实现接口时,不仅可以提供接口中未实现的方法的具体实现,还可以覆盖接口中定义的默认方法实现。本文将详细介绍C# 11.0中接口默认方法覆盖的工作原理、使用场景及其对现有代码的影响,帮助开发者更好地理解和应用这一新功能。
|
22天前
|
安全 Linux Shell
操作系统究竟是什么?在计算机体系中扮演什么角色?
操作系统究竟是什么?在计算机体系中扮演什么角色?
28 0
|
1月前
|
存储 安全 Unix
计算机的操作系统
计算机的操作系统
12 2
|
1月前
|
存储 缓存 NoSQL
|
1月前
|
存储 Ubuntu 网络安全
|
1月前
|
存储 Ubuntu Unix
【Linux】1、操作系统、计算机硬件和软件、Linux 介绍
【Linux】1、操作系统、计算机硬件和软件、Linux 介绍
41 0
|
2月前
|
存储 安全 自动驾驶
计算机软考之操作系统
计算机软考之操作系统
51 0