介绍
本文将描述一种使用 Windows Management Instrumentation (WMI) 调用来获取系统信息的方法。 正如您将看到的,从基于 WMI 的调用中获取信息是微不足道的;似乎最困难的部分是找出 WMI 中可用的内容。 幸运的是,Microsoft 提供了一些工具,这些工具也使 WMI 发现变得非常简单。
图 1: 使用 WMI 调用获取系统信息。
微软 WMI 代码创建者
Microsoft WMI Code Creator 应用程序可从 Microsoft 免费获得;它可以从这个 URL 下载:
Download WMI Code Creator v1.0 from Official Microsoft Download Center
根据 Microsoft 的说法,“WMI Code Creator 工具允许您生成 VBScript、C# 和 VB .NET 代码,这些代码使用 WMI 来完成管理任务,例如查询管理数据、执行 WMI 类中的方法或使用WMI。”
图 2: WMI Code Creator 界面(生成代码)。
入门
该解决方案包含一个项目。 该项目被称为“ UsingWMI ”。 提供该项目是为了演示对 WMI 的查询和获取信息。 由于您可以通过此界面访问数百位信息,因此该演示仅展示了如何检索 19 种不同的东西。 用于通过 WMI 访问信息的前两种方法中所示的方法可以更改并用于访问 WMI 中的任何信息。 该项目仅包含一个表单,该表单包含执行所述任务所需的所有代码。
图 3: 带有 Project Visible 的解决方案资源管理器。
代码: 使用 WMI
该项目用于针对通过 WMI 接口公开的信息测试不同的调用。 该项目包含一个 Windows 窗体。 该表单包含一个文本框,用于显示通过一系列方法调用收集的信息。
此表单的代码开头如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Management;
namespace UsingWMI
{
public partial class Form1 : Form
{
public Form1()
{
该类从默认导入开始;我将 System.Collections 和 System.Management 添加到默认值并删除了泛型。 在命名空间和类声明之后,表单加载事件会执行类中定义的所有方法,并将结果加载到文本框中进行显示:
public Form1()
{
InitializeComponent();
// Get System Information using WMI Calls
this.textBox1.Text += GetAccount() + Environment.NewLine;
this.textBox1.Text += Environment.NewLine;
this.textBox1.Text += GetHardDisks();
this.textBox1.Text += GetBoardMaker() + Environment.NewLine;
this.textBox1.Text += GetBoardSerNo() + Environment.NewLine;
this.textBox1.Text += GetBoardProductId() + Environment.NewLine;
this.textBox1.Text += Environment.NewLine;
this.textBox1.Text += GetCacheBlockSize() + Environment.NewLine;
this.textBox1.Text += GetCacheType() + Environment.NewLine;
this.textBox1.Text += GetCacheMaxSize() + Environment.NewLine;
this.textBox1.Text += Environment.NewLine;
this.textBox1.Text += GetCdRomDrive() + Environment.NewLine;
this.textBox1.Text += Environment.NewLine;
this.textBox1.Text += GetBIOSmaker() + Environment.NewLine;
this.textBox1.Text += GetBIOScaption() + Environment.NewLine;
this.textBox1.Text += GetBIOSserNo() + Environment.NewLine;
this.textBox1.Text += Environment.NewLine;
this.textBox1.Text += GetWinIconSpace() + Environment.NewLine;
this.textBox1.Text += GetWinCursorBlinkRate() +
Environment.NewLine;
this.textBox1.Text += GetWinScreenSaverActive() +
Environment.NewLine;
this.textBox1.Text += GetWinCoolSwitch() + Environment.NewLine;
this.textBox1.SelectionStart = textBox1.Text.Length;
}
应用程序中的其余代码用于定义表单加载期间调用的方法;在以下方法中,有获取硬盘序列号、BIOS信息、Windows桌面信息、用户信息等的例子:
public string GetHardDisks()
{
ManagementObjectSearcher searcher = new
ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_LogicalDisk");
StringBuilder sb = new StringBuilder();
foreach (ManagementObject wmi in searcher.Get())
{
try
{
sb.Append("Drive Device ID: " +
wmi.GetPropertyValue("DeviceID").ToString() +Environment.NewLine);
sb.Append("Caption: " + wmi.GetPropertyValue("Caption").ToString() + Environment.NewLine);
sb.Append("Volume Serial Number: " + wmi.GetPropertyValue("VolumeSerialNumber").ToString()
+ Environment.NewLine);
sb.Append("Free Space: " + wmi.GetPropertyValue("FreeSpace").ToString() + "
bytes free" + Environment.NewLine + Environment.NewLine);
}
catch
{
return sb.ToString();
}
}
return sb.ToString();
}
public string GetBoardMaker()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_BaseBoard");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return Environment.NewLine + "Board Maker: " + wmi.GetPropertyValue("Manufacturer").ToString();
}
catch { }
}
return "Board Maker: Unknown";
}
public string GetBoardSerNo()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_BaseBoard");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "Serial Number: " + wmi.GetPropertyValue("SerialNumber").ToString();
}
catch { }
}
return "Serial Number: Unknown";
}
public string GetBoardProductId()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_BaseBoard");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "Product: " + wmi.GetPropertyValue("Product").ToString();
}
catch { }
}
return "Product: Unknown";
}
public string GetCacheBlockSize()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_CacheMemory");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "Cache Block Size: " + wmi.GetPropertyValue("BlockSize").ToString();
}
catch { }
}
return "Cache Block Size: Unknown";
}
public string GetCacheType()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_CacheMemory");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "Cache Type: " + wmi.GetPropertyValue("CacheType").ToString();
}
catch { }
}
return "Cache Type: Unknown";
}
public string GetCacheMaxSize()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_CacheMemory");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "Max Cache Size: " + wmi.GetPropertyValue("MaxCacheSize").ToString();
}
catch { }
}
return "Max Cache Size: Unknown";
}
public string GetCdRomDrive()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_CDROMDrive");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "CD ROM Drive Letter: " + wmi.GetPropertyValue("Drive").ToString();
}
catch { }
}
return "CD ROM Drive Letter: Unknown";
}
public string GetAccount()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_UserAccount");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "User Account Name: " + wmi.GetPropertyValue("Name").ToString();
}
catch { }
}
return "User Account Name: Unknown";
}
public string GetBIOScaption()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_BIOS");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "BIOS Caption: " + wmi.GetPropertyValue("Caption").ToString();
}
catch { }
}
return "BIOS Caption: Unknown";
}
public string GetBIOSmaker()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_BIOS");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "BIOS Maker: " + wmi.GetPropertyValue("Manufacturer").ToString();
}
catch { }
}
return "BIOS Maker: Unknown";
}
public string GetBIOSserNo()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_BIOS");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "BIOS Serial Number: " + wmi.GetPropertyValue("SerialNumber").ToString();
}
catch { }
}
return "BIOS Serial Number: Unknown";
}
public string GetWinIconSpace()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_Desktop");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "Desktop Icon Spacing: " + wmi.GetPropertyValue("IconSpacing").ToString();
}
catch { }
}
return "Desktop Icon Spacing: Unknown";
}
public string GetWinCursorBlinkRate()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_Desktop");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "Cursor Blink Rate: " + wmi.GetPropertyValue("CursorBlinkRate").ToString();
}
catch { }
}
return "Cursor Blink Rate: Unknown";
}
public string GetWinScreenSaverActive()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_Desktop");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "Screen Saver Active: " + wmi.GetPropertyValue("ScreenSaverActive").ToString();
}
catch { }
}
return "Screen Saver Active: Unknown";
}
public string GetWinCoolSwitch()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM
Win32_Desktop");
foreach (ManagementObject wmi in searcher.Get())
{
try
{
return "CoolSwitch: " + wmi.GetPropertyValue("CoolSwitch").ToString();
}
catch { }
}
return "CoolSwitch: Unknown";
}
采用所示的任何一种方法,如果要将 select 语句中的表名换成不同的选项,然后换出属性值,则可以使用相同的代码从 WMI 收集任何信息。 请求返回的部分数据以数组形式恢复;在这些情况下,您需要遍历数组以捕获返回的各个值。 管理搜索器对象接受两个参数,一个称为管理范围(例如,“root\\CIMV2”),另一个称为对象查询,它被定义为一个简单的 SELECT 语句。
概括。
本文旨在演示一种从 WMI 获取信息的简单方法。 如果需要有关硬件的信息(例如硬盘驱动器或主板的序列号)或有关桌面的信息,这是一种简单的收集方法。 Microsoft Code Creator 工具的使用确实简化了检查选项和处理结果的过程。