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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
( q1 \3 G6 F0 j& S; f0 {4 Y5 q& M5 [! [, q: Z
2 _) T  T0 W* _) Q- I7 v
--------------------------------------------------------------------------------  v3 ^1 X, L4 t; r' c; `$ ]" o
WMI: Windows Management Instrumentation (Windows 管理工具)/ |* r7 W6 P$ w0 B7 K
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
8 N! k* M( ]+ T. [. X   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
' }. ]. E# p: k: y, N   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ! A  x4 U) P+ P! P: n7 W: U2 b

; h2 }$ ?6 M4 i' |5 z( h6 A: ?--------------------------------------------------------------------------------. a1 {2 {( F3 w# H
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面; b) L7 Y! u# v4 g& h

5 I' w4 x: r+ `0 S7 A2 q1 x--------------------------------------------------------------------------------9 u4 ~( O4 }  d' L7 G
① 初始化 COM 接口:* ~, n# ?* y" Y6 f$ U+ y7 Z  l0 K2 K
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
% l, V* c# w7 d$ a2 K( ^   这两个函数在 #include <comdef.h> 里面定义。/ A- y+ M" C7 s  b

! e1 e) P+ [' I② 获取访问 WMI 权限:3 u3 D9 O: }/ o% r' N
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);, D* G; \4 y( F! v+ N) n* A
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
8 z2 c3 s. R9 k5 T6 o( Y% r. M6 U. ?2 h. ]: a% a4 \5 G
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
/ s+ X9 G. k' L$ ?& D8 V* j1 K3 l   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 V: J: K, h6 c# u0 U" O; Q  n, u, F8 }9 d- v3 G
void GetWmiInfo(TStrings *lpList, WideString wsClass)
, d( ~" F6 \  D% }& o* [{1 U* B; m' F7 L7 P9 Y" B8 ~
  IWbemLocator *pWbemLocator = NULL;
" Y) \- N, ?% u% W  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)# Z3 p% d( @; Q  \" `
  {% B2 m2 {- t+ K* M7 E5 _
    IWbemServices *pWbemServices = NULL;
, I2 A& p% T, j/ f) L     WideString wsNamespace = (L"root\\cimv2");; j5 b8 X6 @5 h
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)* J( _2 r* y9 S3 M! F0 q
     {
/ n5 k  X9 @: I0 W: k        IEnumWbemClassObject *pEnumClassObject = NULL;
1 d( D" ]  }) a        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
4 u9 P$ Z2 F( V" A! u        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)5 B# T6 v/ U% Y! r6 S  a( ?
        {
8 ?* A6 E9 T- g% c           IWbemClassObject *pClassObject = NULL;
3 S% d4 [. k& D           ULONG uCount = 1, uReturned;/ b+ B! c* g0 P
          if(pEnumClassObject->Reset() == S_OK)
+ F1 a7 c7 |3 N- P            {+ {. w6 V/ g4 P! Y' Z
             int iEnumIdx = 0;; j  n( Q, Q* O8 L: m/ {4 P: j
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
6 z. R2 F! G9 I+ }7 b               {- [' c( I1 j- f6 O, @/ R5 O' Z
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
0 i8 _  B' ^4 r0 Q- \. F- N) v8 V3 _- T$ l
                SAFEARRAY *pvNames = NULL;
7 {6 ~2 z) X, I* P7 ~1 a                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)/ Z4 P6 s  R0 E6 o/ G5 w
                 {
# z/ ?6 e+ {- x' ]! T9 [1 o( C                    long vbl, vbu;
. J. x. b6 V/ ]0 I                    SafeArrayGetLBound(pvNames, 1, &vbl);6 r1 [" ]- H2 Y% m  W2 Z( _
                   SafeArrayGetUBound(pvNames, 1, &vbu);2 v  y; r* k% X9 P
                   for(long idx=vbl; idx<=vbu; idx++)
9 V9 x. ^! L$ {8 [3 s                     {
8 t) E1 t* K) ]                       long aidx = idx;
2 U+ ]: E8 ]7 M: l$ k2 v                       wchar_t *wsName = 0;! b) M' \! J& b& j' F9 z
                      VARIANT vValue;
4 C. K1 K! w3 Y9 L3 n# L                       VariantInit(&vValue);% Q  m) m: B, S5 M8 v9 w
                      SafeArrayGetElement(pvNames, &aidx, &wsName);# t6 H, T6 j5 D- ]! G# v" I* z# E

) S8 G6 P* v) c$ l6 v5 {5 b                       BSTR bs = SysAllocString(wsName);" t' @& g# q! y/ c- N/ O
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
- F4 t' `2 Y( ?4 N1 [' |: ?: s                       SysFreeString(bs);
( N5 D8 O) y$ k4 s7 Z; L) F3 H4 P/ _" L# j$ m* D
                      if(hRes == S_OK); d% l* p& k8 d/ f
                       {% B& s: b$ T, H
                         AnsiString s;
. b3 X# H2 x; A/ w                          Variant v = *(Variant*)&vValue;
: J/ k7 V) }$ Z& s) r+ [# j                          if(v.IsArray())
0 u) c4 d% k8 d3 K! [                           {% @: Q0 A0 u; k) H3 r1 I+ n
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)/ |' y+ D; Q6 t
                             {
% g) v& J9 A3 `# _                                Variant a = v.GetElement(i);! p% g9 D$ F9 |. s7 s
                               if(!s.IsEmpty())
- e4 q$ ?' i" e  P* x2 U                                  s+=", ";
, Y8 L  G& E& k' L* C) ^, l; C                                s+=VarToStr(a);
& |( S8 _8 i. N/ _+ E                              }" q. E  _3 k" j0 U8 G- b8 c
                          }
: t: W. V1 X  S; W8 A( p( Z, K                          else
9 [2 b% {* ~; }: |                           {7 f. u# b, C9 v5 s8 O: Z% `7 w
                            s = VarToStr(v);
1 [5 ^/ X7 p) D2 J0 ^8 s6 I& j                           }
. L! U3 \  D' F' A- N0 i9 H                          lpList->Add(AnsiString(wsName)+"="+s);
9 J8 ]: G' A0 A: H                        }
6 S+ d4 Y. r) w2 p3 D0 M: T' m+ ~4 \/ A8 q1 i& x+ K
                      VariantClear(&vValue);% A4 }1 h. E! m4 V2 N$ k5 O" l
                      SysFreeString(wsName);1 d8 f# e3 |( u$ s' n
                    }
