找回密码
 注册
查看: 13285|回复: 0

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
4 R' p3 D7 v2 A: Z, _- X6 d
5 `& C; T$ D$ e2 d
* d5 ^  s! U# m% M1 X5 v! z+ v6 Z/ k( E--------------------------------------------------------------------------------
" |( c7 |( U; E# yWMI: Windows Management Instrumentation (Windows 管理工具)
$ d# m9 p% ^9 C- H- O9 F' e   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 7 _, K$ z+ H* b2 A
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
9 l* C( E: g, j/ x. |   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 5 X' I1 [. K( B; u  _
; o3 O$ o" ?/ r9 V% ~9 e
--------------------------------------------------------------------------------% @, ?" k1 t2 _* e; L1 w
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
" e1 f; h2 `) o: I/ R+ j3 k, R' y9 n7 U& V7 K3 g; U- x
--------------------------------------------------------------------------------
1 q0 d1 `) E) r6 Y% W" M① 初始化 COM 接口:
5 Z8 W/ ]$ V' G/ _: ]0 X& G6 @, v   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。4 I  w3 G6 p* f* f. o, o" B% D0 j
  这两个函数在 #include <comdef.h> 里面定义。( s! E7 |8 n( |: N. m% O2 }$ i

; u& D- R- y4 R  q+ o② 获取访问 WMI 权限:
" |& I! d. ~+ T% m   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);% ?) I, J3 V1 Q4 L! D, G! U
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。/ k- D2 l. q  v( G5 W
* m9 b! r' W4 h5 i! I; {
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
# o4 I0 Z. t/ Q! [$ W/ s   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
; N9 J8 t& N) X+ d/ k, G0 k5 h( F- L; m6 C" u7 l. H
void GetWmiInfo(TStrings *lpList, WideString wsClass)! P- f0 g; `1 O9 S6 D9 r: M
{
1 d5 F/ u* c% n  IWbemLocator *pWbemLocator = NULL;6 `9 j4 J: q$ r" j% @7 m, ?
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)9 O  @: K+ h( _# m5 X$ i6 B& f
  {
$ `2 d6 ^6 q  p) t     IWbemServices *pWbemServices = NULL;7 ^9 {  L8 j. h- y3 [0 g7 O
    WideString wsNamespace = (L"root\\cimv2");
5 L, `6 Z' l$ P  o     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK). R" F5 z; z* \' v! W
     {% c  V* K( A. M! }" i7 L+ @* f+ ~
       IEnumWbemClassObject *pEnumClassObject = NULL;
8 B5 H+ k  e% x' w$ J3 v        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
4 W7 X( T/ G- g$ S$ _: k7 z        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
- m% E) c. H# R2 V$ j& p         {" n* p/ Q7 q* U. Q' o2 J9 X/ X
          IWbemClassObject *pClassObject = NULL;3 Z! A! ^4 P6 S; C
          ULONG uCount = 1, uReturned;4 K- u" F# B, G/ z$ l+ ?
          if(pEnumClassObject->Reset() == S_OK)7 n( {! O  I2 I' K
           {
" m) h# O2 o1 `              int iEnumIdx = 0;
" w) O* K' }* v1 K6 y+ W              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)8 l# L* r, W7 W! L+ s
              {) `( @6 j3 r) H' ]8 F
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
; b, y7 ]/ e. g* w) Z8 P
  R' b! k; R" e+ c# N: l; u9 D* F                 SAFEARRAY *pvNames = NULL;. b& Y7 }, O  R# K/ e
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
% V$ Q$ R3 z) f5 l" K/ I! ~                  {5 s- \- t' E! W. ^  E+ W
                   long vbl, vbu;0 E/ o6 ]5 f3 v1 |' u
                   SafeArrayGetLBound(pvNames, 1, &vbl);
! K  t& G2 h2 o+ z                    SafeArrayGetUBound(pvNames, 1, &vbu);5 T8 K7 A- v+ a2 H( I# t- V/ l; d
                   for(long idx=vbl; idx<=vbu; idx++)7 F- d( }. a, B
                    {- m) B  B$ s6 [# m7 u
                      long aidx = idx;# O1 A" ~( G. j+ X7 Z
                      wchar_t *wsName = 0;& t% z8 N) A7 \1 Q/ q
                      VARIANT vValue;
4 f. z+ f: S7 {0 `9 V                       VariantInit(&vValue);
/ u* x- K6 F: `3 {( x4 t                       SafeArrayGetElement(pvNames, &aidx, &wsName);. Q" Z# V4 X* }* `

/ f7 v% Y$ x' G6 Z                       BSTR bs = SysAllocString(wsName);! X- L: B6 L( @9 `4 v
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);: `/ F. h! m, Q: H! ]- w# z
                      SysFreeString(bs);  c. j' L# z1 ?5 _! @

4 b$ v# T/ F/ p6 p" L                       if(hRes == S_OK)& |! F/ q( E3 E% {- @6 D. ^0 U
                       {
  @5 t1 _8 H8 ]& s& M: K% g                          AnsiString s;
5 \/ B2 Y6 L% n* K" l4 T                          Variant v = *(Variant*)&vValue;; g. E4 F6 |! F; c+ D7 Q
                         if(v.IsArray())
9 D. g! ~7 {& G, S8 d7 P$ e/ L                           {
% z) v( g8 k) Q. A) w                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++): V9 @. M- O- B" e
                             {
, G! O! `. ?7 w9 L' g; _5 G/ F                                Variant a = v.GetElement(i);
/ y6 ^  @! T- U. @# J                                if(!s.IsEmpty())' d( `: E# Q3 o. I3 @& J/ J
                                 s+=", ";. F: O3 ]+ z% K* K" M# I
                               s+=VarToStr(a);
