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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
6 X$ N. ]3 [5 l" ^' K
0 X4 _/ {2 V8 _3 L+ ^% C. A; I2 p. c
--------------------------------------------------------------------------------
3 \3 I8 ^: Q6 C  Z. b. k! _- h/ FWMI: Windows Management Instrumentation (Windows 管理工具)6 P1 }, ?7 ]" V" n' b8 u/ B2 y
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 & M% _, u' G( m1 j' Q. X
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
  s# `1 Q9 F; H5 y+ J   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 # @; `  n& U' Q/ u

- G7 R! L" x9 w& P+ `. V& N3 {--------------------------------------------------------------------------------
- q5 r; j( B# a- g# uBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
/ I: \, o2 ~. ?+ U- ?
/ N7 Y* B9 P2 Q- B+ e--------------------------------------------------------------------------------
0 k6 z, L9 \! W$ Q/ }# Y4 r① 初始化 COM 接口:3 |1 Y5 c6 K$ k+ F  g
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
5 x0 K& [( c) c; k   这两个函数在 #include <comdef.h> 里面定义。
# ~3 ?* ]) w$ M8 F
$ d* d1 F" l% \! x" H② 获取访问 WMI 权限:
  u9 E- w" A+ C$ e  y0 o' f: d   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);- v0 k1 j# g; b4 x. y+ r
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。9 j, M) h* i! X/ a/ o

  y# B& {, e( f' J5 e1 B; k③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:. @* i3 |$ Z4 W, A" S1 c
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 `! d; Q0 N# [4 ?
. Y" w' b7 ^1 A  Z3 r- t7 x' Svoid GetWmiInfo(TStrings *lpList, WideString wsClass)
5 P* U! E- D+ l$ T$ u0 y  ]{% Q8 s& o' e, X- R
  IWbemLocator *pWbemLocator = NULL;. ^8 L( |" m: \8 V& b
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 k8 u, P' k) G   {
/ P8 e$ W5 ?, z( C3 h     IWbemServices *pWbemServices = NULL;! r- D1 u# {+ }$ i( U9 l- P9 P
    WideString wsNamespace = (L"root\\cimv2");
+ P6 E( h+ h/ `- G6 X* P3 C     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)& E1 u3 s' I" e' A6 c7 T" J% r
     {2 s. f1 g6 h) a. D4 F
       IEnumWbemClassObject *pEnumClassObject = NULL;
2 [7 J! f- S3 |* g" r3 |        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
( D& u0 i2 e& c6 \  b        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
) Q+ v$ P  m. y1 ]3 h         {
$ e, T6 P2 _7 s: `           IWbemClassObject *pClassObject = NULL;- p$ {! }5 I: l
          ULONG uCount = 1, uReturned;5 p! W3 s) l! Y1 G4 s( N
          if(pEnumClassObject->Reset() == S_OK)
7 Q4 E% D' E/ `7 w  b/ ~" p& N" W+ D            {
! w' K) ]! W( y7 b1 f- ]              int iEnumIdx = 0;4 N5 X& B) {: u" V$ F! F
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
4 U' p4 Y1 [; A               {
8 ?* h" H) n+ q2 G4 w! K' B                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
: K" I' Z% ^7 }+ p% ^. z  e$ a. Z; L- b% _! w; ~$ L: b/ o2 R/ v! C
                SAFEARRAY *pvNames = NULL;
* p+ I; A" a/ N3 H: ~. p                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
5 @5 s& k8 v4 V6 M5 p4 w                  {) B. Z5 f% }% B# s, \1 Y
                   long vbl, vbu;+ L+ E! Q8 h% b3 c- G9 v, b0 Y2 W
                   SafeArrayGetLBound(pvNames, 1, &vbl);
; J+ {8 y5 k1 q6 S& S/ a                    SafeArrayGetUBound(pvNames, 1, &vbu);
- c' [5 m2 {; W& T! i6 j                    for(long idx=vbl; idx<=vbu; idx++)( @; B' p6 p8 Z) `( r
                    {
6 c, m: f& ]9 E0 H                       long aidx = idx;% S2 N; {  _7 e
                      wchar_t *wsName = 0;
0 N, y8 f% ^. y. }3 E; Z                       VARIANT vValue;& B3 R" D; H$ @) {. `! U6 E
                      VariantInit(&vValue);0 Q) C9 z6 @' u8 Z! C
                      SafeArrayGetElement(pvNames, &aidx, &wsName);0 C/ Z* ~  K' Z& D/ W+ E0 R
7 {! }# m: D8 w4 _1 u: p) Q
                      BSTR bs = SysAllocString(wsName);
