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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)2 D8 n9 R) d1 g; b- a0 z; V  \! O1 M

9 F" a( Z4 W- S! M; t% F9 X: I4 E% O; b) {
--------------------------------------------------------------------------------
4 f6 r+ e" h- O/ C3 }; z4 `WMI: Windows Management Instrumentation (Windows 管理工具)0 W1 J% @1 h, N9 m# c- K
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
5 D& X9 ]# @+ [5 h   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
- m. b6 U4 E" c/ |) u# Y   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
1 _/ H+ d1 d- H, S6 z
: J2 B3 n) g  m, B1 ?( ^5 q--------------------------------------------------------------------------------3 k! h* n  d9 C
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面* t/ r7 {6 _3 |' [
1 g3 X1 q  g  }$ d9 V; o) p. |
--------------------------------------------------------------------------------
; o4 }2 ?9 }& Z* D8 s9 i+ O+ _① 初始化 COM 接口:
6 G, E) C3 d' V4 u) R$ T1 T6 v   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
3 ~# o1 D0 W% V# t. r& T) Y  `+ T   这两个函数在 #include <comdef.h> 里面定义。
- R1 d' O$ ^9 A! ~4 {" q
  _( @5 l2 Y  I& ]; n② 获取访问 WMI 权限:% K6 s0 A& p9 |; o9 i2 S
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
; h% Y8 U! j0 T5 ^; {( k; D8 Y   如果这个函数返回 S_OK 获取权限成功, 否则为失败。- B1 X) \" m9 ~/ W
" P: Z' y5 P9 H& i# {* I
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
: u6 k8 D4 A- p9 b2 e) s   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。6 @6 V$ W* y. R% v/ ~5 u5 f$ m5 S

. @7 s. |2 u) x7 B0 _8 D5 mvoid GetWmiInfo(TStrings *lpList, WideString wsClass)- _- q' |4 k0 T( g% v  q' H
{
$ `& V2 i# A: I# a; e* x: P  IWbemLocator *pWbemLocator = NULL;% y7 R3 T9 j# e' k/ l9 V. V
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)( j5 q' u" l& ~- \
  {" p' ]; a; M  \! z( Q1 q
    IWbemServices *pWbemServices = NULL;5 Z8 B" a7 ~8 O0 _. Q
    WideString wsNamespace = (L"root\\cimv2");4 V& t: l" K$ a$ G4 w
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)1 o4 u, ]: t3 }9 f
     {
8 B9 t/ o6 b7 z! e  u        IEnumWbemClassObject *pEnumClassObject = NULL;" i; P# X0 H4 I  I
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;; I/ u4 F6 I, T3 L
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
6 T! Q+ X7 \% [! z4 r         {
8 [4 Y+ a8 o7 t5 n# V- ?- f0 l           IWbemClassObject *pClassObject = NULL;! U& [# }0 I7 T& }9 N, _+ f" C* g
          ULONG uCount = 1, uReturned;3 ^4 o0 H( `8 N+ I( }$ G/ }
          if(pEnumClassObject->Reset() == S_OK)
