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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
7 f- R1 Z6 a6 p* F+ t( n+ [7 z2 ]# r2 Q+ D- K9 C6 C( `, W- d

$ l( I* J9 a5 j+ `--------------------------------------------------------------------------------
% D( I  E$ R. c& X2 g; GWMI: Windows Management Instrumentation (Windows 管理工具)
2 ^9 j: [' e4 s5 s% Y   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 2 w& u6 P4 I) _4 j' S
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
. M" t# P) V0 O6 J! K# G   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
+ }6 F8 G) r6 p7 [3 }8 V' g
2 H' a5 F  z9 V- a9 I% j--------------------------------------------------------------------------------
1 ~; ~5 b9 {6 I- RBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
. D6 X$ U1 J2 P& K
% A' G/ U4 O: R) i--------------------------------------------------------------------------------
5 n- c7 q; q0 ^$ ]3 P① 初始化 COM 接口:1 Y& }0 K3 \8 D
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。9 b! Z: g0 n0 N
  这两个函数在 #include <comdef.h> 里面定义。2 c/ d7 k5 p  ]) ~# F' {0 }  P
. t" U* S( B4 Y1 P7 J9 E' c
② 获取访问 WMI 权限:
+ z/ }4 r9 c2 u% I   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);5 f. S7 r! J9 ~1 R
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
( y( x* q  H& `1 [1 _- E. l6 h5 N( U, e' x4 }# E/ H
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:* i  {( `: l* }% @2 @1 Q1 m0 @
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。2 S# j9 }3 |6 t3 x9 c* M  @( b* z

5 I6 C0 D% z7 x+ U9 {; l& X0 [void GetWmiInfo(TStrings *lpList, WideString wsClass); c" _( Y+ S- Z; E
{7 ?5 O5 }3 _* {5 r( b, v
  IWbemLocator *pWbemLocator = NULL;; }) v5 }  D% m1 O
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
7 `! m& o& ^4 |8 v4 E1 q1 Z4 Z   {
0 r# b( N" m/ B+ e     IWbemServices *pWbemServices = NULL;
$ u& `( D4 a* ]- o: `     WideString wsNamespace = (L"root\\cimv2");* Q( ~6 h6 @$ J7 @. S
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)4 H" ]" l' R7 R# j% u( c0 k& M& B. P
     {" I  O$ |: }: W& |
       IEnumWbemClassObject *pEnumClassObject = NULL;
7 O& R! Y9 N2 X% |0 t        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;3 \/ R8 N' g- ?* A+ y
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK). ^$ d, R1 _6 G$ a
        {
7 y3 r% \6 e# ~) ~           IWbemClassObject *pClassObject = NULL;2 ~! d- y9 V' v* w7 p% n1 ^
          ULONG uCount = 1, uReturned;: l; e$ h; l. d" U( o- D' S2 F" F
          if(pEnumClassObject->Reset() == S_OK)
/ G& N6 y/ o7 J2 C            {% r- M; X8 i$ t/ N4 T
             int iEnumIdx = 0;
& A! C  S8 Y- h              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)! R. _% x! [/ |0 o
              {
" i0 z6 U5 |' @* O; E: g& m                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");& u6 @" G  c7 p7 A* M

& [* r4 t6 O* K' D  f* P' {                 SAFEARRAY *pvNames = NULL;
. K; Y: |9 {- T# t  `                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
# d  C, Y$ L* r8 S' k. I  z                  {
+ o" X7 w$ m6 e5 V% j. [9 {                    long vbl, vbu;
1 X0 J  }. k0 Z6 g                    SafeArrayGetLBound(pvNames, 1, &vbl);
7 U2 n2 l$ p+ H                    SafeArrayGetUBound(pvNames, 1, &vbu);
& L% S* U5 M9 R1 y" d$ N, F                    for(long idx=vbl; idx<=vbu; idx++)& \- s& S0 C6 `% c
                    {0 T$ m1 G' s9 O  q4 b: z1 _
                      long aidx = idx;, J( }1 A5 x: N9 p, j& m
                      wchar_t *wsName = 0;
/ h  i$ k/ i8 d( V' T: G+ G' G                       VARIANT vValue;
1 N) e8 y6 M# L                       VariantInit(&vValue);: M. ]5 S9 L6 k8 T, k# y
                      SafeArrayGetElement(pvNames, &aidx, &wsName);. v9 R' t6 w1 E6 v+ Q

1 S0 A9 ^3 X7 @! O, g: O                       BSTR bs = SysAllocString(wsName);7 K2 v5 P, O3 `& s& b/ {
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);# e( ?( n% G5 E
                      SysFreeString(bs);
) h& u+ @7 J1 e1 c9 Q; ^7 @* J( O, {
* X* `( R& T' C$ t                       if(hRes == S_OK), P* C2 h2 m3 X) v% w; O  ^) f
                       {
2 i! `$ O* K/ l+ _4 X" Z' T- D7 u9 m                          AnsiString s;. f+ z9 n' a+ C4 t0 K1 d
                         Variant v = *(Variant*)&vValue;
' U) L9 H* |  N' ~8 c; Q                          if(v.IsArray())) H2 ^" z' H4 p
                          {, H# G% S0 |1 u: x
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)6 E: @4 x  I2 |8 M! }6 Y
                             {2 ~* s7 R# ~) d
                               Variant a = v.GetElement(i);( C! l$ b! z' m
                               if(!s.IsEmpty()), B; ~6 n' {1 U8 A* m+ l% L
                                 s+=", ";
2 l( s+ R. G' ?                                s+=VarToStr(a);1 C  G4 o' ^2 z! u( _7 S" a! u/ U
                             }/ f0 K# Y. x' S& h( _5 k5 O" s
                          }
& p' x3 b0 u" J2 T4 s( z6 b" {  x                          else' h! A" f# v" Y( O  N
                          {
" E, m! f/ \$ Q( ?5 s                             s = VarToStr(v);$ q! P! m+ a# c# q
                          }2 t* `7 _+ t* Z$ _( A+ I& Y! D
                         lpList->Add(AnsiString(wsName)+"="+s);3 `5 e, |3 w7 ~" j; j
                       }
6 I0 S, r* |, h% e! ^8 f. o9 Y- J: S) Z) g( P* ?
                      VariantClear(&vValue);# ]5 R& N* a) ?
                      SysFreeString(wsName);
, k! l1 O6 U0 _0 w                     }
2 x$ O9 M  Z/ h. _5 w9 c                  }
, k7 C( i9 T+ e2 X( B" P+ n% ~                 if(pvNames)SafeArrayDestroy(pvNames);
) N* V, J. p  s+ p% o( Y                 iEnumIdx++;
5 H. s- N$ F3 `+ v               }
3 ~  Z( W# G6 l) q            }) H5 T/ ], b+ o1 q' i4 _
          if(pClassObject)pClassObject->Release();
) w2 [! n% q  i/ e         }, [- S1 q6 |) a& T
       if(pEnumClassObject)pEnumClassObject->Release();! h. a& K0 K& a$ Y& I' @
     }
4 [8 u& U- S4 A     if(pWbemServices)pWbemServices->Release();( A. i/ b5 l! h4 U1 l- }" K$ q
  }) E5 J8 X! g8 [
  if(pWbemLocator)pWbemLocator->Release();
* {: ?/ [2 l- v( C$ j% j}
$ I: V& k  q& `) k- G  H, h//---------------------------------------------------------------------------2 U( c* D0 }8 a/ C
6 ?4 P% ?" |1 F2 Q+ \
// 通过 WIN32_bios 获取 BIOS 信息:# x& l/ H% K/ g% Y7 X' h
void __fastcall TForm1::Button1Click(TObject *Sender)
8 [2 t( `! l) M' }2 W{, f, x) ]2 d9 o% r  N
   Memo1->Lines->Add("================== [WIN32_bios] =================");7 G$ I+ W4 Z0 o. o2 v% @: ^5 f# Z
   GetWmiInfo(Memo1->Lines, "WIN32_bios");, l5 X& _1 i8 r. Y+ Y' x7 ^' i
   Memo1->Lines->Add("");% Q  M, O* {' W8 r8 C3 j
}9 z. N- i  v4 _7 ]5 V
" i( c# ]; E7 g0 j$ v4 ]
--------------------------------------------------------------------------------4 Y& D6 X& e' ^; S
; [* R/ O2 O+ L4 H+ F6 M
WMI 可以访问的信息类型有:
2 i* i( F, {$ |   Win32_1394Controller4 {  r2 j6 S# y" V. a: n' w
  Win32_BaseBoard( d) F) L( M6 l
  Win32_Battery9 m: r: I9 ]; p, `" m1 [% b4 h
  Win32_BIOS
! Q) b/ x8 \2 e% z4 R   Win32_Bus
1 z2 W/ C( z& U4 _! Q% j+ G2 k* S   Win32_CacheMemory6 j# l4 P/ E. {/ {3 O' _" ?
  Win32_CDROMDrive
% w; d+ n  H/ T   Win32_CurrentProbe
& b. e8 R$ ~- H7 o) g9 ~   Win32_DesktopMonitor3 E# C; b5 P8 p4 _5 [7 \: N
  Win32_DeviceMemoryAddress( x7 F6 @. N# w  L- ?0 g& V
  Win32_DiskDrive
# Z5 C  [3 M+ m( O* a. O& `   Win32_DisplayConfiguration. ~7 C7 Y# y) [
  Win32_DisplayControllerConfiguration
  o4 n. m6 j! s$ ?0 |! L4 N   Win32_DMAChannel
3 y6 C* A6 B2 I6 r   Win32_Fan( N7 X+ m$ G/ ^
  Win32_FloppyController. A! [( r6 O7 x4 ^* S
  Win32_FloppyDrive
2 {+ G8 J* ]/ h4 G8 r   Win32_HeatPipe
& b( K: p+ L- ?0 B! h7 e: d+ |   Win32_IDEController& c- c" C" z1 a& F! T" _
  Win32_InfraredDevice+ V! V" y( y0 S8 q) R
  Win32_IRQResource" @( m: v* x8 S* G7 U
  Win32_Keyboard/ o* {' w: m- x) R7 |" a
  Win32_MemoryArray1 ]' c9 r6 v  n' V, X; ^+ n* e
  Win32_MemoryDevice
8 Q  l% D8 W& P8 a0 ~   Win32_MotherboardDevice# L4 z* k) I6 [- v) {8 q
  Win32_NetworkAdapter& J, D7 U# S& j2 n# o$ E
  Win32_NetworkAdapterConfiguration0 r6 ]: B. u* r+ @; V
  Win32_OnBoardDevice
0 D" S1 Y3 Q4 y/ R. t0 q  u6 R3 [   Win32_ParallelPort
9 H/ K* F2 r2 J; ~% s   Win32_PCMCIAController$ I/ |: y0 l7 F
  Win32_PhysicalMemory& @7 \- w7 V7 k# S( {  j: r2 \
  Win32_PhysicalMemoryArray/ s4 J: o% [. B+ J1 v; U
  Win32_PnPEntity2 r/ `! ?9 Q1 C, g( C! C
  Win32_PointingDevice; M1 \2 A+ b, B& m' L) O6 l
  Win32_PortableBattery5 W8 B+ R8 L! a8 s% A' e$ t
  Win32_PortConnector
" V  S  S8 r1 {   Win32_PortResource
( c6 L" n2 Y$ a1 ]2 B, g   Win32_POTSModem
: t' p" D9 z8 X& z3 z   Win32_PowerManagementEvent* L* x" H, Y: N- [9 q
  Win32_Printer$ b3 t' }) k8 Z1 U+ h: p
  Win32_PrinterConfiguration! Q6 {3 h" B& G# J7 I+ v
  Win32_PrintJob, L$ j# s9 O0 B3 o' d! d
  Win32_Processor
2 r: U+ S, i" {' ]5 r9 g   Win32_Refrigeration# u8 t- Q& p( a) q
  Win32_SerialPort
) D% [! ~7 E# K$ B) K3 C( P) U   Win32_SerialPortConfiguration
0 C1 J; ^9 \$ p, S: U  a  `& T   Win32_SMBIOSMemory" G0 X2 ~; i9 D/ f! e  s
  Win32_SoundDevice0 u9 U! l! g8 t/ Z, m
  Win32_SystemEnclosure8 O2 E& B$ X) X+ j0 {& h
  Win32_SystemMemoryResource
  l) x0 N/ ]. C$ \   Win32_SystemSlot
5 Y$ k& ^8 ~. \& d- D   Win32_TapeDrive. m# b. A5 T& M9 {2 U3 V# `# ?2 l
  Win32_TemperatureProbe" C3 K- ]* v  o" K" K0 q! k3 X
  Win32_UninterruptiblePowerSupply
6 Q/ w( R( X' x( I9 u   Win32_USBController$ Z' f- N$ ?* q7 X. S# D$ Z
  Win32_VideoConfiguration2 M" W9 [5 Y( a0 J
  Win32_VideoController
$ [: W: l" {" [- n   Win32_VoltageProbe9 ?6 l5 t- Z) f: ^3 G7 q7 D6 o7 W
! L. D7 W' e: U4 n1 R
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-16 14:31 , Processed in 0.020352 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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