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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)# V# i- b8 g' V: B; {* t+ O+ B' p8 D
# W' M+ n) }  h) b
0 z4 r. _5 A, g4 y
--------------------------------------------------------------------------------
  |3 K/ ]$ V; i' x& h( _# DWMI: Windows Management Instrumentation (Windows 管理工具)9 c2 m" g1 N  A$ N9 w- D9 v
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 3 Y' N* f2 O! u/ r
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。, I- I- q# ?7 v, |  c& c9 f0 F2 C
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 - `! s. z4 I% ~$ ?1 J2 J6 a2 D( |7 |

+ E' v2 O0 Y1 J6 I6 u' Y6 q--------------------------------------------------------------------------------. P8 d: _9 n" R- D6 P8 {8 E' A& t
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
( t, H4 @3 i2 F2 u! E4 O2 k- s. |/ Z3 l- ^% }) F7 e+ Q, q7 S! k
--------------------------------------------------------------------------------4 c4 p% R& ^1 F% |" j8 o/ _
① 初始化 COM 接口:% M  G* T; ?9 I: @: `1 ^  E
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。2 S7 F& I$ K! D# z
  这两个函数在 #include <comdef.h> 里面定义。
- d" _8 {" y, P) g
# W* h5 Q& k! Z. p% Z: U② 获取访问 WMI 权限:* s' H/ {' A5 K( N# V. a( P' A
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
# H; Q$ Q3 R) I; Z: m8 l) k   如果这个函数返回 S_OK 获取权限成功, 否则为失败。, H  r" a7 }3 c  Q' I* F& Z3 E9 L
$ d% G  e8 a% K+ Q/ l, i* X
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:. L+ ^* V9 ?" ^6 a$ [
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 }' S: W, K' i8 @
7 Y. s/ R' F$ G8 f. K8 evoid GetWmiInfo(TStrings *lpList, WideString wsClass)/ ~0 G, g) ]1 j; y% \6 P5 Y& n
{
( n, [  G" s# n- O8 V  IWbemLocator *pWbemLocator = NULL;
2 {$ T. k& x& B% T* a  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)5 |! _: h+ U& C! K8 W4 K
  {
: C0 B0 K8 U6 [& O8 c; J* N8 p     IWbemServices *pWbemServices = NULL;% P) ?9 U  u, N8 F, H6 [
    WideString wsNamespace = (L"root\\cimv2");
9 q* u8 D; T+ S1 }6 i, m6 _* G     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
! d1 K, ^2 ?2 h* J* m      {' b- [( J' ~, {- `8 @
       IEnumWbemClassObject *pEnumClassObject = NULL;" w: b9 z8 V6 h6 a, H: h
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
  u9 D$ Z2 Z7 l4 |        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 O8 a0 ~" b8 ?; v0 R         {* i* m4 j: x7 y6 m  F9 W
          IWbemClassObject *pClassObject = NULL;# y' I1 X. b9 x* V4 s; g! R" ?
          ULONG uCount = 1, uReturned;9 f4 ^: v) ?' o0 y' \; ?  J
          if(pEnumClassObject->Reset() == S_OK)6 x/ ~6 ?1 I, o7 d$ {, M* M
           {
+ Q  ]' V' i4 {& K. w3 ?7 d              int iEnumIdx = 0;8 e$ U8 z5 Z/ L& e0 c/ p. f/ M
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)2 _& S# D( J, I1 l5 g2 M8 Y
              {4 _. n2 {0 ~0 g) {. j2 q+ Z# P
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
: J1 K1 a+ P7 i! o4 H
& }9 V: L( p5 J' Y3 r. b, G0 {! o9 o                 SAFEARRAY *pvNames = NULL;! k/ Z5 F. i$ X: O) ^) T/ d
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
: d9 W" O0 p& }4 L* o4 ^9 J" a                  {
4 R1 M% C* C+ `+ _                    long vbl, vbu;
: ]1 i- y. c8 l6 d5 `                    SafeArrayGetLBound(pvNames, 1, &vbl);
9 y4 }' B7 q3 ^4 w. x% I3 L; M& K                    SafeArrayGetUBound(pvNames, 1, &vbu);
7 J' M# j$ N- J$ B                    for(long idx=vbl; idx<=vbu; idx++)
# ]+ }& j9 ~, w) D6 w5 K. i' ]                     {% r- [" _2 N2 U% }3 W6 h3 M
                      long aidx = idx;
, H' B( h9 T5 W  n                       wchar_t *wsName = 0;  w6 s6 O" i$ S9 U- t$ _
                      VARIANT vValue;
5 i( {) p3 Q3 A6 T6 x$ H                       VariantInit(&vValue);- f: L& b  k, Z9 E
                      SafeArrayGetElement(pvNames, &aidx, &wsName);' O( G4 w( X9 u6 y9 a* C5 \

7 m0 v& O8 F5 h3 C" @                       BSTR bs = SysAllocString(wsName);
7 E  |8 }. @' r( ~6 P3 |8 d% y                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
: [: y9 z' H- S3 [* _' v                       SysFreeString(bs);
% v  v, Q" d( Q0 {1 n( q: w5 j: ^+ S# Y* q' ^
                      if(hRes == S_OK)
6 R8 {: E2 A( T1 S4 \                        {; O5 G8 f7 d9 A! a5 X
                         AnsiString s;; ~+ f- B1 O6 R2 H1 b+ l& f( C
                         Variant v = *(Variant*)&vValue;
7 r9 l) e7 t0 v% \                          if(v.IsArray())' o* _) w% W( T- ]+ b
                          {; {7 I" Y" k# c
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)6 J5 a* q/ `  E2 O$ {8 z
                             {* Z) A4 M: V" @& [9 V/ I, c$ x, e8 n8 V
                               Variant a = v.GetElement(i);
$ l- _# e* A" ^' Z6 V2 E0 ?  F                                if(!s.IsEmpty())
/ {  M4 J* f# ~* ?3 z, D                                  s+=", ";! b9 t* l' @3 [) W: P& ]- {4 O/ Q
                               s+=VarToStr(a);
$ ~) K  _" r& N: M; t% x4 y+ T8 J                              }3 {' @9 I' l. r6 a
                          }
: O. A, `% p' I4 `, a' y                          else
7 g- L+ L) i6 A                           {1 z8 W# b5 D* z3 \# [  o0 m
                            s = VarToStr(v);7 Y" `8 }& h9 F( x, M+ N
                          }
$ Y6 b; Z, m9 N# V' q  g: g% Z                          lpList->Add(AnsiString(wsName)+"="+s);$ m) q% ~% i7 D9 b
                       }
" v' o9 x) L$ j
9 ^+ [$ H3 b/ s4 C1 l5 R' \) ^7 K3 @                       VariantClear(&vValue);9 p$ S9 d+ r0 s% \' x
                      SysFreeString(wsName);
, s; b! M9 Z! _1 N. K                     }4 ]! J& j6 Z( v! Z
                 }
! D0 H1 K: M1 W/ m, l- K2 j                 if(pvNames)SafeArrayDestroy(pvNames);2 t# `) j  A; n- N+ j
                iEnumIdx++;
4 \* r, i' Z( v0 q/ g               }
/ v+ l( Z9 d) ]$ g            }
! z( s( R! M# C" e           if(pClassObject)pClassObject->Release();
* S% @; ^5 I& x; e  W         }- m( B3 I1 Q5 {$ u" L: V( a; R9 z
       if(pEnumClassObject)pEnumClassObject->Release();5 M7 k5 ^9 Q9 B0 E6 ?
     }
7 W) l2 o. [' x  j, i; L' F     if(pWbemServices)pWbemServices->Release();9 _9 K# m: C* |+ i& n
  }
0 i0 W8 a; A* f  if(pWbemLocator)pWbemLocator->Release();
" a: \& |$ }& L1 S5 u9 G, X}
# F- _: l4 e& B" [7 D" d- ^; H- ^//---------------------------------------------------------------------------
# d$ R" W& Y6 Z# H7 B& a
+ J2 j1 T/ r% G3 L/ `7 ?// 通过 WIN32_bios 获取 BIOS 信息:9 a- b+ N, r0 S5 @: U
void __fastcall TForm1::Button1Click(TObject *Sender)
# e5 |: {) E5 x  J4 [$ S{" N  w& U/ {( E
   Memo1->Lines->Add("================== [WIN32_bios] =================");+ k, l  D# o% N, J
   GetWmiInfo(Memo1->Lines, "WIN32_bios");7 Y* I& ~7 d% g" N3 F
   Memo1->Lines->Add("");
5 ^# u; _& H  m9 M- ]. _- \}
# Y% |, W) O0 m- T9 n- ?% V1 w: r0 s' e/ Q8 F: M2 w  O
--------------------------------------------------------------------------------
! Y" g6 p( Q2 o
4 S5 u2 V; q9 IWMI 可以访问的信息类型有:5 L7 _* \) ^9 ^6 F
  Win32_1394Controller
7 t! w1 l# f3 u$ ^+ i5 ^5 S   Win32_BaseBoard% Y( N3 N- E0 F- {
  Win32_Battery0 ~" U( G; y! g! }1 u; W" H+ w
  Win32_BIOS' T' t* ]9 z% G( T8 X
  Win32_Bus
2 O! F; a1 c" U4 S9 g; c; ], a   Win32_CacheMemory, W2 c2 ]. f  N  e" l
  Win32_CDROMDrive
/ x' T/ y+ u' k1 G# L# i   Win32_CurrentProbe
( m1 S! g2 S: I   Win32_DesktopMonitor5 y" X. p9 x5 F, U6 ?* r9 Q& P
  Win32_DeviceMemoryAddress! ~7 ~; O, f7 l9 E8 ]6 f
  Win32_DiskDrive
5 N5 N* E* {' c* `. p   Win32_DisplayConfiguration1 ?! M; w& S) m
  Win32_DisplayControllerConfiguration
