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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
1 y2 p9 d! O! a; ^  f5 n8 h% A# L3 i
. A% `: Q+ z# Q; q4 q
8 d% J5 n# T2 D% D4 c. l( Q--------------------------------------------------------------------------------
3 |' v( Z$ l' w5 E9 K8 oWMI: Windows Management Instrumentation (Windows 管理工具)3 F9 E. t3 O$ U. E5 _2 X& b
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
' J8 |6 e& @$ S. E  q0 ]+ o) Z2 g9 y   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
- ]1 ^: f% G8 H6 X6 S1 i7 r   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
2 X) u2 O$ \" x  I- Q) s8 ^' j
- O& s4 o: z" H9 N4 C--------------------------------------------------------------------------------5 L2 w- D' l& J" X* H
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面0 R( F$ _. V- W* F

0 Y  `& u. L* ?3 S$ r' Z--------------------------------------------------------------------------------7 a  U: ?, g2 o& M
① 初始化 COM 接口:
/ {" d6 i7 ^% g/ `   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
1 t8 V+ S! n+ }/ e. _   这两个函数在 #include <comdef.h> 里面定义。
. d/ r% [1 v$ t! Y9 G; ?( R0 {
; x( c* H) f1 V5 b② 获取访问 WMI 权限:
% W& o5 x, W* V& g   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);: ]1 q, L: A: L( S; \; I- ?( q6 P
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。4 O! X. X( q2 r; r0 ^

  e' v/ {3 X, J③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
4 K6 T+ y$ {, B: p   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
# J& j; N$ P( l5 W1 n) L
3 K2 ^3 Q: ~& f" L2 }: L! v; j  S  Hvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
9 X0 @* C7 `: ?6 W  Q" Z; @{( N7 t6 `8 I+ ^1 b' F) q
  IWbemLocator *pWbemLocator = NULL;; [! J' R. i6 l$ z
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
% A/ W+ P- }3 b   {! G! t$ Y2 }; ~. i3 }8 W
    IWbemServices *pWbemServices = NULL;) J/ `5 b- i  w# x& ]" ?1 V
    WideString wsNamespace = (L"root\\cimv2");( D. Q5 m2 a8 L, F8 m2 j  u
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
% k" l: P) Q2 q7 \, Y! _" G      {
1 q" `( S5 B# f# B9 n1 Y        IEnumWbemClassObject *pEnumClassObject = NULL;
- t1 O$ |/ d. s        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
) c3 ^+ z1 M+ r# ]: w6 c4 ?        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 O$ |6 t4 l9 L1 ]' C; ~         {
. k6 t- u4 B" m9 ^& }           IWbemClassObject *pClassObject = NULL;  G7 o" E) e1 }% z8 \  j& W
          ULONG uCount = 1, uReturned;
& f0 J& M0 ^8 i5 H2 A) N           if(pEnumClassObject->Reset() == S_OK)
- I0 y# ~/ k9 G/ J6 R8 k            {
3 _- a0 m1 w$ {1 x) O              int iEnumIdx = 0;
: u1 n! o( A7 C, Z              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)* F" O( L3 Z9 J7 `# v9 R! F
              {$ N" w; `* s3 z1 f. c+ @
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
0 N2 w& C: g- p1 h. U7 ~& R) Y! u8 C
                SAFEARRAY *pvNames = NULL;1 W. l; h% L+ |& D  I
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)& h3 u" L% ]3 ?* x; H( z! b1 x1 K
                 {' Q9 R: ^3 G# L* C
                   long vbl, vbu;
3 g& ~8 c# M9 ~6 ]) @, s                    SafeArrayGetLBound(pvNames, 1, &vbl);
9 J! K* ~( Q. \0 g                    SafeArrayGetUBound(pvNames, 1, &vbu);2 i% p! `( C2 S$ f, Z+ s, |; f( ?9 B' m
                   for(long idx=vbl; idx<=vbu; idx++)
" G5 q9 j4 Z+ R) I7 S                     {; U( ~0 G: O6 Y7 K: k
                      long aidx = idx;" ^: |9 q/ M# Y
                      wchar_t *wsName = 0;# K& H& T2 Z, ~( e+ K) ]; Q' }
                      VARIANT vValue;
6 w$ ]7 x1 M+ D                       VariantInit(&vValue);
+ q8 E! t6 v8 h8 O. w5 W                       SafeArrayGetElement(pvNames, &aidx, &wsName);: a7 I' c$ n7 L- @4 U7 ?
( u/ I* s" A0 H+ W/ ]' p* ]0 W& K
                      BSTR bs = SysAllocString(wsName);
4 Y0 \& ^, c3 c; M' S) C                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);7 _: B# @* i/ Q1 d' c0 ~
                      SysFreeString(bs);0 V% Y0 r( S' K- `% S
7 J( Z0 A9 R  i7 }4 m
                      if(hRes == S_OK)! ~; |* b* f+ b: }4 Z9 j, Y+ _
                       {
1 K# W2 L. t( F2 U8 e% O                          AnsiString s;. e* l1 z; h* b) u, J
                         Variant v = *(Variant*)&vValue;
: y6 j( T0 i% ]5 R- W2 f1 Y5 I                          if(v.IsArray())+ I/ ^$ Y0 ~1 {' o- m1 R
                          {1 ~1 S9 v5 l7 u& k: r
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
  s% M! ?: [& H1 ]                              {: U$ s) a+ x: G  B9 l  ]$ G% b
                               Variant a = v.GetElement(i);
8 O# m( f8 G& p/ z4 U# A, N- B                                if(!s.IsEmpty())" R% l2 B( L( p2 B. K
                                 s+=", ";; L) _( T' f" ?" U
                               s+=VarToStr(a);; ^) f0 x* z( c" n8 b9 _. R
                             }
/ J/ L! I, ?* J' P                           }' R# ?' P! O5 o$ A9 K2 n
                         else) _) }2 o/ T* c. p
                          {
* c/ m8 J, Q2 S9 u. f( w                             s = VarToStr(v);
9 ^: n: t% |# ]* J- A$ X- Z                           }
# C5 d* W9 d; A+ ^. m# `                          lpList->Add(AnsiString(wsName)+"="+s);
. |* |: \7 w# [6 _% |  G( }" i                        }) Z8 L6 b5 ^6 _5 ?3 d, k& y' _
5 ^" H3 y9 @( u. z- d
                      VariantClear(&vValue);/ d6 ]: c9 F2 p: z, r+ v1 |( j4 w
                      SysFreeString(wsName);' g- U9 q2 x. m3 @9 H
                    }
; _+ v; _0 S! P9 Z; |. W4 [                  }  o! g' T8 B% n3 P  a0 v, D4 p
                if(pvNames)SafeArrayDestroy(pvNames);
# i; u" b+ W3 c6 o( w" [- J                 iEnumIdx++;1 S, S) x1 ~( @3 i% S( ~1 x& g
              }+ }( Q3 {$ r. ?6 [  ?; u0 w
           }
, [7 L) x+ p# }6 c: Z+ L           if(pClassObject)pClassObject->Release();' x& a& ~/ I4 v1 B3 ]; A: y4 [
        }
& _  T- G, P" A7 |- ]0 A# j) l        if(pEnumClassObject)pEnumClassObject->Release();/ @3 i, G/ G8 `: w7 A8 E
     }