+ u9 R0 k% K% l! Y                  }* s0 j7 [3 V2 W! e
                if(pvNames)SafeArrayDestroy(pvNames);7 }# t0 H8 J1 ^0 v  B
                iEnumIdx++;$ S+ u6 e: t( W# _/ j2 b+ X
              }
" U, X$ F  }6 t5 ]* W            }
7 `+ ^6 g/ B+ g5 z- p7 ^           if(pClassObject)pClassObject->Release();/ g8 n+ ]6 B. _4 L
        }/ P8 q5 T% f$ [7 f1 d. w/ i
       if(pEnumClassObject)pEnumClassObject->Release();
: `  b" `" u8 p5 J  |5 q* A2 O& r/ `- ^      }, I- ]7 E) }, d, K
    if(pWbemServices)pWbemServices->Release();
5 J. {/ n- O0 v- ]   }7 t5 B' a+ Q# d8 H7 f! i
  if(pWbemLocator)pWbemLocator->Release();
5 j3 s& B5 o8 @: E8 `* D8 c/ g}1 U! T+ @, l3 J
//---------------------------------------------------------------------------' k6 c$ Z" _  o; ^3 V% a. f4 [
9 C$ }  E: k$ ?/ K% I& a
// 通过 WIN32_bios 获取 BIOS 信息:9 G! A1 [1 q- w1 }4 A, a: P
void __fastcall TForm1::Button1Click(TObject *Sender)& r2 z! a& e5 A1 x; ^9 U
{* O6 I! _0 f9 S/ x7 @; @5 u
   Memo1->Lines->Add("================== [WIN32_bios] =================");+ i' O& s% R; x2 T
   GetWmiInfo(Memo1->Lines, "WIN32_bios");0 w9 M* c. n' p; m/ W! ?
   Memo1->Lines->Add("");
- a; M: K; k, q6 q$ D1 Z}, Q2 F3 S( }0 [' h8 x. r2 m

/ O  N8 o- V$ k; v--------------------------------------------------------------------------------, i7 t) u" }: G7 s/ c$ W( L" q
8 [  G% p- @  z2 n
WMI 可以访问的信息类型有:
3 ^* P9 r( ~% N   Win32_1394Controller
7 s+ d. p' s* S   Win32_BaseBoard! T6 Q8 G: l9 H9 f
  Win32_Battery# J6 _4 p: @# Q8 T
  Win32_BIOS$ J: n1 a8 T$ p4 n6 }8 ]
  Win32_Bus' {9 [  V  n  n$ b4 H
  Win32_CacheMemory