9 B! N$ [! d# v7 Z9 U                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
* _3 v! ], _. m6 [/ k# Z0 u  Q/ k) B                       SysFreeString(bs);
" h! P8 O( B$ Y0 V
7 ~( N- B0 R7 U8 F' g9 u: D8 u                       if(hRes == S_OK)& V" W8 {- b/ L7 P# ~# w' J! A
                       {5 W8 ^: f2 l8 D: N
                         AnsiString s;) G7 Z: \! y7 |
                         Variant v = *(Variant*)&vValue;/ R; `, `1 _8 B! I6 c9 P5 C
                         if(v.IsArray()); g/ B! m6 _: t1 S9 w+ J
                          {
* D5 {9 g+ w* m5 p8 c                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
  X2 w6 B9 R1 i                              {. ]  @1 e% j& Y, Y" I
                               Variant a = v.GetElement(i);
" h. M, L9 v3 h/ m& j. V$ k  ^# k                                if(!s.IsEmpty())0 J9 D& M' t0 P: c8 q
                                 s+=", ";
. V; y5 _6 f4 v+ H  s3 i) J' _; E                                s+=VarToStr(a);
. O; u" S. }5 q0 s3 w7 E                              }( C# t3 a! E( n: J
                          }: a: E4 |! ^! r/ d; r" ~
                         else( l6 L$ l. h$ l( L  E) e3 y
                          {
0 U7 `6 b+ y' `# \; z                             s = VarToStr(v);
7 r5 N; ~0 ]5 V                           }6 b+ ~- N6 O& ?6 Z* P+ j  Z3 d
                         lpList->Add(AnsiString(wsName)+"="+s);6 F" [2 ]4 X+ A  `( L
                       }
* d; c: @/ h' X  x% |7 q) S) w4 C+ r! T% v
                      VariantClear(&vValue);
# a$ I; q8 e( B; e6 K5 h6 A* K                       SysFreeString(wsName);: k! g: t9 M5 p$ A5 H- V: X$ K) D# j
                    }0 P, j: B: ]/ p/ @/ |
                 }
