WMI 查询

WMI 查询 

 

可以在 .NET Framework 应用程序中使用标准 WMI 查询。WMI 查询使用 WMI 查询语言 (WQL),该语言是 SQL 的一个子集。查询字符串存储在 .NET Framework 查询类中(例如 SelectQuery 类、WqlEventQuery 类或 RelatedObjectQuery 类),并由 ManagementObjectSearcherManagementEventWatcher 类构造函数进行调用。

有关更多信息,请参见 MSDN Library(网址为 http://msdn.microsoft.com/library)中 Windows Management Instrumentation 文档中的“使用 WQL 查询”。

查询通过包含以下内容限制返回的数据量:

  • SELECT 子句,指定只返回某些属性的数据。

  • WHERE 子句,指定要返回的实例。

例如,以下查询选择计算机上所有可用空间小于 2 MB 的驱动器(驱动器 C、D 等):

SELECT * FROM Win32_LogicalDisk WHERE FreeSpace < 2000000

查询类的类型

.NET Framework 中的 WMI 包含 Framework 架构中的许多查询类。有些查询类执行特定类型的 WQL 查询,例如 WQL SELECT 查询或 WQL ASSOCIATORS OF 查询。

下表显示可以用于生成 WMI 数据查询的查询类。

 
.NET Framework 类 说明

EventQuery

WMI 事件查询。在 ManagementEventWatcher 类的构造函数中,使用此类或其派生类的对象预订 WMI 事件。尽可能使用此类更具体的派生类,例如 WqlEventQuery 类。

ManagementQuery

派生其他查询类的抽象基类。

ObjectQuery

可以返回实例或类的 WMI 对象的查询。

RelatedObjectQuery

一种 WQL ASSOCIATORS OF 查询,既可以用于实例查询又可以用于架构查询,视请求的是类还是实例子集而定。用于在 ManagementObjectSearcher 类的构造函数中指定查询,以获取通过关联类进行关联的类的所有实例。

RelationshipQuery

一种 WQL REFERENCES OF 查询,既可以用于实例查询又可以用于架构查询,视请求的是类还是实例子集而定。

SelectQuery

一种 WQL SELECT 查询,既可以用于实例查询又可以用于架构查询,视请求的是类还是实例子集而定。有关更多信息,请参见 MSDN Library(网址为 http://msdn.microsoft.com/library)中 Windows Management Instrumentation 文档中的“用于数据查询的 SELECT 语句”、“用于事件查询的 SELECT 语句”或“用于架构查询的 SELECT 语句”。

WqlEventQuery

WQL 格式的 WMI 事件查询。在 ManagementEventWatcher 类中使用此类或其派生类的对象预订 WMI 事件。

WqlEventQuery

WQL 格式的 WMI 查询。在 ManagementObjectSearcher 类的构造函数中使用此类或其派生类的对象指定查询。为了更具体,尽可能使用此类更简明的派生类,例如 SelectQuery 类。

下图显示 .NET Framework 类库中的 WMI 查询类的继承。.NET Framework 中的 WMI 包含对象查询类和事件查询类。

查询类的类层次结构

查询类和 WQL 查询

using System;
using System.Management;
class Query_SelectQuery
{
    public static int Main(string[] args) 
    {
        SelectQuery selectQuery = new 
            SelectQuery("Win32_LogicalDisk");
        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher(selectQuery);

        foreach (ManagementObject disk in searcher.Get()) 
        {
            Console.WriteLine(disk.ToString());
        }

        Console.ReadLine();
        return 0;
    }
}

此代码示例使用 SELECT 查询的原始 WQL 形式。

Visual Basic
Imports System
Imports System.Management

Public Class Query_Select_FullString

    Public Overloads Shared Function _
        Main(ByVal args() As String) As Integer

        Dim wqlQuery As WqlObjectQuery
        wqlQuery = New WqlObjectQuery( _
            "SELECT * FROM Win32_LogicalDisk")

        Dim searcher As ManagementObjectSearcher
        searcher = New ManagementObjectSearcher(wqlQuery)

        Dim disk As ManagementObject
        For Each disk In searcher.Get()
            Console.WriteLine(disk.ToString())
        Next

        Console.ReadLine()
        Return 0

    End Function
End Class
using System;
using System.Management;

class Query_Select_FullString
{
    public static int Main(string[] args) 
    {
        WqlObjectQuery wqlQuery = 
            new WqlObjectQuery("SELECT * FROM Win32_LogicalDisk");
        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher(wqlQuery);

        foreach (ManagementObject disk in searcher.Get()) 
        {
            Console.WriteLine(disk.ToString());
        }

        Console.ReadLine();
        return 0;
    }
}
复制代码
要使用 C++ 通过 WMI 查询网卡的所有信息,您可以使用以下步骤: 1. 引用 WMI 类库。您可以在 Visual Studio 的“项目”菜单中选择“添加引用”,然后选择“System.Management”来添加类库。 2. 初始化 COM 库。您可以在程序的开头调用 CoInitializeEx 函数来初始化 COM 库。 3. 使用 COM 对象获取 WMI 服务对象。您可以使用 CoCreateInstance 函数创建 IWbemLocator 接口实例,并使用该实例的 ConnectServer 方法连接到本地或远程计算机上的 WMI 服务。 4. 使用 WMI 查询语言 (WQL) 获取 Win32_NetworkAdapter 类的实例。您可以使用 IWbemServices 接口的 ExecQuery 方法并指定查询语句来获取 Win32_NetworkAdapter 类的实例。 5. 遍历每个网卡实例并获取其属性。您可以使用 IWbemClassObject 接口的 Get 方法获取每个实例的属性,并将其存储在 C++ 变量中。 以下是一个简单的示例代码,它演示了如何使用 C++ 获取本地计算机上所有网卡的名称和描述: ```cpp #include <iostream> #include <comdef.h> #include <Wbemidl.h> #pragma comment(lib, "wbemuuid.lib") int main() { // 初始化 COM 库 HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if (FAILED(hr)) { std::cerr << "Failed to initialize COM library. Error code: " << hr << std::endl; return 1; } // 获取 WMI 服务对象 IWbemLocator* pLocator = nullptr; hr = CoCreateInstance(CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID*>(&pLocator)); if (FAILED(hr)) { std::cerr << "Failed to create IWbemLocator object. Error code: " << hr << std::endl; return 1; } IWbemServices* pServices = nullptr; hr = pLocator->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), nullptr, nullptr, 0, NULL, 0, 0, &pServices); if (FAILED(hr)) { std::cerr << "Failed to connect to WMI service. Error code: " << hr << std::endl; pLocator->Release(); return 1; } // 查询 Win32_NetworkAdapter 类的实例 IEnumWbemClassObject* pEnum = nullptr; hr = pServices->ExecQuery(_bstr_t(L"WQL"), _bstr_t(L"SELECT * FROM Win32_NetworkAdapter"), WBEM_FLAG_FORWARD_ONLY, nullptr, &pEnum); if (FAILED(hr)) { std::cerr << "Failed to execute WMI query. Error code: " << hr << std::endl; pServices->Release(); pLocator->Release(); return 1; } // 遍历网卡实例并获取属性 IWbemClassObject* pObject = nullptr; ULONG uReturned = 0; while (pEnum->Next(WBEM_INFINITE, 1, &pObject, &uReturned) == S_OK) { // 获取名称和描述 VARIANT varName, varDesc; hr = pObject->Get(L"Name", 0, &varName, nullptr, nullptr); if (FAILED(hr)) { std::cerr << "Failed to get Name property. Error code: " << hr << std::endl; pObject->Release(); continue; } hr = pObject->Get(L"Description", 0, &varDesc, nullptr, nullptr); if (FAILED(hr)) { std::cerr << "Failed to get Description property. Error code: " << hr << std::endl; VariantClear(&varName); pObject->Release(); continue; } // 输出名称和描述 std::wcout << L"Name: " << varName.bstrVal << std::endl; std::wcout << L"Description: " << varDesc.bstrVal << std::endl; // 释放对象和变量 VariantClear(&varName); VariantClear(&varDesc); pObject->Release(); } // 释放资源 pEnum->Release(); pServices->Release(); pLocator->Release(); CoUninitialize(); return 0; } ``` 请注意,这只是一个简单的示例,Win32_NetworkAdapter 类还有许多其他属性,您可以根据需要查询和获取它们。此外,WMI 查询是一种强大的技术,可以用于检索计算机上的各种系统信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值