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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
3 m, O" ?+ v6 @; N" R; {; b4 d8 y5 Q6 t% g5 h# S

0 g% e9 X$ i, p1 l/ k--------------------------------------------------------------------------------7 g) q" I7 @3 j+ H
WMI: Windows Management Instrumentation (Windows 管理工具)6 h0 U% o& P+ @0 T& @4 D, v
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
  @6 b: n2 R3 o3 B5 j, |. V2 o   利用这个工具可以管理本地或客户端系统中几乎所有的信息。; s3 h; S2 \# j% l# z
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
* o) J7 O# l6 u# o8 |: D, i& n- k
--------------------------------------------------------------------------------3 o8 X) G* ~: H( A$ i6 F
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
! S3 a* Q$ S; f- F
6 C' C4 U) P; A/ ?" x% n--------------------------------------------------------------------------------7 p; U$ w% e5 m8 A9 q8 H  N8 g
① 初始化 COM 接口:% d+ f$ l! i7 Z
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。8 R$ v2 `& f) `; d9 S! B& ?1 ?& \
  这两个函数在 #include <comdef.h> 里面定义。$ `. h  O1 V4 C4 M8 {
% w% \! r2 o+ d$ C; b. ~
② 获取访问 WMI 权限:; _5 C7 y  g/ S3 G$ T8 Y( ?
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);2 o* u( d& d/ `0 W. A8 Q. U8 d
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
" e- I  X' H) O6 `0 X
, k3 f9 H5 y+ y1 ?# J' t% s8 T* p; `③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:: O( p( j5 x% }/ \/ [; w
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。* ]( _2 Y& g( J7 i9 j

  t5 M, b' |! kvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
# u; ^, s1 q2 r8 Z$ U  E+ K{
: V2 @& e6 X7 g8 O4 G$ P  IWbemLocator *pWbemLocator = NULL;% Q3 r5 \, l& m3 d' M4 e- W1 q. Q# ]
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
; @5 G& h6 ^2 d: Q  b4 p   {/ ~$ m0 a( \1 h2 T6 Y2 u1 r0 w1 k
    IWbemServices *pWbemServices = NULL;3 p# H7 h" }) }2 J
    WideString wsNamespace = (L"root\\cimv2");0 b5 x% N7 G- V+ a& t
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
3 o8 R8 m0 g$ ~. g+ `      {
; T" ]* E7 r" P! p) b9 T* U        IEnumWbemClassObject *pEnumClassObject = NULL;) C2 P$ j4 k1 L) ?! N' F# A" O
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
# K% [* w4 p, k( X4 D        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK): x( k/ e$ ]+ P
        {/ n4 a; X9 {0 B/ N  ?9 U+ B1 ?' @
          IWbemClassObject *pClassObject = NULL;5 e  F+ p2 w9 @6 @' c
          ULONG uCount = 1, uReturned;
- V# `! V7 q& v3 h) g           if(pEnumClassObject->Reset() == S_OK)" [) D; l1 L( K
           {1 O* d5 Y, W/ Z3 o3 H* z
             int iEnumIdx = 0;
' j% x# a/ G' V7 @              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)& \- u, o' w0 J1 e: i
              {  ?# U! ^& R) Z4 T  F: S' F
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");' d* K0 _2 r! Z4 z- z3 M

4 a# P7 d4 s0 H- d4 ~3 H2 f) \0 J                 SAFEARRAY *pvNames = NULL;& n+ H% d9 u0 J1 P! K( \) i  {
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
, l% q: d5 l" R                  {
" Q7 y# A6 M6 E, d! {$ }# G* y2 L* ^                    long vbl, vbu;
2 w) Q4 V0 ]5 Y' i/ G( [7 Y2 T                    SafeArrayGetLBound(pvNames, 1, &vbl);( \  L9 N  y+ W. f
                   SafeArrayGetUBound(pvNames, 1, &vbu);
( m3 @/ g' v" C! g( {: ?& k9 I7 X                    for(long idx=vbl; idx<=vbu; idx++)
! |' H. n" w' P, o. Z# j, Q4 B6 g                     {  A% e4 a$ P" g7 [
                      long aidx = idx;
' ]4 M* U/ V9 J" r( I                       wchar_t *wsName = 0;
- g* y% A0 t1 T" X  b                       VARIANT vValue;
! G- s9 q$ [' G7 \                       VariantInit(&vValue);
+ _4 a# m7 ?6 E! V- r. f4 H; }9 K# ]                       SafeArrayGetElement(pvNames, &aidx, &wsName);3 U  y+ e* d% h0 L8 O9 ~
* r) u) L2 q2 J8 c
                      BSTR bs = SysAllocString(wsName);
& f% I! d4 z8 `3 |) C/ J                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
0 L" f5 S5 q( ~) s/ i0 R$ ^                       SysFreeString(bs);2 ^3 W3 P; a7 c# d) j# f
& @  T+ G  [( O9 v% W( Q1 p0 c% F
                      if(hRes == S_OK)
5 V. O% J8 r: T0 u) H) `7 C                        {
# |$ B! g& `" e; W+ q* W: |/ _                          AnsiString s;; j) W/ D. \# r; p, J
                         Variant v = *(Variant*)&vValue;
4 m. \0 O% w  N+ K7 v! r5 Z9 q                          if(v.IsArray())
- e* Y+ X$ e% y                           {
) d. Y& V) z4 D* b; n$ I0 J( \                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
% n( _" {6 J, \; y! Z: T                              {
3 [) K# Y0 e" @+ n0 o  Z& K                                Variant a = v.GetElement(i);
$ \- S' m9 C$ L1 y! k3 k* ^) w                                if(!s.IsEmpty())
3 }  q3 k' j" D+ _- q# w                                  s+=", ";& E5 G4 _  F6 M8 S( |4 ]
                               s+=VarToStr(a);4 A2 k# i" l$ U8 O9 _7 V3 b
                             }: H# f7 C3 k9 R8 c5 G$ M! H2 t
                          }* S7 s) r9 A9 T  S! z& \) x9 L
                         else