- T5 r3 w$ k! V4 o$ |                 if(pvNames)SafeArrayDestroy(pvNames);
8 S3 V" @- e! D                 iEnumIdx++;
9 h$ |. F, G# D: g               }
$ |/ l. [  x+ m: k: I1 x            }: y( l( d, G6 i( E
          if(pClassObject)pClassObject->Release();( S& U7 f7 \1 Y
        }9 \' ~& |5 `' b/ i4 A# x* m5 Z
       if(pEnumClassObject)pEnumClassObject->Release();
# x; W. |; Z0 x" j$ H" L4 D      }8 H' U' h, |# r
    if(pWbemServices)pWbemServices->Release();
0 Y1 ~4 V# Z0 P' u  r6 `! r   }5 a! p% J' ]0 r
  if(pWbemLocator)pWbemLocator->Release();5 r( l, K8 s# k" D. o) \2 R1 S' a
}
: T$ S0 f+ C6 U4 _7 ~" J( L//---------------------------------------------------------------------------
0 x" [1 k$ x, B) ]6 t( Q* ]
/ t9 W- }+ p0 H: C' `1 x. z3 o+ j// 通过 WIN32_bios 获取 BIOS 信息:
3 `; c% P" t$ r, l! ovoid __fastcall TForm1::Button1Click(TObject *Sender)
0 S: Y9 U$ F8 k6 ~; Q8 v{
( L* _1 {' ]1 D9 f( c    Memo1->Lines->Add("================== [WIN32_bios] =================");
0 R4 l  r/ a0 w* d    GetWmiInfo(Memo1->Lines, "WIN32_bios");, k' c/ k! Z! x  K* ]9 ?
   Memo1->Lines->Add("");
* w# r# U4 c; n% D+ g}* a' t& ]( R! i0 q& Z6 u* P

% g5 \' H$ T" B' R$ v! Y--------------------------------------------------------------------------------
: S# i4 S6 J/ D' ]7 p, _) N8 l4 l# G  ]& J( p- ]
WMI 可以访问的信息类型有:
" e$ K) A3 t* ^: \! g0 B2 a   Win32_1394Controller
8 T; D4 L2 p: k" i  R' v4 a+ T  o   Win32_BaseBoard. i. X& z7 A9 g6 l
  Win32_Battery+ w3 A  v3 Q8 y' U
  Win32_BIOS2 w+ R" r" X/ I6 e& C
  Win32_Bus
: \1 @8 A& j; Y: c( P, Z/ k   Win32_CacheMemory; p# u5 w( ]9 Z: J/ ]& ]6 Y
  Win32_CDROMDrive9 a1 Y/ R( n. V+ B* u: |
  Win32_CurrentProbe  O1 R/ q+ `& S' q" b
  Win32_DesktopMonitor
4 I- x  T. ^  {! q4 w   Win32_DeviceMemoryAddress
; j2 M1 J% I+ V3 M6 O2 {' v  m   Win32_DiskDrive
+ Q* G  A) |2 p$ [. ?3 @   Win32_DisplayConfiguration+ v3 K- b8 f; u3 N7 a
  Win32_DisplayControllerConfiguration. n# K7 h$ {/ j0 k- o
  Win32_DMAChannel
( s# ]' e5 b2 r7 p   Win32_Fan
1 ]: ^. D5 |0 c# U4 H7 }   Win32_FloppyController( Z' [; @& p2 E: K5 }
  Win32_FloppyDrive( v* |) i* s1 a& i! W. @
  Win32_HeatPipe- `& ^/ S0 D7 F8 x" P: u
  Win32_IDEController
! O& H) \) q  U9 c7 v) P- j   Win32_InfraredDevice" v! ~& Q/ S* h- g, [, b
  Win32_IRQResource& K. T+ j+ z3 P5 c& q3 \
  Win32_Keyboard
+ [1 z8 f7 `: }* e/ F$ o   Win32_MemoryArray
% M) r$ P1 `6 A  y   Win32_MemoryDevice. h3 i( {2 K& u" c3 N2 M
  Win32_MotherboardDevice, m8 D/ r, g. V+ k$ u
  Win32_NetworkAdapter
* z, n! o6 m2 x0 w   Win32_NetworkAdapterConfiguration
. M" t. p; O4 E- P2 E0 J6 ~   Win32_OnBoardDevice
# f! h3 D" T- ~' Z' k8 [   Win32_ParallelPort
& \9 i; }+ K. n   Win32_PCMCIAController
/ @! Q! j1 J1 D  W: e   Win32_PhysicalMemory
9 ~% p& @+ Q( h- e! N# n   Win32_PhysicalMemoryArray
$ V1 j/ Q0 M* R$ [- [) a( G1 q   Win32_PnPEntity
$ r1 N+ r# A0 s" L5 J9 i2 p3 X/ A   Win32_PointingDevice! t+ Y  s/ h8 m0 c8 H8 K0 V
  Win32_PortableBattery
3 A3 ]" B) @5 Y& s+ u   Win32_PortConnector$ S6 V8 L, D) X2 U" ]
  Win32_PortResource6 A  C% G! d8 b7 y4 I
  Win32_POTSModem
0 ?$ T6 Q3 z) B0 S" \/ m0 p* S; `   Win32_PowerManagementEvent: P, s* u1 k# T* h. y
  Win32_Printer
9 w. E# ~9 B2 E5 }1 ?; \* x   Win32_PrinterConfiguration
" O+ I6 E0 X" M; R" r   Win32_PrintJob
# K" x* K2 O7 O2 |   Win32_Processor
8 \3 O9 f. V$ h, O7 K) N" @   Win32_Refrigeration
# U7 N7 m7 X# o4 P6 Z  _3 h   Win32_SerialPort8 L3 [9 \. {& m3 s
  Win32_SerialPortConfiguration
9 x1 D% S; j1 w% V8 E4 _   Win32_SMBIOSMemory
) D3 R& C# }9 d# Z+ e! F3 b   Win32_SoundDevice
: y2 Q) S" L( z   Win32_SystemEnclosure
; ?$ ?3 p7 {) T4 C# H9 s   Win32_SystemMemoryResource$ X1 l7 V; f% O5 f- ]
  Win32_SystemSlot
' K/ T3 S8 P# f5 R; R1 W. b6 e   Win32_TapeDrive$ S0 Z$ [) m" \, R/ d+ f9 u
  Win32_TemperatureProbe
* a) Y  h; @6 ~9 h9 i- ~   Win32_UninterruptiblePowerSupply
0 ~2 W+ |, S# i8 Q; w& ?; G  j. V5 Z   Win32_USBController" A  e' K' T9 j* I/ M9 u. Y9 T' `
  Win32_VideoConfiguration
8 E% a# p- u* m* p* s5 [   Win32_VideoController2 z6 \6 w3 D1 I& ]% c
  Win32_VoltageProbe1 K& e9 f/ C. D% D& d2 C, W
- v# T  ^! e7 h: o" w- i! \+ b
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-21 03:11 , Processed in 0.021393 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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