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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者), ~/ o1 p2 V% l- d/ G& G4 }
; w, X/ j7 u, x7 A; |5 s0 g' ~
* N: I0 c! w) q
--------------------------------------------------------------------------------0 P$ E) x9 K( J0 I$ F( r1 d& U  }
WMI: Windows Management Instrumentation (Windows 管理工具)) s- T. v3 A! W: ^! Z1 s+ t/ t
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ' I  i' i* E& M% b% G- ^2 J
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
8 L' J% H; r9 L6 p   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 + I* Y  y) E9 w3 ]

. B/ z$ L' |5 i- W--------------------------------------------------------------------------------. @) R( S. @3 f; J
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面2 `: _$ _- V: _1 \0 O  p4 E, @

. g! Z: ^* L' f6 y( b--------------------------------------------------------------------------------% b) z& r% t, x" _' \
① 初始化 COM 接口:3 {; a% B' P7 \0 {" Z, _4 _
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
- g7 G0 N; ]4 C   这两个函数在 #include <comdef.h> 里面定义。1 X: ]: r2 w5 ^0 T4 C

; U1 H0 e% |/ F* ~' k② 获取访问 WMI 权限:) {" G% ^7 @9 B
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);5 |. i/ T& k# x. }7 y9 _6 W
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。) f1 o5 x; A7 y) j: [0 ]
' O9 O. _. ?( W9 n. U$ h
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:7 }* L% z1 i* o8 V
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
6 i+ p* x- P: p5 q& V/ |% S
8 b* I; s: [( n! N0 E" l5 ~void GetWmiInfo(TStrings *lpList, WideString wsClass)
4 n% e( r/ u1 H2 ~0 y$ {{5 u: y. _; o; A/ }& {3 U
  IWbemLocator *pWbemLocator = NULL;
+ Y9 m# y3 p, e( X; [5 e  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)$ W3 m" f. R" V% R6 r3 s$ |
  {
5 B5 \9 j( K! i' b+ d7 F6 f     IWbemServices *pWbemServices = NULL;
0 R1 h$ ]+ X0 t4 T0 s2 z- `     WideString wsNamespace = (L"root\\cimv2");1 r: A8 [5 i% j! u4 @# V+ N" g
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)" y4 ]! w4 _/ K0 v0 \
     {
3 q, R- B  A" N/ l: @2 D/ j; z        IEnumWbemClassObject *pEnumClassObject = NULL;9 P2 T# h, p7 @, n1 i: @
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
! G! T2 Q" g# L+ O- t) B- a        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)8 Z! m; j, \( E/ Z! C
        {2 p. |. v7 [: L" w% [0 ]
          IWbemClassObject *pClassObject = NULL;
3 b! I3 G1 `; ?. Z6 n0 w+ Z0 N           ULONG uCount = 1, uReturned;
$ P3 m. E" w$ d5 Q5 ~8 D           if(pEnumClassObject->Reset() == S_OK)0 |  y' h& h; M, G
           {
* L8 z2 w- ^; r3 J9 J              int iEnumIdx = 0;+ w, @0 P* [+ Y! B4 T: B, n% N
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
. s$ B$ m' q& ?) ]/ o               {  e8 A+ t1 x7 b3 A( k
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
8 [8 D7 M; J/ _
3 |8 Z' s; i- t& r. `9 w                 SAFEARRAY *pvNames = NULL;
2 A- V8 B; C; i2 q                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
0 E. D( Y5 u+ C8 d- ?& S                  {% M1 J# C3 M5 Y3 h
                   long vbl, vbu;
  S6 {0 }/ x, s" e- d                    SafeArrayGetLBound(pvNames, 1, &vbl);
6 V. N( Z; T9 \- I' f+ |7 X4 V                    SafeArrayGetUBound(pvNames, 1, &vbu);; s3 j/ _. y4 G& a. J6 D% k
                   for(long idx=vbl; idx<=vbu; idx++)
$ p+ P7 _. X  B" Y                     {
; W) @/ ^6 ]" F6 R9 e% Z                       long aidx = idx;
3 }6 r$ Z) X( [% e2 N+ D                       wchar_t *wsName = 0;
3 k* U! i/ I; H; P, W7 u                       VARIANT vValue;% u" P6 L1 T" R* F# M, V3 f3 L" X
                      VariantInit(&vValue);! V4 k! j; J  F& y
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
% S' u, p2 j5 o; y# j( a; Q' G# s5 w
                      BSTR bs = SysAllocString(wsName);
- d+ c# ]1 f* _4 V& g* k                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);8 K+ P1 }  [, U- U2 m5 v
                      SysFreeString(bs);9 ^/ H- S8 L' {. \( n( e
. W6 [! _: j/ k3 S# }) U
                      if(hRes == S_OK)& _* l; z1 ~) E' U  x3 u3 N
                       {
) u, |  B. u) o( O8 i                          AnsiString s;! C- d; X/ n+ I8 ^0 T4 A, _- u" x
                         Variant v = *(Variant*)&vValue;7 L8 A; `: y8 R& W( ^# e
                         if(v.IsArray())
0 J+ W) ~* K- c' \, v  e% d                           {6 i* i& `  Q& _; }
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
: G& M) s$ s6 Z$ E* F7 r                              {, f3 g% {0 K" w$ F" m. F$ B- P: m
                               Variant a = v.GetElement(i);1 Q6 @) i' Q9 ]
                               if(!s.IsEmpty())
2 W4 ?  n( K/ F, s& i/ ?                                  s+=", ";
) Y5 B% G  d% Y! I4 p                                s+=VarToStr(a);
2 Y( q/ }) q7 u3 s/ g7 P9 N                              }
+ [; Y1 W0 |/ G- k8 ?                           }6 N; e2 N6 {" J2 w
                         else. z( d) N$ v1 y, o9 J4 T" t) O% M
                          {7 X- R: {8 F: G' N- [
                            s = VarToStr(v);
" Y6 @& g/ T8 m8 r. Y( u                           }6 M9 p9 u- s3 F4 g
                         lpList->Add(AnsiString(wsName)+"="+s);
$ V" Y: w% Q7 U# E7 Z5 q                        }$ s' E6 C" n# U* E0 Q, m
! @2 a4 p2 c3 b
                      VariantClear(&vValue);
8 V+ A6 K" N: U$ B. l7 F                       SysFreeString(wsName);, B0 }$ R3 k, G- c# u7 R
                    }, r4 M& l0 \+ j& O1 ]  M
                 }
