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

参考

相关文章
|
2月前
|
前端开发 Java C#
java/C#语言开发的医疗信息系统11套源码
java/C#语言开发的医疗信息系统11套源码
59 2
|
2月前
|
C#
C# DataTable不能通过已删除的行访问该行的信息
C# DataTable不能通过已删除的行访问该行的信息
|
1月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
36 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
1天前
|
Python
Python的`signal`模块提供了访问底层操作系统提供的信号机制的方式。信号是操作系统用来通知进程发生了某种情况(如用户按下Ctrl+C)的一种机制。
Python的`signal`模块提供了访问底层操作系统提供的信号机制的方式。信号是操作系统用来通知进程发生了某种情况(如用户按下Ctrl+C)的一种机制。
5 0
|
10天前
|
Linux 调度
部署02-我们一般接触的是Mos和Wimdows这两款操作系统,很少接触到Linux,操作系统的概述,硬件是由计算机系统中由电子和机械,光电元件所组成的,CPU,内存,硬盘,软件是用户与计算机接口之间
部署02-我们一般接触的是Mos和Wimdows这两款操作系统,很少接触到Linux,操作系统的概述,硬件是由计算机系统中由电子和机械,光电元件所组成的,CPU,内存,硬盘,软件是用户与计算机接口之间
|
2月前
|
前端开发 Java 应用服务中间件
在虚拟机的Windows操作系统中:通过Jar方式若依项目,以及在外部的访问!
在虚拟机的Windows操作系统中:通过Jar方式若依项目,以及在外部的访问!
|
2月前
|
安全 iOS开发 MacOS
Mac pro升级 MacOS 10.15 Catalina 后根目录是只读的, Recovery OS不能访问
Mac pro升级 MacOS 10.15 Catalina 后根目录是只读的, Recovery OS不能访问
33 0
|
2月前
|
安全 Devops 虚拟化
【专栏】虚拟化技术与云计算平台 OpenStack:硬件虚拟化、操作系统级虚拟化和容器化
【4月更文挑战第28天】本文探讨虚拟化技术原理,如硬件虚拟化、操作系统级虚拟化和容器化,以及开源云计算平台OpenStack如何利用这些技术提供优势。OpenStack支持多种虚拟化技术,具备开源灵活性、多租户架构、可扩展性、插件式设计和成本效益。未来,OpenStack将在容器化、DevOps、跨云策略和安全合规性方面发挥更大作用,助力企业数字化转型。
|
2月前
|
运维 Linux Shell
day02-Linux运维-系统介绍与环境搭建_硬件 系统核心 解释器shell 外围操作系统
day02-Linux运维-系统介绍与环境搭建_硬件 系统核心 解释器shell 外围操作系统
|
2月前
|
JavaScript 前端开发 C#
C# webbrowser控件设置代理IP访问网站
C# webbrowser控件设置代理IP访问网站
218 5