/ b! {5 E7 o" n  u                           {3 ~( _2 O/ Z" X) F7 J
                            s = VarToStr(v);, H, m+ r9 x$ y8 q9 ?3 }
                          }" T, n3 X6 e7 C5 _
                         lpList->Add(AnsiString(wsName)+"="+s);) q' |+ W2 p% U. w; w( m) ?. Y
                       }9 j8 R8 g* ~% C5 i: b0 \/ m
+ Y( H) N& @* t( f6 H
                      VariantClear(&vValue);) B, v. l( V/ t( h
                      SysFreeString(wsName);' Z& y0 N0 W' u% K* f% L
                    }  d! V; O, B! `% L9 A) r; f/ j. k
                 }' y1 M; A" W2 k
                if(pvNames)SafeArrayDestroy(pvNames);( x% H/ B  `1 m3 \( |9 B
                iEnumIdx++;, u) j. V7 M# H" `
              }6 H) G# v7 p' E* N' {
           }
& Q$ P1 I! [" D" w/ d5 l1 o           if(pClassObject)pClassObject->Release();" K. G5 N6 ?% B- m. [" I
        }- K, B) U3 T( _. h
       if(pEnumClassObject)pEnumClassObject->Release();; P2 V2 q; `$ }
     }- f% R( t9 l6 u
    if(pWbemServices)pWbemServices->Release();
6 a0 l$ }6 N$ g0 ^. c   }
4 ^% X3 O$ m! Y0 o  if(pWbemLocator)pWbemLocator->Release();- p& O! B" L. {
}
$ }  Z4 P0 K: B7 I( V  `" S//---------------------------------------------------------------------------
) K* n* N0 N5 o2 v- L0 J; f; b2 t0 N& w) @# ]
// 通过 WIN32_bios 获取 BIOS 信息:
, W; {0 _* A. z) K4 B+ d. Ovoid __fastcall TForm1::Button1Click(TObject *Sender)
- \8 H6 v, c. y{
9 X8 [+ R; {. C    Memo1->Lines->Add("================== [WIN32_bios] =================");
: y5 r. s0 x' [6 q0 y8 o% X    GetWmiInfo(Memo1->Lines, "WIN32_bios");
, s! [: o2 J0 K5 T    Memo1->Lines->Add("");- t# q' I( J" q4 \" q3 J- J6 R
}& i0 }$ a) j" ~; ~7 e( I7 N- Y- T

3 q1 n6 Q* P% _' v5 l2 X# o--------------------------------------------------------------------------------5 d4 F/ }3 n; N. D$ w9 Y" h

4 y; `$ i7 A$ x5 _0 E* MWMI 可以访问的信息类型有:
! U8 _1 }' V" a; j   Win32_1394Controller% J3 D. @3 \/ ?; S2 r& R$ I
  Win32_BaseBoard* t/ ^! h/ V0 c+ h% ^- P
  Win32_Battery
9 p: I8 S) O& d: W& c+ s5 P   Win32_BIOS
, r& J2 i/ \+ d& V   Win32_Bus: G( [  A" u2 v( H' ~: T0 m' {6 K7 ^
  Win32_CacheMemory
: {' r: k" R6 r# o/ T   Win32_CDROMDrive
+ a. s2 g' P5 u* z( R   Win32_CurrentProbe  t* ?& m& ^) ~) P, Q3 R
  Win32_DesktopMonitor, S; U0 S: p, h3 }( P
  Win32_DeviceMemoryAddress/ f( R. B8 `! F' x' O
  Win32_DiskDrive
: k5 @  v+ ^- x   Win32_DisplayConfiguration
" I$ V- Y# t: V, l! u   Win32_DisplayControllerConfiguration
7 o$ f# X7 \7 h8 F6 ?+ `   Win32_DMAChannel0 _, U6 y' ]1 I
  Win32_Fan6 h! {, T; F& o) E5 a. `1 H2 A
  Win32_FloppyController
1 z5 b2 {7 M9 k) A( O   Win32_FloppyDrive& ]& N1 F4 p$ q1 f
  Win32_HeatPipe/ P$ T2 D: l5 Y' V( f3 R
  Win32_IDEController
$ U' U. e" m4 _! J   Win32_InfraredDevice/ C6 z1 |: P) \  }% Q% |5 g
  Win32_IRQResource
% e! X0 A+ F) v; ^! _) M   Win32_Keyboard2 z) P5 ~  e$ {, P  G# {+ N( K7 U
  Win32_MemoryArray
" ?9 K% P% q7 D5 }) K7 C   Win32_MemoryDevice' }0 w' O6 u, R5 g
  Win32_MotherboardDevice
" E1 K- q: o  S2 H' a* [% C; r   Win32_NetworkAdapter3 B; A% Q5 x# ]" s- A5 A! z
  Win32_NetworkAdapterConfiguration
: T5 F5 W/ Y( q1 U. E& ]   Win32_OnBoardDevice
) G0 v' ~) `, ?+ f( C9 ?6 L   Win32_ParallelPort
4 T/ f0 A. E/ u- x9 C   Win32_PCMCIAController: J) [9 A6 ?+ w) `( s$ I  z
  Win32_PhysicalMemory8 f( S3 |/ R' H# r1 I4 R* m
  Win32_PhysicalMemoryArray
6 Z$ C! i+ j0 q   Win32_PnPEntity+ o$ A' V# v. w. |: [. s4 M' ]$ F
  Win32_PointingDevice
& [1 l0 \' `+ O, s4 \0 w   Win32_PortableBattery
1 g; f0 K3 f$ E* `/ ?0 u' m: B   Win32_PortConnector* Y& j: D1 Y5 S* u
  Win32_PortResource
: L( t5 m6 W! l8 e$ `# s( K% X   Win32_POTSModem
: f. f; M0 ?$ n# J   Win32_PowerManagementEvent
: ], [2 h" j+ F   Win32_Printer
5 _) G2 ~, W. w- |   Win32_PrinterConfiguration
9 N5 C1 Q) t3 K# t   Win32_PrintJob) u$ N6 C$ ~4 P) l9 x. V8 t
  Win32_Processor/ \0 O& n# N5 v5 h0 m6 ]
  Win32_Refrigeration+ U8 n! B1 Q% A
  Win32_SerialPort7 r: U& a, m$ p7 E, f) E
  Win32_SerialPortConfiguration
, B  F7 B' k, q; G) n6 r  O   Win32_SMBIOSMemory% j' u7 f6 ]1 T' I: c' U4 r7 B, R& t5 O
  Win32_SoundDevice2 @' `& _1 q2 y
  Win32_SystemEnclosure
" m( k' ~5 P4 E4 R) b8 o8 d   Win32_SystemMemoryResource* I8 c5 z$ A4 I6 |) n
  Win32_SystemSlot
5 E1 H1 h+ `. U. k2 r+ \   Win32_TapeDrive! G* c0 s# }# m0 b- H! D1 d& z
  Win32_TemperatureProbe  p% j/ W1 }& H  y
  Win32_UninterruptiblePowerSupply
" N& g  y# L% I% f* X   Win32_USBController
; a% D8 |9 ]+ w" v1 m7 D5 E   Win32_VideoConfiguration: n5 g6 v" [) e$ L
  Win32_VideoController
" n! @  q8 ?: Z# I! B   Win32_VoltageProbe' y0 w) `' f: \, }4 ]2 c

6 ~; V+ S5 Z  F以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-25 00:46 , Processed in 0.019213 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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