( Q: r3 n) L7 }7 T" V0 Y) Z' ]. M   Win32_DMAChannel1 X5 G& B8 S( X6 [( w0 ]5 J
  Win32_Fan6 y  L+ s# a, G, O/ ^* c
  Win32_FloppyController
6 C* \5 U) b$ _  F. J   Win32_FloppyDrive; g$ t: K! U( h; K- c( ~& I% o; @
  Win32_HeatPipe
% f, ?4 C: w6 r( Y+ ?6 ~   Win32_IDEController
" E) w9 s0 Y8 r% B   Win32_InfraredDevice
) \: P" R* i4 o! ~" \+ V   Win32_IRQResource- O% Y1 M5 z! p7 P2 H# q+ B
  Win32_Keyboard* T1 r5 m9 h7 D$ A7 N
  Win32_MemoryArray
9 I3 _9 n" U+ F* X# }% F) `9 S   Win32_MemoryDevice
3 E* ^+ B: S3 [- m9 k   Win32_MotherboardDevice1 P( o1 k* X) d- Q1 H
  Win32_NetworkAdapter
5 c  h; r& O0 W% j   Win32_NetworkAdapterConfiguration" g+ F9 w: Q2 T9 e
  Win32_OnBoardDevice
/ V6 p0 Y; b. _" L4 A$ r   Win32_ParallelPort
1 [" r1 h% P8 B& Q" T* }   Win32_PCMCIAController
, c6 f- g: E2 s4 N, E9 f$ a   Win32_PhysicalMemory
9 s  i1 U: [% D( D   Win32_PhysicalMemoryArray3 {6 h3 }1 o, {, e# D
  Win32_PnPEntity
% Z/ x$ {( T  R+ C0 g+ b. k   Win32_PointingDevice$ b. ]" z2 X3 p; z3 w6 O0 t
  Win32_PortableBattery. f! q) g' Q' z8 R" w
  Win32_PortConnector
' h1 `8 X5 v4 n5 J# J! g& Y* y2 D   Win32_PortResource
! }$ B: \( f. \; V& {* Q   Win32_POTSModem
) F, \' ~' w0 S9 e9 D   Win32_PowerManagementEvent
' I6 ~; c( t& [' C# S' f8 c* D   Win32_Printer
; M6 _. F+ o0 v) v* G2 m4 c   Win32_PrinterConfiguration
. N) ]$ k4 P! S   Win32_PrintJob
$ b9 @, y1 D$ S5 i   Win32_Processor
. T: |: g# e, h* C; |  T   Win32_Refrigeration
% h5 n+ m- ^& U& r5 X! D   Win32_SerialPort" E) D; ^/ u4 o, t5 K1 a
  Win32_SerialPortConfiguration
9 B& T9 e- t' V# s% |( r   Win32_SMBIOSMemory  L/ n7 H7 n2 l2 k9 a" u
  Win32_SoundDevice  H. X6 [5 E$ z: j- D$ n& v0 i% r8 H1 m
  Win32_SystemEnclosure
8 l; O! \* \* S1 ?8 r1 s& X' R9 E8 T' P   Win32_SystemMemoryResource6 C2 A; W8 e. M, X& ?6 Q
  Win32_SystemSlot
* l6 u( L! D" J: X/ D   Win32_TapeDrive/ }3 d# X+ r" k* j4 v' K
  Win32_TemperatureProbe
" n, M9 p! V/ S7 J* ~/ z6 i  o   Win32_UninterruptiblePowerSupply
+ h% L9 x. g3 @( \1 c   Win32_USBController, b( n  p2 A" k: L- S9 b
  Win32_VideoConfiguration
: J- E6 \& Q* ^   Win32_VideoController
* @5 K8 ]/ O' o5 Y1 f% B   Win32_VoltageProbe
5 \' g0 q6 c6 |" a
) G+ k; ~% H" f以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-16 21:44 , Processed in 0.020115 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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