找回密码
 注册
搜索
查看: 13216|回复: 0

[收藏]C++ Builder 通过 WMI 获取系统信息

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
; W7 d( S( y7 a7 U! i" |% S7 Y6 S/ e

, v$ a% Q2 }. H# e/ J" g8 R  _3 i. F--------------------------------------------------------------------------------+ c2 t( A+ |" |, ^  F5 h
WMI: Windows Management Instrumentation (Windows 管理工具)8 G9 V2 p% r5 d- l9 o; A6 @2 b
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 - {, v) n! h& p6 |# l
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
8 e8 w( B8 E/ s1 ^1 I' l   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
" L- C  B4 k  ?3 e* v! B. z. E. v, s
--------------------------------------------------------------------------------
' b: E2 [) I  j7 D: GBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面& A* E" f3 H; Q5 u- D

) \% M, r6 R4 A* ^--------------------------------------------------------------------------------
5 L1 a9 H, A& L) J' V- T① 初始化 COM 接口:
# E8 S) m, F. s9 ~, }) E. Z   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
- ]* t1 {( b1 e7 u9 J   这两个函数在 #include <comdef.h> 里面定义。
  z+ d: I: a5 H
0 e, O# y- u) T. {② 获取访问 WMI 权限:
' c9 \3 E, |* A" @   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
2 Z- S; |! S3 E; q  Y- c0 r$ o; V   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
) F. k. Y/ i( L8 l
! B, _/ ?$ U* P3 K, h9 B③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:# M+ z' y+ B4 W
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。0 d4 [7 C* \3 l# H5 {' ~  J9 g
# h& ?, [: T, q" Q' v# R
void GetWmiInfo(TStrings *lpList, WideString wsClass)  ~* ^, `" [+ V6 ?; T3 [1 g
{; l+ F0 v% c8 h! S( R
  IWbemLocator *pWbemLocator = NULL;) N( \1 q# S9 `8 O5 _* U0 a
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
$ R2 o) B2 y- G   {; K& u# X0 T' g/ M6 G
    IWbemServices *pWbemServices = NULL;" b- o% O4 p5 u) Z
    WideString wsNamespace = (L"root\\cimv2");
$ T: N0 c. L) ]$ P* z! `     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
/ T3 o6 ^) [9 d  L5 ?      {8 u" e" C$ P- q. g+ X. n7 \
       IEnumWbemClassObject *pEnumClassObject = NULL;
3 c0 v/ q1 d, s2 O        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;: a  k. [1 ]' M7 Z; J# `4 `
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 P  O: |3 [1 k  P; H+ e: Q0 K6 ?  _         {. H! p  F9 _' G, L
          IWbemClassObject *pClassObject = NULL;
) D! _1 ^8 E: O* V' p& f1 @           ULONG uCount = 1, uReturned;
6 x$ ?) `$ |0 U1 X/ j           if(pEnumClassObject->Reset() == S_OK)
4 u. |! `7 G5 W% R            {5 F' G8 t2 B- w0 ]: d$ Y- ~6 g" n9 I
             int iEnumIdx = 0;
  |3 Y$ M7 I  h6 t9 W: [) E              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
$ S6 c/ A4 \& E7 i7 F               {- k2 T% I9 @+ R. q% }6 L) B4 A
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
8 Z' e3 V# s4 }2 i$ g; v; A
+ w% p& m0 r6 i; G2 H; u                 SAFEARRAY *pvNames = NULL;
# I7 F7 @* w3 R- L5 H                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
4 L% |' D8 H1 x                  {# F. F5 v/ @0 d6 J
                   long vbl, vbu;
1 |7 b- i' b& w( O8 [3 E                    SafeArrayGetLBound(pvNames, 1, &vbl);
. l4 L. w: o' g9 U4 a/ R                    SafeArrayGetUBound(pvNames, 1, &vbu);: K9 {; q" `9 j8 I6 K1 _
                   for(long idx=vbl; idx<=vbu; idx++)2 F* j) _/ D( U7 `) M7 |
                    {7 H& R- {; t) S% m
                      long aidx = idx;
" p. i$ L  q& [/ b: B                       wchar_t *wsName = 0;
' j' {! v- \9 }: @& o& e                       VARIANT vValue;: d, A9 \" f' H
                      VariantInit(&vValue);% D5 m6 s1 Y+ P+ H9 n/ v& Y4 z
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
% u+ p4 A7 P+ k
9 K) j1 \4 s8 g, A9 `" ~! k                       BSTR bs = SysAllocString(wsName);: z( ~" N' w2 X  h& M0 G
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);1 ]4 `+ }: M& v4 A" ]  U) n: c
                      SysFreeString(bs);
. Z' Q; M, D- W/ ^: e% n2 C+ Y' r1 g! t6 C, y/ S& N- l
                      if(hRes == S_OK); m8 \4 q4 E$ P  K8 k* B
                       {" d! @  {6 p" C7 C5 j
                         AnsiString s;2 X1 J: R' s+ X3 d: ]! r
                         Variant v = *(Variant*)&vValue;
: I8 b2 i8 E8 H* P' {                          if(v.IsArray())3 |  |7 C. z* {# P1 Q3 m6 E: P
                          {7 \% Q, Q' R/ \* Y% [
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)3 U) F% G' j  W. M% y8 P& H
                             {0 E( P1 g8 ~- ?8 c. B) g- K
                               Variant a = v.GetElement(i);" w; j) C' t2 L
                               if(!s.IsEmpty())$ p! C. s0 k- U' @/ O& Q$ c
                                 s+=", ";3 I$ e+ h5 i5 j; O! A$ M
                               s+=VarToStr(a);
4 k3 G5 K5 K; P0 N2 c9 p2 L                              }
; V) E0 s5 B: A8 E( ^                           }
" Y$ ^; O* b* I$ \' @6 C                          else
# l, L) ^, J, U2 t                           {/ u/ v6 I; m' C8 T$ U( l7 K
                            s = VarToStr(v);8 l# r% |9 |/ w9 v) Z+ d  Y2 I
                          }
4 m* A- p  o9 n8 S5 p                          lpList->Add(AnsiString(wsName)+"="+s);
! p* w' O/ R, d$ W3 ^                        }
$ @1 o+ s+ |4 I, H, _7 g& R- s4 L, y
                      VariantClear(&vValue);
; |. L) r4 [+ P( j4 H* X( r) Q6 x                       SysFreeString(wsName);
  a+ p1 h6 p# x$ y; f) j$ W* g+ ]                     }) u3 W2 k1 _1 a0 [4 M' p
                 }1 U  @" y1 U/ h
                if(pvNames)SafeArrayDestroy(pvNames);
' Q; r3 o" m. Z$ Z0 [5 b2 v/ }; P                 iEnumIdx++;
" j$ S( [% n" ]2 w* l* Y3 \               }- x3 J/ \8 @& ~! F
           }, N) Z4 L2 E, B, O1 t1 u+ e2 V* r! R8 W
          if(pClassObject)pClassObject->Release();" a0 o& J0 j' v6 q2 ~# _
        }
# p8 C$ f8 b% |3 k# v6 v+ e        if(pEnumClassObject)pEnumClassObject->Release();. I3 y4 h3 P% K4 _" H& z- W
     }5 A% Y7 w4 v2 [) u3 B, r2 ~
    if(pWbemServices)pWbemServices->Release();
7 [) o" b- a2 W   }
2 N: `7 C) }& d4 y9 L% p. P8 G  if(pWbemLocator)pWbemLocator->Release();, I7 F3 Z% d. s( \- |2 P5 ~* k
}0 |) K. Z8 c6 u% S; w
//---------------------------------------------------------------------------2 [6 E" L: n, {' L% F