2 C+ J. Y# o6 b  w1 p4 z                              }
$ I) C: h& Q% a, D                           }3 u7 g4 T0 W+ F) V! {' i/ `
                         else
: \, i& ~8 q( w  D                           {
+ B, B+ \  h- j/ i% T                             s = VarToStr(v);
  ]' d/ h% E$ z/ X* X6 d4 s$ g! A                           }
5 x$ ?( j5 Q& P) _                          lpList->Add(AnsiString(wsName)+"="+s);! o* ]5 `4 y. a1 \6 s: C
                       }
( x8 j) r3 @- x7 T2 M
# p" X0 J. b9 |8 I) @) j                       VariantClear(&vValue);
$ @$ y! N# n. @1 ?7 {                       SysFreeString(wsName);( y; f7 [8 K* p. j
                    }& ^6 ]: s! j) ~: R$ b
                 }
* {, U( r2 q9 Q' D7 O                 if(pvNames)SafeArrayDestroy(pvNames);
1 s6 }1 r* x  b/ C' u0 f8 Z# }                 iEnumIdx++;/ ]$ U- ^) ?8 \9 z6 F
              }
9 X- H- j9 B# D; d0 a5 t            }+ Z7 S+ k8 \# h
          if(pClassObject)pClassObject->Release();
( y. H# p' M4 E: K* M! \# L$ b         }
3 B+ n6 _6 T& P% Z9 F, y        if(pEnumClassObject)pEnumClassObject->Release();) q+ {$ W/ ^2 D/ Z" R
     }
0 p+ q9 e1 Y0 v7 Q2 T5 i) V     if(pWbemServices)pWbemServices->Release();3 H- e+ b! V( T9 |" R3 A+ _
  }/ Y  D: e6 f$ |, n" i0 s# H8 b
  if(pWbemLocator)pWbemLocator->Release();
/ d1 v0 o. v! f}& W! `7 T0 r# g2 V7 k
//---------------------------------------------------------------------------
5 G3 L$ C6 ~) I! b. y
& I$ |3 u& _* L( k& j7 |8 K- P// 通过 WIN32_bios 获取 BIOS 信息:
6 S- m! x% h0 |+ e6 @7 d2 Nvoid __fastcall TForm1::Button1Click(TObject *Sender)
7 b9 }) ]) m( Z# r+ e8 L3 r" C  }{
# i, [- B$ N" V* }( e- s. u2 C    Memo1->Lines->Add("================== [WIN32_bios] =================");
3 c+ t- G+ h3 ^* V- r    GetWmiInfo(Memo1->Lines, "WIN32_bios");
) b' ?$ \( l) U3 C, A    Memo1->Lines->Add("");
9 B, A5 Y! g2 {1 K2 ]+ N6 L9 s# b/ m% W}, c# N" o1 G" X' l0 \
7 S) [4 f  g: C, a- T
--------------------------------------------------------------------------------0 s* N2 T# l% u( V
1 C4 m: G9 L; x' X6 S
WMI 可以访问的信息类型有:5 Y1 m( ?. w# e) ?: V9 _  ?
  Win32_1394Controller. M( a6 j' K( u: Y8 Y/ ~$ m$ G
  Win32_BaseBoard# T8 Y7 K1 [2 g# v) N' d4 D) M! z& \6 j
  Win32_Battery. q$ k# X+ V6 [" `6 F+ [& b( z8 D
  Win32_BIOS  i, E$ h4 [) o
  Win32_Bus
5 e1 D6 i: e( o; _3 S   Win32_CacheMemory
+ ]; H* v$ U; ^/ O, \/ v   Win32_CDROMDrive
# _' r: d& ?4 N% L   Win32_CurrentProbe
3 H. E, @, k+ b/ W  e1 u: w1 W* }   Win32_DesktopMonitor8 [! ?# M1 s2 t4 M
  Win32_DeviceMemoryAddress8 Z8 o7 T' c3 Y. R* Z
  Win32_DiskDrive
. w( N6 a' j" f   Win32_DisplayConfiguration
9 ^( s1 X, h5 [) P4 x" b   Win32_DisplayControllerConfiguration
2 `  U8 j/ G9 q+ ~   Win32_DMAChannel3 ]8 n* M; ]) \" o' w
  Win32_Fan% n9 j1 |  L! ^. E5 K
  Win32_FloppyController9 }' ]$ u0 L8 t  r- i& Q
  Win32_FloppyDrive$ h( F$ U* R) V  c( G' l
  Win32_HeatPipe
5 a; ]: W$ y% M9 m   Win32_IDEController
& d) h/ U) N) h" t, V4 r   Win32_InfraredDevice; P8 ?- S# j* O3 X8 d( m
  Win32_IRQResource5 S  t& O$ @$ R
  Win32_Keyboard$ C- e, d( {! p" n
  Win32_MemoryArray
# D0 Y+ J+ ?' K( a& r   Win32_MemoryDevice; e' U3 S1 @: u; y' x
  Win32_MotherboardDevice+ I( a; v/ f  U  x% @
  Win32_NetworkAdapter8 S0 P. K/ D- w: ]' A8 g- W
  Win32_NetworkAdapterConfiguration. ]" V- i5 a# b! g7 @4 J
  Win32_OnBoardDevice& G; M$ D& J; H" k3 p5 H
  Win32_ParallelPort0 B2 E% s8 ]9 j8 v' L3 V/ K0 X4 d: d2 X: f
  Win32_PCMCIAController
9 o8 T6 e5 d8 z2 X   Win32_PhysicalMemory% B; q  Z, w0 N' o8 g7 a+ C- z
  Win32_PhysicalMemoryArray
, l. Y9 T' v& z$ N4 T7 f7 B- }; f   Win32_PnPEntity2 C' E7 A3 g) U% K
  Win32_PointingDevice
% F+ E: d- N. Q4 w' |5 V   Win32_PortableBattery
3 f9 }9 l  w- u# R2 w4 Z   Win32_PortConnector1 F7 q9 ~: r/ ~# r5 w
  Win32_PortResource
4 l5 ^' x# w7 p# p% o9 c   Win32_POTSModem
! ?% C. g" M: u   Win32_PowerManagementEvent( g3 M! c4 A7 p+ ]# w
  Win32_Printer; S; i& _  T7 F: K) z( l
  Win32_PrinterConfiguration
. `  n: z; `" ]) I* X& i   Win32_PrintJob" v1 T( T# a3 Z5 u4 H5 n0 l
  Win32_Processor( P3 x, W7 R: u$ C$ {8 y9 ]
  Win32_Refrigeration8 P  e# i/ k+ N5 W; W5 C, r) c  T5 n) U
  Win32_SerialPort
' v0 n$ f. T6 I   Win32_SerialPortConfiguration, D! v: v' T/ H# D
  Win32_SMBIOSMemory
' `1 d* x7 g4 l! T6 r, b( Q   Win32_SoundDevice
# o, J9 A9 M: F; N7 y, W. p   Win32_SystemEnclosure! d& |. [$ {, v0 L- W* U% j% R
  Win32_SystemMemoryResource- @3 ^* h% e1 I1 ]
  Win32_SystemSlot2 I% r% L8 p0 g* B( p; _/ K1 ]% J
  Win32_TapeDrive
. s; G2 w3 H2 f' \% P2 Z   Win32_TemperatureProbe0 ]1 {9 I! n7 K' Z+ M' c
  Win32_UninterruptiblePowerSupply) U& v& D/ G: Y9 K- y: R
  Win32_USBController; y+ u/ b% m0 i
  Win32_VideoConfiguration6 \1 L% O0 w4 n) _; Y& F
  Win32_VideoController' h0 }& A* L6 n" [- w+ ~
  Win32_VoltageProbe. \( ]% Z1 a- h3 c

* P& v0 h" F1 @( \7 E2 F以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 02:33 , Processed in 0.017607 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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