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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
( @6 a6 C0 p; n
8 b7 O  X9 N) e' e
" D6 y, i& Z6 d8 q/ L$ h--------------------------------------------------------------------------------% g( l: @8 h3 M% `' E
WMI: Windows Management Instrumentation (Windows 管理工具), b7 ]) d1 m0 o7 |) ?8 p' `
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 & K% t% B2 L! A8 u& V$ @0 _: M  `# Z
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。9 K( @, F4 Z: a1 l7 E, E% r
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 + b$ J1 Z- t4 _/ G" Y

+ J8 z  ]% x$ P& ?0 w--------------------------------------------------------------------------------* _2 q* V  Q) P, n/ \; o
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
7 n3 z' n& j+ {4 N( O' _' h1 J/ o# J, @( A
--------------------------------------------------------------------------------+ S8 a/ w9 q4 H/ Y& m" G; Y
① 初始化 COM 接口:/ |) Y4 o2 f* b
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
* G: b9 o& M0 |   这两个函数在 #include <comdef.h> 里面定义。
$ w: b4 n6 R7 N1 y  V; d1 M4 ?# z! R8 F# q% Q+ Z8 P
② 获取访问 WMI 权限:
8 |7 u' J2 L. E- B; N( ^5 p   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);* W+ \* a8 \0 f
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
$ N- ^7 a  K8 f/ |7 O" H4 `  ^! R
  e& R. t9 l- S0 ^- Z7 k, t* _" z③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:" T' n4 R1 l3 j7 r7 A' F- y
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
. X' N3 w& U1 W0 k
. U9 b* ^, `; \/ Q0 N2 ~void GetWmiInfo(TStrings *lpList, WideString wsClass)1 m( A- M% x% p. S! X4 L
{8 Q* V3 x. U( z" P- V9 x
  IWbemLocator *pWbemLocator = NULL;% `  F  W& Q2 h! H% ]
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)! P. V  _9 F* `1 w  k4 ?
  {3 v3 K& l/ `" q7 z  b6 u3 h; z+ V
    IWbemServices *pWbemServices = NULL;
" B+ P8 @2 k. G! }* N5 t5 N( m: K+ M! u  x     WideString wsNamespace = (L"root\\cimv2");
/ Q4 y7 e8 S9 r7 G1 E$ n$ e7 q; H+ S     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)* S7 A1 _# x0 {5 {4 f1 |+ v2 y
     {% X9 Z( Y# |+ n
       IEnumWbemClassObject *pEnumClassObject = NULL;  a: {: U" ^/ \3 t& q! F+ p$ N
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;- X8 {+ s, |: G# j. d7 m
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)1 G2 `* ~3 k' {" Z- w" B: M
        {
+ y' b& \0 F4 g           IWbemClassObject *pClassObject = NULL;9 t) g6 \' M) h# \
          ULONG uCount = 1, uReturned;4 Z* c2 k; J: D+ ]( T
          if(pEnumClassObject->Reset() == S_OK)3 h: |& L# B1 @; r$ s. E* v9 F
           {
- ^* }8 q9 U) o) V1 d% P              int iEnumIdx = 0;
9 i2 [2 a9 q9 ]- Q6 v) c              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
$ K' l9 ?$ }9 ~; X( S               {
$ r# @/ A8 e  I8 a                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
) c. q* N, m6 r" h" f# l+ N. A
2 N5 S9 E2 S! R3 `9 Y9 \                 SAFEARRAY *pvNames = NULL;$ g6 K. \1 {+ G9 ]% }# _7 e
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
" s' [! j; @4 a, [6 p) @                  {
! s" T. a% k7 Q( Q                    long vbl, vbu;- J4 F7 {( c: X0 F7 b
                   SafeArrayGetLBound(pvNames, 1, &vbl);8 Q# M) }6 w$ O: u! G4 S0 o
                   SafeArrayGetUBound(pvNames, 1, &vbu);" n3 N9 ?- K* _8 C  S: o  n1 y8 U
                   for(long idx=vbl; idx<=vbu; idx++)  ?% s, @  d* [  Q
                    {
5 \. N* L  A6 e8 E) C                       long aidx = idx;1 {0 U  k! y, _
                      wchar_t *wsName = 0;1 t4 {+ x0 c' X2 E4 x, `" }
                      VARIANT vValue;
1 }: w) ]; J+ l. \% P' n! s! S                       VariantInit(&vValue);/ `6 l3 s+ I2 I
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
8 S: I8 z! o1 r$ E5 n
1 z, O3 g7 `& j                       BSTR bs = SysAllocString(wsName);
: Y* S! Y5 S8 Y; `1 ^                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
' K$ [; _  |9 w" `! M. T3 k                       SysFreeString(bs);: I5 P$ b. S7 P( S" |
9 e2 W% K- F6 A* P% M
                      if(hRes == S_OK)
. e$ A- Q' Z5 L: N3 Q                        {
. u( z) F6 X! c0 i# {                          AnsiString s;
  b2 N  [/ `1 H" T* i2 ~                          Variant v = *(Variant*)&vValue;* N' f9 Y* t. O. }' V
                         if(v.IsArray())' Q" k1 f# R* ^2 p" g
                          {3 p' o3 `8 \4 d5 R8 x" K
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)0 @) `. a6 V  r1 L) t4 g( k# i
                             {. J) j* s% J/ S# i9 x1 B/ z
                               Variant a = v.GetElement(i);- k- F. J. [# Y/ {
                               if(!s.IsEmpty())
# a1 E2 m" `& B                                  s+=", ";
  }" n9 G, r! `- t9 h                                s+=VarToStr(a);