- O9 A+ N/ U/ F; Z: i( h9 I// 通过 WIN32_bios 获取 BIOS 信息:7 h. \3 E/ R2 b* ^
void __fastcall TForm1::Button1Click(TObject *Sender)
1 L, ]$ O7 a! ?2 K- S' h' a' L! e9 {{
3 O  e* e! Z2 e2 b* a    Memo1->Lines->Add("================== [WIN32_bios] =================");- l$ y# P# q  R7 ?: T, e: U
   GetWmiInfo(Memo1->Lines, "WIN32_bios");+ ]7 j7 G6 I& F* b
   Memo1->Lines->Add("");
( l4 ^3 [/ z0 a* k4 X, R: s}
' c. [6 E9 Z* n9 ]% v5 M- M  Z2 L( E' g
--------------------------------------------------------------------------------
6 V9 m: ?4 |8 K1 \+ A
( f! F- x, ^' o# c7 k( m- bWMI 可以访问的信息类型有:( I' P$ p! k7 ^0 I  H' y8 @0 w8 s2 i
  Win32_1394Controller9 H1 G3 q/ D5 p) i1 K4 }+ Q$ {
  Win32_BaseBoard. I, l3 h; d: w# O/ F& ^
  Win32_Battery1 F4 }; H4 i; R6 i' b
  Win32_BIOS