+ |1 g2 N& y! g2 p+ l     if(pWbemServices)pWbemServices->Release();  M+ H0 X% z# b7 w- c* g6 q0 C
  }
$ t  J3 s- S+ C  if(pWbemLocator)pWbemLocator->Release();
  {% M- i1 h5 A. t}8 K; T" S: V6 U/ P: M& n2 t6 H# H
//---------------------------------------------------------------------------; X& F8 W' z9 K

; j4 u+ s. x. B. ^6 E# F// 通过 WIN32_bios 获取 BIOS 信息:
. W1 }. k7 g5 Lvoid __fastcall TForm1::Button1Click(TObject *Sender)# J% E5 o* f& \; I; e5 x$ ~" u9 I
{
5 V' E' o- C- ]3 E7 P4 E% [# R    Memo1->Lines->Add("================== [WIN32_bios] =================");7 u5 M2 e- m& ^5 ^
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
" O9 @1 h  _# x9 \( ]; {4 Z    Memo1->Lines->Add("");
9 ]; e5 [4 w6 V1 a% B3 |; m5 [( d}: a1 p* J& T1 O) B, X8 F# X
/ ^) C, Y. ?! X6 n' \
--------------------------------------------------------------------------------
" g! f% ^- ^0 ]9 F- B3 T7 E! x0 g( A" [2 E) T/ m) r& _" @
WMI 可以访问的信息类型有:2 _$ C. R" o& j3 M. N3 h, [8 w
  Win32_1394Controller& p! ?9 V1 A" M3 ?. I7 m
  Win32_BaseBoard
. P- F; ~$ T$ y, E0 n% b# G2 p/ B   Win32_Battery
0 e- O/ A' N8 p0 ]6 P   Win32_BIOS
4 h0 l( m; y9 n8 a6 X7 i   Win32_Bus! d$ m# r5 j* C
  Win32_CacheMemory+ ~- j% S1 }' Z! K
  Win32_CDROMDrive