. C& y, u% Z% w; [$ ]; b, P$ Z            {
3 H2 B$ R; |, T              int iEnumIdx = 0;
  z& m; u  w+ B! E+ j              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
; J  t. o( A- ]0 a4 U$ \: h9 I               {% w4 g4 n5 R3 h0 z! G+ O, _
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
( a) k# s* e4 J/ q) U& v1 G9 B4 q5 I  Z/ [% `  w: a
                SAFEARRAY *pvNames = NULL;; X/ r( w5 ~& n# c1 j
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
3 z& x. {$ e/ z# l                  {
4 c! i( F# p3 D2 q9 }' Z; V                    long vbl, vbu;  D8 Q0 T# B( h. B6 P
                   SafeArrayGetLBound(pvNames, 1, &vbl);- Q- J% {# l/ V' q
                   SafeArrayGetUBound(pvNames, 1, &vbu);4 v8 K  `3 z8 D8 t* V
                   for(long idx=vbl; idx<=vbu; idx++)
; U% ]6 ?; N4 o+ P. j- y                     {9 ]+ A- O! a5 ^
                      long aidx = idx;
' b+ u$ y! Y) d' F% R2 Z                       wchar_t *wsName = 0;
4 G: b+ J  p! X# o( ~( r                       VARIANT vValue;
0 J0 M8 r0 C; p                       VariantInit(&vValue);  D$ b3 V1 S$ s  Q
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
4 F( e/ s* P. b7 {! ^7 E( O: @4 X! p/ l4 g! v8 ]! y) d. Q
                      BSTR bs = SysAllocString(wsName);
2 K1 y% E: C- q' f* u4 P% s1 m                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);  J4 G; B* W% z, T; |6 m5 u7 _
                      SysFreeString(bs);) y3 a# |; L# a6 m$ Y; ^

! C9 Z" r6 r) H& C! h4 [1 g8 f                       if(hRes == S_OK)$ t, y, t" U( \. y" r  J. ^
                       {
5 I7 J0 G% O5 J( ]                          AnsiString s;
" h" E- x1 Q$ R9 f, h4 X+ w                          Variant v = *(Variant*)&vValue;* U/ u5 I4 J! D+ R+ d8 v
                         if(v.IsArray())
* i$ W5 v1 F- P9 Q# B  O                           {
) d5 P. q8 [: a- X0 Q1 r                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
$ ]' N  u+ F/ f; Y4 d2 ^                              {% W2 A+ O: p9 L6 z
                               Variant a = v.GetElement(i);; p. @! W) `  n6 M7 v- B4 b5 E
                               if(!s.IsEmpty())
4 |) O* }$ s5 H4 {. `+ g                                  s+=", ";
/ }+ N( F# b2 C" `+ t( w8 e                                s+=VarToStr(a);
0 q- K. P( S9 r                              }- O  N* w  ^+ h
                          }+ V3 I( m" K. |1 F. F- @4 L
                         else  c1 @' A' }* }% d
                          {
+ c3 |2 l0 q  K0 ~, w2 d3 s                             s = VarToStr(v);
/ M5 ~( I0 Z& M                           }
! ~' A- J7 P: q- x& M% y                          lpList->Add(AnsiString(wsName)+"="+s);! B! Y( Q7 B) K" y- n
                       }8 z5 a/ L8 }" n  b
' i- g9 j. Y& p5 A( }
                      VariantClear(&vValue);
+ u5 I- M% G  s" ~+ O                       SysFreeString(wsName);8 C6 l# q; S/ p& U" t
                    }
0 f; X1 k$ Z; K                  }4 C3 M. b+ W6 e
                if(pvNames)SafeArrayDestroy(pvNames);# |& {" `1 p! s& x- e$ R
                iEnumIdx++;
; P; _4 j0 m7 o, u% [; R               }
" q/ g9 H2 v; [, W$ T) ^2 d  Y            }0 f. h. V6 {* L3 ]
          if(pClassObject)pClassObject->Release();, n  [1 Q) V* P( y' o2 I
        }
4 @, A* k& x1 O, v        if(pEnumClassObject)pEnumClassObject->Release();8 Z( O: S! H+ t/ E$ b5 |! j
     }
8 E' W& P7 U0 m7 g" }; `     if(pWbemServices)pWbemServices->Release();
8 j& F/ E/ }- z, z   }3 ?% ^' m. M3 f" l! z" I2 Y' }: M
  if(pWbemLocator)pWbemLocator->Release();5 U# p  V. K% C+ @( I- y, \9 L3 a
}
- W5 }3 x" z5 e, o% _( |//---------------------------------------------------------------------------  p; f3 z7 ~" G
7 T  H/ F6 ^' Z: B2 }  O
// 通过 WIN32_bios 获取 BIOS 信息:
4 U& |4 B+ z( a. {. P8 Tvoid __fastcall TForm1::Button1Click(TObject *Sender)$ j: {4 x5 ^" J  |, k" j
{
: O0 |7 M, d/ X7 e1 {    Memo1->Lines->Add("================== [WIN32_bios] =================");
; g/ Z2 o. J9 e: K* z6 {3 _    GetWmiInfo(Memo1->Lines, "WIN32_bios");6 E: y, S+ g, M% v
   Memo1->Lines->Add("");# \6 k- I' w! N) U! W0 s+ S
}% O9 u! H2 }- i6 J' j
9 \' l( y& M) n+ B4 l  L
--------------------------------------------------------------------------------+ G* |$ q8 v9 k$ O% {2 P7 W( Y: D

* b$ a* B3 m& VWMI 可以访问的信息类型有:/ G) K5 s6 h0 W" X8 {
  Win32_1394Controller
' a% l; Q( Z  l, X: x" `- e* n   Win32_BaseBoard) D, a$ r6 G. c4 K
  Win32_Battery6 B& z  J2 `/ B6 ~& u% W0 T$ B% o
  Win32_BIOS6 J+ ^- Z' `: l9 z
  Win32_Bus
  O& c; A& \. q: v+ I0 w  H   Win32_CacheMemory
  @" f2 I3 ~/ D7 K! U- O3 p9 z   Win32_CDROMDrive
8 o2 ~- m; f0 R. y( ]1 W* V# ~   Win32_CurrentProbe7 t0 S4 G! n/ K9 _
  Win32_DesktopMonitor7 @' p1 O% T0 s" y+ }7 T% m
  Win32_DeviceMemoryAddress; R! ]9 y6 ^2 i% v+ y/ v, c+ _
  Win32_DiskDrive+ f8 Y& P3 ~8 H8 x' b& L9 A1 g
  Win32_DisplayConfiguration
' f) Z. l, v6 e2 c% x   Win32_DisplayControllerConfiguration
7 @: l% [) v2 K( Z/ A/ ~$ B3 I   Win32_DMAChannel, c2 N4 {% m$ y( T2 C7 s' S/ r
  Win32_Fan* Z- _! {$ Q: x4 y+ U( o" u4 t
  Win32_FloppyController2 n9 O6 t. w+ ]- T6 k/ o
  Win32_FloppyDrive. P. e3 v# s& F# k* f) R7 H' u
  Win32_HeatPipe) ]3 D; o! P5 D& N- y
  Win32_IDEController
3 e4 a8 \0 D$ G   Win32_InfraredDevice3 O- |! W, G! }6 z  }. A* P4 h( C
  Win32_IRQResource
6 I/ C# p$ ]9 _- j! k; q9 B" d   Win32_Keyboard
! G! a8 i1 h: I0 V/ Q; e   Win32_MemoryArray
4 v' w! p' s* M$ j   Win32_MemoryDevice
  r" z0 k" a% J* N   Win32_MotherboardDevice
" ?, `% H+ l8 j) L" }& |) ?! f$ L   Win32_NetworkAdapter
9 w6 E3 F; m4 K! g   Win32_NetworkAdapterConfiguration
. l3 ?; I5 t: [( l( A% F, F   Win32_OnBoardDevice0 R% O; z- S6 I0 x: b9 v8 g
  Win32_ParallelPort- G% ^" T! \1 o$ d/ d) z: B
  Win32_PCMCIAController( @* e; @) \8 u0 M
  Win32_PhysicalMemory. m" z  v9 @! @) j" O  Z" A
  Win32_PhysicalMemoryArray
9 F$ n- z" A5 q4 [+ L; m   Win32_PnPEntity; F5 F% U/ _! l' }8 L8 t
  Win32_PointingDevice
0 g; I1 }% t7 _6 L   Win32_PortableBattery
. v: k! ?; p* {4 T* A   Win32_PortConnector( \3 E# c) o, k, M  R/ k
  Win32_PortResource9 ~, M( I# ]- w8 V3 j3 Q* y6 o
  Win32_POTSModem# s4 C- m6 R  b8 w9 k) G/ z
  Win32_PowerManagementEvent( p; o" h% S) D% I) d+ x
  Win32_Printer
, b. l6 P" _$ L( N) }   Win32_PrinterConfiguration
: K; V+ @  }' B, T2 O' ], s   Win32_PrintJob4 k; Z0 ^1 |  B
  Win32_Processor
( L  }" x7 m$ o0 t5 c" a   Win32_Refrigeration; w  y- ?8 V  k6 f$ |! Z
  Win32_SerialPort
2 S3 L( Z& ?7 p+ n   Win32_SerialPortConfiguration& d7 l9 i6 e* m( D7 G0 I3 o2 s1 I
  Win32_SMBIOSMemory0 q" Y7 S$ K9 S) O4 w: N- N/ y- F
  Win32_SoundDevice1 L: G2 m: _# p0 |8 w& u+ h/ z; D$ |
  Win32_SystemEnclosure' y. {3 q& F1 i, S7 e! K
  Win32_SystemMemoryResource
9 M/ b4 J! b, x; t5 b8 t4 H$ ~( T* v9 N   Win32_SystemSlot
; M* R0 z9 C, r/ j3 w( w4 H- V) v   Win32_TapeDrive
4 }2 j0 @, d3 }! \. j/ F   Win32_TemperatureProbe
( Q4 l' I0 _& j5 B   Win32_UninterruptiblePowerSupply9 [5 b. W0 j3 J) \8 V0 d: _! k( t
  Win32_USBController
' O) i) U3 D; s) U8 T2 x# k   Win32_VideoConfiguration
- t) s9 _3 Z  O# X6 O   Win32_VideoController. O/ W; W: H" |6 `8 K
  Win32_VoltageProbe' D5 Z5 i; d, C+ ~

# X/ `' I) V/ M1 G$ b0 E以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-18 16:55 , Processed in 0.020335 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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