现在的位置: 首页 > 综合 > 正文

VC调用WMI框架

2013年08月22日 ⁄ 综合 ⁄ 共 9307字 ⁄ 字号 评论关闭

微软MSDN的一个例子
在vc6下编译测试通过

#include <afx.h> //用到了CString 的 BSTR转ANSI
#define _WIN32_DCOM //这个不懂

//vc6的bug.所以没用使用标准stl..
#include <iostream.h>
#include <iomanip.h>
//using namespace std;
//com组件
#include <comdef.h>
#include <Wbemidl.h>
# pragma comment(lib, "wbemuuid.lib")

int main(int argc, char **argv)
{
    HRESULT hres; //定义COM调用的返回

// Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------

    hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
    if (FAILED(hres))
    {
        cout << "Failed to initialize COM library. Error code = 0x" 
            << hex << hres << endl;
        return 1;                  // Program has failed.
    }

// Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
    // Note: If you are using Windows 2000, you need to specify -
    // the default authentication credentials for a user by using
    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
    // parameter of CoInitializeSecurity ------------------------
    //常规安全级别设置(不写系统会调用默认的)
    hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );

                      
    if (FAILED(hres))
    {
        cout << "Failed to initialize security. Error code = 0x" 
            << hex << hres << endl;
        CoUninitialize();
        return 1;                    // Program has failed.
    }
    
// Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------
    //创建一个CLSID_WebmLocator对象.
    IWbemLocator *pLoc = NULL;
    hres = CoCreateInstance(
        CLSID_WbemLocator,
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres))
    {
        cout << "Failed to create IWbemLocator object."
            << " Err code = 0x"
            << hex << hres << endl;
        CoUninitialize();
        return 1;                 // Program has failed.
    }

// Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method
    //连接WMI
    IWbemServices *pSvc = NULL;

    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
         _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
         NULL,                    // User name. NULL = current user
         NULL,                    // User password. NULL = current
         0,                       // Locale. NULL indicates current
         NULL,                    // Security flags.
         0,                       // Authority (e.g. Kerberos)
         0,                       // Context object 
         &pSvc                    // pointer to IWbemServices proxy
         );
    
    if (FAILED(hres))
    {
        cout << "Could not connect. Error code = 0x" 
             << hex << hres << endl;
        pLoc->Release();     
        CoUninitialize();
        return 1;                // Program has failed.
    }

    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;


// Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------
    // 设置连接的安全级别
    hres = CoSetProxyBlanket(
       pSvc,                        // Indicates the proxy to set
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
       NULL,                        // Server principal name 
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
       NULL,                        // client identity
       EOAC_NONE                    // proxy capabilities 
    );

    if (FAILED(hres))
    {
        cout << "Could not set proxy blanket. Error code = 0x" 
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return 1;               // Program has failed.
    }

// Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----
    //执行你的代码
    //以SELECT开头,后面跟要查询的属性名(字段名)(可使用通配符*),再跟FROM,后面跟你要查询的类的名字
    // 下面是获取操作版本信息的方式
    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
//        bstr_t("SELECT * FROM Win32_OperatingSystem"),
        bstr_t("SELECT * FROM Win32_Process"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);
    
    if (FAILED(hres))
    {
        cout << "Query for operating system name failed."
            << " Error code = 0x" 
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return 1;               // Program has failed.
    }

// Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
    //枚举查询
    IWbemClassObject *pclsObj;
    ULONG uReturn = 0;
    cout<<"ProcessID  :ProcessName"<<endl;
    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
            &pclsObj, &uReturn);

        if(0 == uReturn)
        {
            break;
        }

        VARIANT vtProp;
//         // Get the value of the Name property
//         hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
//         CString str(vtProp.bstrVal);
// 		//        cout << " OS Name : " << str.GetBuffer(NULL) << endl;
//         cout << " Process+++: " << str.GetBuffer(NULL) << endl;
//         //cout << " OS Name : " << vtProp.bstrVal << endl;

        // Get the value of the Name property
        hr = pclsObj->Get(L"ProcessID", 0, &vtProp, 0, 0);
        cout <<setw(10)<<(vtProp.uiVal) << ends;
                
		hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
		CString str(vtProp.bstrVal);
        cout << ":" << str.GetBuffer(NULL) << endl;

        VariantClear(&vtProp);

        pclsObj->Release();
    }