6 b: d6 B% z% ~& y6 R( m* V   Win32_CDROMDrive& @* h" S! ~6 {& F. M$ ~
  Win32_CurrentProbe
' \5 l) E8 C* t- O, ]' j   Win32_DesktopMonitor
) w& |1 E/ d8 B% a+ b3 q   Win32_DeviceMemoryAddress: e& j9 @0 w3 X/ T& g! T
  Win32_DiskDrive9 D1 j9 ~1 l1 a6 [: P; o  Q) Z
  Win32_DisplayConfiguration
" w8 l( Q4 p6 H! P   Win32_DisplayControllerConfiguration; d* n! Y# O2 B# I
  Win32_DMAChannel2 y8 i5 ]# E7 e. y
  Win32_Fan
3 @' m( g7 w8 Z" H3 h' p! F  |4 F   Win32_FloppyController
, O, D( h) V9 {% s: A   Win32_FloppyDrive
/ M% O3 B* t9 W4 Z: e3 W   Win32_HeatPipe
* i$ X/ W+ F6 m; B8 X+ K   Win32_IDEController1 R, N" \2 ~  p  C
  Win32_InfraredDevice
1 Y) d" M" [+ Y   Win32_IRQResource; E, R- H3 R% Q" C* d
  Win32_Keyboard" |4 c# l) r- D) L6 t4 K- x4 J
  Win32_MemoryArray
  c% y4 E1 j  }6 @  H0 S0 z$ ^   Win32_MemoryDevice* o. }0 A8 t( g9 p4 X9 v
  Win32_MotherboardDevice5 \9 ?9 s7 \$ Y+ O
  Win32_NetworkAdapter" j9 R, k9 y. i( [5 q& ]1 z
  Win32_NetworkAdapterConfiguration; ~$ F. \4 L6 Q3 \; F% p3 r7 @# m2 C0 E0 V
  Win32_OnBoardDevice5 n) g& H, }  Q8 o$ T
  Win32_ParallelPort# i; c, W5 i) k, A$ l
  Win32_PCMCIAController
* E. t- V2 @/ M- c! J" l   Win32_PhysicalMemory/ L2 `  c( {+ d* V7 J4 n  ?
  Win32_PhysicalMemoryArray
7 J6 _8 t; Y9 |- Y   Win32_PnPEntity
) m3 n) M1 ?2 s   Win32_PointingDevice
. w+ j( [) A3 G/ w   Win32_PortableBattery
& I1 T+ E  j4 i" d   Win32_PortConnector8 X! t. {  r; d5 Q
  Win32_PortResource
% b$ h) H+ y( t: O# F3 y0 A   Win32_POTSModem6 F# \6 v* p; e" s- y1 U
  Win32_PowerManagementEvent
3 V0 I$ Z  N! B# [8 g# L" G9 i   Win32_Printer5 M! P/ S' w  b7 @+ L% W
  Win32_PrinterConfiguration
" P+ x3 @& j' G& Q" i) P   Win32_PrintJob
; N- ?+ Q! O/ t3 |) R3 H4 V- b6 F   Win32_Processor% f: ?7 F7 u9 o+ O( c
  Win32_Refrigeration
) R& C* v7 E3 G' |8 Y   Win32_SerialPort
) K0 }: f; B; V% r6 Q   Win32_SerialPortConfiguration# j8 Q0 Q: h. G5 t  h: b
  Win32_SMBIOSMemory2 G- j# G. w3 r/ S, u
  Win32_SoundDevice
+ q9 g& D5 _$ q! |! Y; h   Win32_SystemEnclosure! i' ~% H# y- u; w4 S. J
  Win32_SystemMemoryResource
) I& e6 _4 j1 G, R   Win32_SystemSlot  x: x: l" @1 ~: Y( C3 p
  Win32_TapeDrive9 l1 U8 y: S* \4 W& ~6 L
  Win32_TemperatureProbe! g) x: L6 w( H8 X1 L
  Win32_UninterruptiblePowerSupply
( L7 e- ?2 [; f1 e$ p; w/ S! y  s   Win32_USBController
; P: e5 }9 @: V7 B$ U+ ^0 V$ Y& ~6 ]   Win32_VideoConfiguration
" C5 ^2 ?. n7 R' H# H5 n# E- p   Win32_VideoController, _( k* C5 K9 r' ]* z0 @( b
  Win32_VoltageProbe$ ^* c8 p) }3 E$ D, D+ U7 {

+ `5 u, W' h" t& O! [. n以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-22 03:35 , Processed in 0.026825 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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