; ~$ `; K" `7 @6 U6 \0 M4 W   Win32_CurrentProbe  p# w) z. l0 J! t. h# V
  Win32_DesktopMonitor5 F8 Q7 x  ]# s; j) w
  Win32_DeviceMemoryAddress1 |: I  V% w7 {
  Win32_DiskDrive
, Y. e- E( K' ?! J# C7 O  U$ Z/ W   Win32_DisplayConfiguration
0 `$ p( L7 g2 p# v; O1 G8 Y8 J   Win32_DisplayControllerConfiguration; }" n( ^0 B0 ]3 R) Y, T* r
  Win32_DMAChannel
, l+ s, }7 f+ Y1 C) Z# v2 N8 g   Win32_Fan
$ X) r% W$ w# G/ e   Win32_FloppyController' P. K2 W. Z! y& }7 {
  Win32_FloppyDrive
* |, g6 O; X3 {5 B& O* Q7 V& K+ Q   Win32_HeatPipe/ m+ p2 j& I2 H5 A, G! b8 N8 v1 f
  Win32_IDEController7 W5 @, N* E' l1 J. L: h
  Win32_InfraredDevice/ N8 d6 h0 R0 s5 t2 V6 W# l8 J
  Win32_IRQResource
! L  C3 D- {3 V! K   Win32_Keyboard# r1 d. a1 ~7 [$ G9 Q
  Win32_MemoryArray
4 f- C, r' f, J4 Y$ @   Win32_MemoryDevice' Y- Z, M9 N" A& T. ]
  Win32_MotherboardDevice# j9 J8 G, o# b7 S" K
  Win32_NetworkAdapter
* o  G. t. I% |2 r0 O# i' f   Win32_NetworkAdapterConfiguration
' p+ g6 K5 [+ x5 _) u2 I* P   Win32_OnBoardDevice
; Z+ v: e7 ]2 ]% ^6 a   Win32_ParallelPort1 U- I/ O% n; P% C9 A
  Win32_PCMCIAController
' d* s  |: ~+ l1 ^3 A) ^   Win32_PhysicalMemory
, \' O; g7 K- W' l( L   Win32_PhysicalMemoryArray
5 W& m8 v" c7 E. ^1 E+ m" `   Win32_PnPEntity
/ k5 j6 P) T$ ]# b9 C$ y   Win32_PointingDevice
( p, q- ?$ x3 S' P* d" `- ^8 N   Win32_PortableBattery6 y( h0 C" c% [  _
  Win32_PortConnector+ a: T5 e# f# I: w$ M
  Win32_PortResource2 x4 V- x/ I% D& u7 \* S% T1 `& V  a! O
  Win32_POTSModem0 e& h( j/ S7 Y- k7 S$ Y; ^
  Win32_PowerManagementEvent* `, ~  c1 n6 P4 v; t
  Win32_Printer
: X, A: J* _- V   Win32_PrinterConfiguration* r0 Z2 `& o% @! e8 Y5 g
  Win32_PrintJob
" k) I% V; f$ X: C+ T   Win32_Processor6 z" [5 M# }; ^9 }: ^* L% D
  Win32_Refrigeration' _# z, A0 p5 l0 c! a3 I: v2 o
  Win32_SerialPort
  P$ \$ L! E- n) O9 `   Win32_SerialPortConfiguration
- o8 D( G) b$ c1 C   Win32_SMBIOSMemory4 w4 L; O) s& B4 b- i9 b8 t. \; @/ Q
  Win32_SoundDevice
6 A( x) j4 w$ s$ `5 L   Win32_SystemEnclosure5 d, [% J0 x* R' o8 L+ ]6 T: N
  Win32_SystemMemoryResource
; I+ S# a0 ^  a   Win32_SystemSlot
, a$ r% a- R( h; l% h, f   Win32_TapeDrive
. l& D, `- L( J6 ^; \; X' p   Win32_TemperatureProbe
, ]1 I3 d1 ~, C- _   Win32_UninterruptiblePowerSupply9 h2 w: ~4 x2 @6 V  w
  Win32_USBController
5 j: }: ]: [8 K- u   Win32_VideoConfiguration0 Y, k, l: V1 x( k+ i; N
  Win32_VideoController
* C$ \/ s/ g* F1 j   Win32_VoltageProbe% C: z; T$ K7 |5 f1 ]. Z; c# Y

8 F" p$ A1 ]) W  z, \以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-14 12:48 , Processed in 0.021079 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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