3 y% m1 c" U6 ~  K  I   Win32_Bus  I( _2 X+ @$ S* z- t1 G
  Win32_CacheMemory3 e* g* t  Q3 A/ f# ^7 W+ e+ V; F
  Win32_CDROMDrive
4 I' C$ K, m  s- G   Win32_CurrentProbe
: Q" R5 N) M6 D) W4 R+ f   Win32_DesktopMonitor% _. a9 A) E6 y" z2 \
  Win32_DeviceMemoryAddress
  j% \7 w  o! F* L; Q   Win32_DiskDrive: Y+ N  a- m2 r' F: y
  Win32_DisplayConfiguration3 F" m- h6 \0 Z3 w! e5 G2 K
  Win32_DisplayControllerConfiguration) }8 s% g6 x$ Z9 R/ M% s# M, J+ j
  Win32_DMAChannel0 H" i1 y( z; Y; j
  Win32_Fan  {5 K- K7 R* {. ?8 J
  Win32_FloppyController
/ j2 M4 @+ c8 K0 X1 o/ Q2 I( z   Win32_FloppyDrive/ d7 ]4 T* y1 K
  Win32_HeatPipe
7 {" n) m2 {6 X# ?' r   Win32_IDEController
6 G7 u! [/ p, D2 h   Win32_InfraredDevice
2 E& i0 j# ~5 }+ M* [   Win32_IRQResource
" z8 |0 @3 [  D0 ^% y) {; h. @   Win32_Keyboard  M0 w: z# G$ M( X; n3 F2 w! y
  Win32_MemoryArray; ]! P* y# K$ B+ Z! @  n/ O, Z; K
  Win32_MemoryDevice
- @0 ^, c; k* ~   Win32_MotherboardDevice; y, a% i, r! x
  Win32_NetworkAdapter
  Q5 O1 y* @! M# t0 F   Win32_NetworkAdapterConfiguration
* D$ I; K: _5 o" x. j% b   Win32_OnBoardDevice
3 `1 V. c7 t4 O- ~   Win32_ParallelPort  a' m+ C! R) [2 v5 r$ X3 `
  Win32_PCMCIAController
: `8 f0 L) K; R/ {( Z9 F   Win32_PhysicalMemory  D5 o$ R) C) H( g
  Win32_PhysicalMemoryArray
" Q! `7 j: d$ T1 H$ K) a- L8 `% U# {   Win32_PnPEntity
4 ]' ^5 ?: q; a- f   Win32_PointingDevice
/ s0 J' f' s1 v& B5 `0 P5 g2 D   Win32_PortableBattery9 m: B* P2 T7 g* o. W: d
  Win32_PortConnector
, N6 |, W3 E" L& \  [- q   Win32_PortResource
' a9 X0 [4 z" N# Y   Win32_POTSModem
# [' c. _4 M% `3 I" k( M  ], ^   Win32_PowerManagementEvent
+ E! P& A+ g/ u9 ?5 L) L   Win32_Printer
% t* q# n* u& f# P+ Y0 d( {1 X   Win32_PrinterConfiguration7 T1 Y9 A2 g+ I( p9 T5 G9 h$ a
  Win32_PrintJob
2 L  u5 }& r) p& l6 R   Win32_Processor  X& K. I  j# @( B# A
  Win32_Refrigeration
; e' Q/ \2 Y! i& @3 \! x' `   Win32_SerialPort
& e- X# I  _1 F' J   Win32_SerialPortConfiguration
* f( ~5 V$ A/ `( Q/ ]   Win32_SMBIOSMemory
' }$ M$ V- c6 W   Win32_SoundDevice
7 ?* Z& k9 }8 M$ H2 S   Win32_SystemEnclosure' r, n1 f7 q1 w9 h& E9 x4 n
  Win32_SystemMemoryResource
) Z3 _7 S: i' P/ k- X1 [/ F   Win32_SystemSlot1 G# v: Q6 ^8 N
  Win32_TapeDrive
5 g/ G0 Q4 C1 G/ S! `' E. [% [3 d" Y   Win32_TemperatureProbe
0 F0 R* p/ U6 s' G6 @   Win32_UninterruptiblePowerSupply
% ?: ^  k  s1 m: K6 H+ [! q2 _/ X   Win32_USBController/ u+ V& h3 j+ {4 _; T3 ~
  Win32_VideoConfiguration" d, B9 X- g5 E2 x) c
  Win32_VideoController
+ P% ?& E2 H4 k# A4 N   Win32_VoltageProbe
  q, o: u" v( f( Q: c0 n8 n" ]5 z; r' l
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-8-14 00:08 , Processed in 0.018861 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表