% ^0 K' j6 x6 U, I6 A3 [5 f) U                              }7 f9 B) q# B4 a4 P! J5 |/ {
                          }; T2 n" [+ z* L/ o% G: j- k
                         else8 o1 e+ E  }( x% S; m/ M
                          {
3 ]* J- ~! b8 x9 I                             s = VarToStr(v);
& `/ i, f* ?' K- v6 Q                           }" D+ D* {. q5 R7 _! q+ }* `" Q7 \
                         lpList->Add(AnsiString(wsName)+"="+s);, m$ z5 F2 {2 f; {4 f' g' L
                       }
  s8 l  F* f9 M6 A* ]/ Y6 v: Z
' Q8 ^5 @4 b9 ?8 s2 ^! i                       VariantClear(&vValue);' ~" f8 k0 E& q- d$ J; K; \
                      SysFreeString(wsName);& n/ \% ^0 ?( m5 z: E8 H( o
                    }
9 \8 W$ H' x, {/ N- e0 `                  }* V. m+ h8 I3 n
                if(pvNames)SafeArrayDestroy(pvNames);7 ~5 T$ T2 j  v2 |
                iEnumIdx++;; b/ ?. p& ]" e" y8 f1 ?% l
              }0 e- p- o" B, ^% m6 J) }- q
           }
; c$ q% X& u3 N           if(pClassObject)pClassObject->Release();
$ ~: _& b7 ~; @0 ]' l         }3 m- T9 A: a9 W7 p! m
       if(pEnumClassObject)pEnumClassObject->Release();
: b3 a1 }* f$ G1 y+ l: D0 }      }
2 k3 |$ D4 G( h* x. v9 z* H     if(pWbemServices)pWbemServices->Release();+ @% P! ~1 V* F. R. S, W
  }
. ?; U: P% t4 a% @' D  ]7 [  if(pWbemLocator)pWbemLocator->Release();. U2 K% C. K: C% n& {
}
) B& k/ D" O  G4 |, `7 i//---------------------------------------------------------------------------1 N3 J$ @/ E7 b8 x: T$ T* `  b