! `$ O# B$ Z2 c8 }$ H$ i                 if(pvNames)SafeArrayDestroy(pvNames);3 f" l* O3 x5 G) w  d6 |( V
                iEnumIdx++;
* A: V+ J7 v/ p1 V               }  N4 B6 n4 ^& g% N5 T% E
           }
5 A4 C! ~. ?8 O           if(pClassObject)pClassObject->Release();* R0 x: x. a$ C7 P" O
        }/ i' ?4 l8 O5 h# |. d
       if(pEnumClassObject)pEnumClassObject->Release();$ e, U' y7 H% x4 D( r0 }: ~
     }; ]; Q  {! a5 h
    if(pWbemServices)pWbemServices->Release();- M8 B6 O2 I9 {, l/ Q. E1 L
  }
1 a; k0 G1 }% p/ \5 ?+ W9 `; f+ N  if(pWbemLocator)pWbemLocator->Release();
$ l' N" o9 x& p' N/ d# }}
! a! G# Q' N$ F) i1 i. K//---------------------------------------------------------------------------/ ?8 S: a. u4 s

7 H, E5 B. q% K- p4 k// 通过 WIN32_bios 获取 BIOS 信息:
6 P; ~7 E+ Y/ A' \; G8 N, E: @void __fastcall TForm1::Button1Click(TObject *Sender)
& E  t  `. C8 U! O8 I{
3 M3 Y5 z- `- Q  P: E( @1 M2 {    Memo1->Lines->Add("================== [WIN32_bios] =================");5 f5 s* p# |+ R" s! U$ ~
   GetWmiInfo(Memo1->Lines, "WIN32_bios");: U" R. w9 J/ m, ]6 }& k
   Memo1->Lines->Add("");; X( u* D8 M. W# \
}/ h9 ^0 q% f9 q" r  ], Q3 Q

% s* V8 ]! c7 R0 k. r' P( V. W--------------------------------------------------------------------------------8 J, n5 b# ?: Q# r& Z3 {
* J* J$ i0 ^+ p5 F. I4 x- i9 H
WMI 可以访问的信息类型有:
# I; |9 t7 e. K, X4 S6 W   Win32_1394Controller% e- x2 ~1 z# Q$ |" ]4 T
  Win32_BaseBoard) L5 `: I4 L$ D+ E
  Win32_Battery" d7 _! u$ a; K, q: ?& G/ ?# _
  Win32_BIOS
  v0 l% F8 K9 X4 ]# u   Win32_Bus# ~* D" r; b3 v/ P2 ?6 p, k
  Win32_CacheMemory; @9 u) C' M$ Y" M3 s5 Z7 _# x
  Win32_CDROMDrive4 t! q& N: }- ?$ m6 a! L. Y& C
  Win32_CurrentProbe% R( x6 h' U1 G8 F
  Win32_DesktopMonitor6 d8 e% c, C9 q' [2 u+ y
  Win32_DeviceMemoryAddress1 U* v3 E& L9 r3 P( k
  Win32_DiskDrive
2 |3 G/ o) N& f* b   Win32_DisplayConfiguration
8 _4 r, L. Y3 w/ W# |3 T   Win32_DisplayControllerConfiguration4 \1 R0 W3 w" x7 T) N5 i2 s
  Win32_DMAChannel7 W* f7 E5 G7 y  a
  Win32_Fan; ?, M$ {; \$ ]* a
  Win32_FloppyController
3 i9 y) i. F; W  `   Win32_FloppyDrive
; x  y+ i; R" ~4 s   Win32_HeatPipe
) {; m/ `0 m# T   Win32_IDEController
8 P; b& `4 ^7 G. Q) Q. }   Win32_InfraredDevice% u0 h; N; p# m  v
  Win32_IRQResource