// Cleanup
    // ========
    // 不要忘记释放COM对象.
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
//MSDN例子的错误
    if(!pclsObj)
        pclsObj->Release();
    CoUninitialize();

    return 0;   // Program successfully completed.
}

一个同样功能的vbs...

strComputer = "."   ' Dot (.) equals local computer in WMI

Set wbemServices = Getobject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_Process")

For Each wbemObject In wbemObjectSet
    WScript.Echo "Name:       " & wbemObject.Name      & vbCrLf & _
                 "Handle:     " & wbemObject.Handle    & vbCrLf & _
                 "Process ID: " & wbemObject.ProcessID
Next

枚举命名空间

strComputer = "."

Call EnumNameSpaces("root")

Sub EnumNameSpaces(strNameSpace)

  WScript.Echo strNameSpace

  Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\" & strNameSpace)
  Set colNameSpaces = objWMIService.InstancesOf("__NAMESPACE")

  For Each objNameSpace In colNameSpaces
    Call EnumNameSpaces(strNameSpace & "\" & objNameSpace.Name)
  Next

End Sub

用 WMI 和 VBScript 设置脚本的默认命名空间

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colWMISettings = objWMIService.InstancesOf("Win32_WMISetting")

For Each objWMISetting in colWMISettings
        objWMISetting.ASPScriptDefaultNamespace = "root\cimv2"
        objWMISetting.Put_
Next

使用 WMI 和 VBScript 检索 CIM 命名空间

strComputer = "."

Set objServices = GetObject("winmgmts:\\" & strComputer & "\root")
Set colNameSpaces = objServices.InstancesOf("__NAMESPACE")

For Each objNameSpace In colNameSpaces
    WScript.Echo objNameSpace.Name
Next

使用 WMI 和 VBScript 检索所有 CIM 命名空间

strComputer = "."

Call EnumNameSpaces("root")

Sub EnumNameSpaces(strNameSpace)

  WScript.Echo strNameSpace

  Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\" & strNameSpace)
  Set colNameSpaces = objWMIService.InstancesOf("__NAMESPACE")

  For Each objNameSpace In colNameSpaces
    Call EnumNameSpaces(strNameSpace & "\" & objNameSpace.Name)
  Next

End Sub

使用 WMI 和 VBScript 检索在 root\cimv2 命名空间中注册的 Win32 提供程序

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colWin32Providers = objWMIService.InstancesOf("__Win32Provider")

For Each objWin32Provider In colWin32Providers
    WScript.Echo objWin32Provider.Name
Next

使用 WMI 和 VBScript 检索所有在 root\cimv2 命名空间中定义的类

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colClasses = objWMIService.SubclassesOf()

For Each objClass In colClasses
    WScript.Echo objClass.Path_.Path
Next

//WQL的具体使用实例

objSWbemServices.ExecQuery("SELECT * FROM Win32_Service")
objSWbemServices.ExecQuery("SELECT Name FROM Win32_Service")
objSWbemServices.ExecQuery("SELECT StartMode FROM Win32_Service")
objSWbemServices.ExecQuery("SELECT StartMode FROM Win32_Service WHERE State='Running'")
objSWbemServices.ExecQuery("SELECT StartMode, State FROM Win32_Service WHERE State='Running'")
objSWbemServices.ExecQuery("SELECT * FROM Win32_Service WHERE Name='WinMgmt'")
objSWbemServices.Get("Win32_Service.Name='WinMgmt'")

以下是部分WMI查询信息

提供程序     DLL     命名空间     说明

Active Directory 提供程序 
dsprov.dll
root\directory\ldap
将 Active Directory 对象映射到 WMI。

事件日志提供程序
ntevt.dll
root\cimv2
管理 Windows 事件日志,例如,读取、备份、清除、复制、删除、监视、重命名、压缩、解压缩和更改事件日志设置。

性能计数器提供程序
wbemperf.dll
root\cimv2
提供对原始性能数据的访问。

注册表提供程序
stdprov.dll
root\default
读取、写入、枚举、监视、创建、删除注册表项和值。

SNMP 提供程序
snmpincl.dll
root\snmp
提供对 SNMP MIB 数据的访问,并从 SNMP 托管设备捕获。

WDM 提供程序
wmiprov.dll
root\wmi
提供对 WDM 设备驱动程序中信息的访问。

Win32 提供程序
cimwin32.dll
root\cimv2
提供关于计算机、磁盘、外围设备、文件、文件夹、文件系统、网络组件、操作系统、打印机、进程、安全性、服务、共享、SAM 用户及组,以及更多资源的信息。

Windows 安装程序提供程序
msiprov.dll
root\cimv2
提供对已安装软件信息的访问。

Win32_Processor // CPU 处理器

Win32_PhysicalMemory // 物理内存

Win32_Keyboard // 键盘

Win32_PointingDevice // 点输入设备,如鼠标

Win32_DiskDrive // 硬盘驱动器

Win32_CDROMDrive // 光盘驱动器

Win32_BaseBoard // 主板

Win32_BIOS // BIOS 芯片

Win32_ParallelPort // 并口

Win32_SerialPort // 串口

Win32_SoundDevice // 多媒体设置

Win32_USBController // USB 控制器

Win32_NetworkAdapter // 网络适配器

Win32_NetworkAdapterConfiguration // 网络适配器设置

Win32_Printer // 打印机

Win32_PrinterConfiguration // 打印机设置

Win32_PrintJob // 打印机任务

Win32_TCPIPPrinterPort // 打印机端口

Win32_POTSModem // MODEM

Win32_POTSModemToSerialPort // MODEM 端口

Win32_DesktopMonitor // 显示器

Win32_VideoController // 显卡细节。

Win32_VideoSettings // 显卡支持的显示模式。

Win32_TimeZone // 时区

Win32_SystemDriver // 驱动程序

Win32_DiskPartition // 磁盘分区

Win32_LogicalDisk // 逻辑磁盘

Win32_LogicalMemoryConfiguration // 逻辑内存配置

Win32_PageFile // 系统页文件信息

Win32_PageFileSetting // 页文件设置

Win32_BootConfiguration // 系统启动配置

Win32_OperatingSystem // 操作系统信息

Win32_StartupCommand // 系统自动启动程序

Win32_Service // 系统安装的服务

Win32_Group // 系统管理组

Win32_GroupUser // 系统组帐号

Win32_UserAccount // 用户帐号

Win32_Process // 系统进程

Win32_Thread // 系统线程

Win32_Share // 共享

Win32_NetworkClient // 已安装的网络客户端

Win32_NetworkProtocol // 已安装的网络协议

brWin32_PageFileSetting // 页文件设置

下面举例:JS利用WMI可以获得电脑的硬件信息。

例如,获取硬盘序列号:

<html> 
<head> 
<title>提取硬盘序列号</title> 
<script> 
function disk() {//硬盘序列号 信息 
   var locator = new ActiveXObject ("WbemScripting.SWbemLocator"); 
   var service = locator.ConnectServer("."); 
   var properties = service.ExecQuery("SELECT * FROM Win32_DiskDrive"); 
   var e = new Enumerator (properties); 
   document.write("<table border=1>"); 
   for (;!e.atEnd();e.moveNext ()) 
   { 
      var p = e.item (); 
      document.write("<tr>"); 
      document.write("<td>" + p.signature + "</td>"); 
      document.write("</tr>"); 
   } 
   document.write("</table>"); 
} 
</script> 
</head> 
<body> 
<input type="button" value="硬盘序列号" onclick="disk()"> 
</body> 
</html>

抱歉!评论已关闭.