" I! c, D0 b/ i// 通过 WIN32_bios 获取 BIOS 信息:
6 h. H* e. x: m" z% f+ Svoid __fastcall TForm1::Button1Click(TObject *Sender)
; y2 f% u* ?3 t; _1 d1 E1 J{  A: b6 K! b, u) a
   Memo1->Lines->Add("================== [WIN32_bios] =================");8 S- A. K4 h! M' e  z2 o" W
   GetWmiInfo(Memo1->Lines, "WIN32_bios");% P, L4 W; N# L
   Memo1->Lines->Add("");+ J7 W- `" x1 A+ l
}# i+ ^' T: |/ G  e6 U: U

/ X( I( X* L4 D+ {$ @# k: w8 [--------------------------------------------------------------------------------; R+ G' S# x. y" F6 m

% E# a5 e) P: Q! y( ]2 XWMI 可以访问的信息类型有:
" ^0 Z. F5 j2 u  D7 ^   Win32_1394Controller
# _* t) n) i6 U& c   Win32_BaseBoard
- H! p9 I! I3 N+ I- Z   Win32_Battery+ c5 i/ F: p4 n2 _
  Win32_BIOS+ v+ t# h( d' o- j! m8 d9 A
  Win32_Bus
+ H( V* q! A" }# l: I7 g; h   Win32_CacheMemory
/ s( K/ s5 N0 T# b- O   Win32_CDROMDrive! e3 B% t0 W3 Q$ C  ]
  Win32_CurrentProbe
( S& A$ q6 k/ }8 B3 L9 V4 f   Win32_DesktopMonitor
) J) F7 P# ?& _5 O   Win32_DeviceMemoryAddress
- T  b% ~7 U7 d   Win32_DiskDrive
0 O! a' `, @9 R8 s8 L   Win32_DisplayConfiguration6 R* r: q% Y( v5 m+ D! x
  Win32_DisplayControllerConfiguration
% T, Y* F2 P" U8 m$ s! d   Win32_DMAChannel8 p0 ^" S+ D% l6 d, c9 I5 V
  Win32_Fan7 c% {- l. B; H2 C, K+ B- U/ k- ?6 m  x
  Win32_FloppyController
5 f+ T8 n. I+ M2 H- f# J   Win32_FloppyDrive' x9 l% c" B4 X
  Win32_HeatPipe- M* E9 v  ^2 F% M$ m) p/ d. R
  Win32_IDEController
: p/ [0 U( B4 O5 G   Win32_InfraredDevice
% E9 e/ D( P! e+ ]/ |& o1 p   Win32_IRQResource. p+ p2 I; x% ]  M1 K% v/ d/ I7 H0 R
  Win32_Keyboard5 p! l1 M* l: w% y# o
  Win32_MemoryArray
/ H$ i, q' ~1 ^7 ^, m   Win32_MemoryDevice
0 a+ X! o+ }1 D' ]" S   Win32_MotherboardDevice3 d9 F* ]) u/ @
  Win32_NetworkAdapter+ r3 a* l6 n. S8 P
  Win32_NetworkAdapterConfiguration( C7 n. n6 p+ B; W, _# `
  Win32_OnBoardDevice; J6 R6 {8 @5 H9 x( }. s/ u  h+ Y
  Win32_ParallelPort
. X& u3 O2 l5 T% m. k% N5 c8 R   Win32_PCMCIAController4 h$ [' H1 H( m! G5 B
  Win32_PhysicalMemory3 Q  E: v' P. {
  Win32_PhysicalMemoryArray, t7 }9 S. Q+ k3 s# t6 [( _% X
  Win32_PnPEntity
2 N1 L$ E3 E6 F3 b/ Q   Win32_PointingDevice
/ m- c- y" }9 u: ^, g3 }6 ]! V2 O   Win32_PortableBattery' a- J2 H  Z; C* ?3 d! R
  Win32_PortConnector7 ]* C) b) t$ ~$ o
  Win32_PortResource: ^3 P, `4 I. E! a  J
  Win32_POTSModem! `3 f2 M% r. X4 c" h7 V
  Win32_PowerManagementEvent  g# b& T- @9 {# G
  Win32_Printer; x  Y2 z2 n! h2 c$ Z9 T& |; M- K
  Win32_PrinterConfiguration- r8 `# v5 Y% G' x+ V$ r
  Win32_PrintJob
4 P6 _6 l+ ?. B+ a9 x- @/ b   Win32_Processor
: u0 @8 i7 |3 o1 K' Y, E1 b8 b   Win32_Refrigeration
! }6 e+ e  B# b   Win32_SerialPort( r8 K, W( W" m
  Win32_SerialPortConfiguration
7 V# n" s; }& H5 C$ i7 U* Y   Win32_SMBIOSMemory  F: B( ^/ ^0 D
  Win32_SoundDevice; g% n- \/ q+ p! ?& W
  Win32_SystemEnclosure
$ G1 n- R1 m3 C0 T0 U   Win32_SystemMemoryResource  o4 }. P2 A  _2 H) X
  Win32_SystemSlot
! E3 R: S' V5 k* r' {   Win32_TapeDrive+ f9 a: z$ _/ I# Q! I$ S
  Win32_TemperatureProbe
9 m) l; Q- M: w2 e   Win32_UninterruptiblePowerSupply
+ u1 M* m" F( E7 x   Win32_USBController, ]1 V& c5 K* m. R9 q: e
  Win32_VideoConfiguration8 B0 T6 M) T% s+ O
  Win32_VideoController: W5 l+ h; e& e3 E4 E
  Win32_VoltageProbe
" k5 [- S+ l" }. W6 C. I. n
5 }% S$ ?: G6 [6 Z$ y以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-9 12:39 , Processed in 0.018001 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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