9 f8 ~; b% c; X. |1 k4 f   Win32_Keyboard
" U( e/ ^; l6 G$ g: w& G   Win32_MemoryArray
& V! u$ U7 p: j2 t2 U* R$ Z   Win32_MemoryDevice& X$ x2 r1 N" \. I7 F
  Win32_MotherboardDevice
! d) {0 U3 o! l- V   Win32_NetworkAdapter
. F& j: R  ^  Y5 I1 b! e   Win32_NetworkAdapterConfiguration
9 k; w3 ?8 d# _( S5 P: {8 u- H   Win32_OnBoardDevice
0 U" ~0 E8 G/ @   Win32_ParallelPort
7 |$ R- G& w; t   Win32_PCMCIAController
- I1 [2 l1 r1 v5 i; ^" b: W   Win32_PhysicalMemory* ~4 _, s3 q  n! ^0 e8 a/ \
  Win32_PhysicalMemoryArray. K4 u" l- b7 X6 F2 t, A3 O
  Win32_PnPEntity/ [( h) w1 E6 s: g4 ?8 \
  Win32_PointingDevice
3 Q: J" q, ?6 a% Q# z8 k   Win32_PortableBattery. u( H/ R% d7 F& P) b* N
  Win32_PortConnector2 P) B" Z" N6 H* R
  Win32_PortResource
3 j0 t/ k( O' r7 u( q   Win32_POTSModem0 t- S+ B% V  X$ x& q9 s
  Win32_PowerManagementEvent# L, l6 C4 L6 }/ c6 @
  Win32_Printer
) g' q) [7 x2 W9 F3 J/ F   Win32_PrinterConfiguration6 E' G+ h* I4 ]# O3 ]
  Win32_PrintJob" R) _' f3 v" B
  Win32_Processor3 _7 x8 j; l8 a: }7 q  N, {
  Win32_Refrigeration
& C# x7 y' T. J# {4 P2 i) R   Win32_SerialPort7 ^1 _2 b3 ^, u2 l: F
  Win32_SerialPortConfiguration
7 b: q0 Q& t9 u( W   Win32_SMBIOSMemory
7 x/ b/ u2 u) M   Win32_SoundDevice
2 U/ K- U$ W/ t/ Q5 R% g& i+ G   Win32_SystemEnclosure
. H( R& j+ O! e- Z6 o8 e1 H   Win32_SystemMemoryResource
, c, |8 T( S! r# N/ k! Y7 w   Win32_SystemSlot6 e. V) S2 l. c- ]
  Win32_TapeDrive9 ~" ?  V& V' r! N
  Win32_TemperatureProbe
: ]# u9 U! B% W' U! ^2 z6 M   Win32_UninterruptiblePowerSupply6 D# \1 I( u" g; d. A0 u  R& Z* }
  Win32_USBController2 @" V6 R" D+ S
  Win32_VideoConfiguration
( |7 h! j/ J* [! i4 }   Win32_VideoController
1 f9 S5 v) Y) o9 }9 m: S1 E   Win32_VoltageProbe
4 L$ o; o- N6 [4 F$ f
! C/ l& s5 M" J. R/ [7 `& C7 [以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-4 10:25 , Processed in 0.020838 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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