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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)- `$ q5 ^  q2 _$ [+ s! b) D; y% {
" Y2 _% e$ S( D9 I# _+ m
7 v  ]/ y$ i- k# t, h4 W
--------------------------------------------------------------------------------  s1 ], X2 I$ y" }7 l) V. U9 a
WMI: Windows Management Instrumentation (Windows 管理工具)# K4 x" u" }; r1 Q, A
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
. a) W- o& @6 d, I/ S7 r. W   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
3 L& ^, f( `3 ^# O5 r   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
- J- i1 n9 t* {8 |7 x. m3 s
/ Q2 A+ K5 f" L: \1 [, ~--------------------------------------------------------------------------------
' I$ b% R7 `% m. \- y* h3 F, HBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
1 V: ^. B4 K" y, n, r* r8 I, P0 q
$ f7 b7 ^  `8 g# w+ E3 e--------------------------------------------------------------------------------
* c& E" f: |, d* g① 初始化 COM 接口:6 D4 U0 x9 h$ [0 ^5 \* s, z
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。) i9 j* x) Y8 ]/ b$ D: W6 _2 ~
  这两个函数在 #include <comdef.h> 里面定义。
$ q# T5 I; O5 y5 e2 O2 `2 g+ U! g
② 获取访问 WMI 权限:/ A1 ^3 g" m' [# D
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);) k* Z6 w+ I- ~& O1 [
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
7 l. y* Y0 j9 u7 {- N, b4 Y- @
- i6 Q" n8 x5 r- s③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:  H1 J0 l: W8 h
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
8 r) b) B# G9 p& r, ^6 D  T. `1 W8 q7 L; g# ]
void GetWmiInfo(TStrings *lpList, WideString wsClass)" y; t' m$ M( j
{9 o  {8 s. i. W7 L! L, f9 T
  IWbemLocator *pWbemLocator = NULL;
3 [3 `- V* [# h" d! Q- ]0 F" \  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)  K* Z% ?# M( ~( c. \6 F  t& D/ ^
  {# f8 B0 t0 j( B. F
    IWbemServices *pWbemServices = NULL;. p. \, g+ `( t) {% x1 q$ h
    WideString wsNamespace = (L"root\\cimv2");9 ^' M' s% C9 [: O) R
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
# K5 {% N* q: K1 f; k8 Z, A6 J      {4 T( V, F9 X5 a/ X0 C5 E
       IEnumWbemClassObject *pEnumClassObject = NULL;
' S  ~% _3 Z9 p; O( q! Z        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;* h, o: E6 x" F
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)  m  ?2 U: M, P- H& m
        {
# D1 u% \5 A* j' Q9 x           IWbemClassObject *pClassObject = NULL;
& ~1 n5 `1 B' G- r0 W( H: i           ULONG uCount = 1, uReturned;
/ f4 a, ?3 e3 Y& g8 B+ T5 j# ~           if(pEnumClassObject->Reset() == S_OK)
; V) y$ u! G) x* j& j* X            {
% u# O) X# ~. K0 a$ {8 W              int iEnumIdx = 0;
- E3 W; @. I) s" q3 M4 I( L              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
, N: V" q" E+ L# N  F2 O; k# h  G               {
$ N5 Y/ p6 u' V* ?5 ?- H                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");% h( U4 e- e  l) P0 V6 l3 a

7 h" v" h; D# h- T                 SAFEARRAY *pvNames = NULL;
  B" {# [  }7 g3 K* O  Z8 Q( J                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)4 e+ C: L8 P- n& M6 k% P
                 {- E  C0 R/ I: c% y
                   long vbl, vbu;4 j8 E6 P6 m" j5 q3 y/ h
                   SafeArrayGetLBound(pvNames, 1, &vbl);
: ^' Q7 z5 i* |% A& |                    SafeArrayGetUBound(pvNames, 1, &vbu);
  h: r/ d  y4 |2 b6 H/ g3 m- B                    for(long idx=vbl; idx<=vbu; idx++)" L3 H' m2 R) E6 \* U& \$ u5 T5 N
                    {# ?4 W( I$ o, F, L2 ?, ~
                      long aidx = idx;# P9 q6 y1 o; \4 O- t
                      wchar_t *wsName = 0;3 n% y" X& ~- \: ]! @' `1 R* h
                      VARIANT vValue;
- L4 ^$ Q, C( D+ J* |& K0 @                       VariantInit(&vValue);
4 F9 {, \( x6 ]& Z$ H3 G/ @                       SafeArrayGetElement(pvNames, &aidx, &wsName);
9 Y# T! `/ [" q: y- \
8 _5 o1 @- m* p6 i3 ]& E                       BSTR bs = SysAllocString(wsName);
% q$ A5 d* ?- q- _                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);2 o% ?; p/ ~# Y8 _: a
                      SysFreeString(bs);
$ P% P2 J% e( Z& }  N4 B6 }0 d# D
7 W5 ]7 G* e  H7 r; V: G                       if(hRes == S_OK). ~7 M5 Q; O/ {: ?; i" Q4 n2 P
                       {
( a& Y3 R9 V* j3 t3 ^                          AnsiString s;
4 c8 A- b9 q  W3 s- _                          Variant v = *(Variant*)&vValue;
4 r, @% B( d  J' d# N                          if(v.IsArray())# n& }3 E- e8 ^. ^7 m7 v* C8 [
                          {
) s& ]* e% b* D+ v# Z/ ]( Q% Z                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
) ]3 ?* T3 i7 {+ P, p" W( R                              {9 ^  R0 z5 |8 B5 P$ E
                               Variant a = v.GetElement(i);. ]( C0 H" X/ q5 X; x# s
                               if(!s.IsEmpty())
8 d' L5 v5 s" d' |+ e5 r+ f0 W                                  s+=", ";% O( d( d/ o9 V% D* }) b/ A' Z
                               s+=VarToStr(a);" u& V6 q: q' D+ I1 m
                             }+ {, E' d8 @1 }. I& w, `' F; N5 ]+ [
                          }) y. ~9 J5 K8 e& H1 K3 q+ Y- C! G7 v
                         else
8 J2 X- C" z& S, ?- o. q! `                           {$ O: m: E7 t! V
                            s = VarToStr(v);
) \/ N' O% R4 D" D% B                           }
' }1 j, T- v' B# ?& |                          lpList->Add(AnsiString(wsName)+"="+s);
$ D% f7 Q0 m- Y3 y                        }
# c! @! w9 U5 G8 S/ i! F7 g! g- d
' T1 Q7 I/ d4 A: N1 j                       VariantClear(&vValue);
; j; }6 z/ ]- f                       SysFreeString(wsName);
) O# g# J+ j! N& P2 ~$ F) h: S. j                     }# J' ^+ b- d1 t" S7 v
                 }, D! N4 E5 u3 u' e+ q1 b
                if(pvNames)SafeArrayDestroy(pvNames);! P) ^* W- b0 \) _7 ~: |4 p
                iEnumIdx++;
" V6 q& _1 h2 j! s7 G- Q: ]& a               }
1 k' ?/ ]& T- ~% k7 H2 _9 o. l1 Y) v! S            }0 X3 s9 v% c+ r- v9 g$ K- K. i
          if(pClassObject)pClassObject->Release();, s7 \- [' A9 d- j0 R
        }$ t* ^! F- C9 P, b8 G) q5 T
       if(pEnumClassObject)pEnumClassObject->Release();
8 K' G- t7 d& R      }
( T: b* ]2 F. ?& S     if(pWbemServices)pWbemServices->Release();
" n  |/ T9 y5 w! ^0 D) G# l   }
5 y7 b; A* o( v( X/ C) |$ @  if(pWbemLocator)pWbemLocator->Release();
. {/ J6 ^9 t; q  @}+ [( x, _! |; d
//---------------------------------------------------------------------------
( E# q$ Y; ~; q
" e, L8 g* x& k6 L' ^6 N" j* x2 p// 通过 WIN32_bios 获取 BIOS 信息:& _8 X$ o& u7 Z: u$ l4 d
void __fastcall TForm1::Button1Click(TObject *Sender)3 E/ j; s- k* g  y( \4 H) `
{# g, x4 E  I5 M/ S+ V4 ]
   Memo1->Lines->Add("================== [WIN32_bios] =================");
$ d' F8 l/ K. [# x2 s    GetWmiInfo(Memo1->Lines, "WIN32_bios");
1 ?) b) M! w2 R; h' P( n2 A    Memo1->Lines->Add("");
& J1 f# E" |% b* T6 G}( R+ j9 d( L4 l
2 S0 h. q" u' b5 S, {( Y
--------------------------------------------------------------------------------
5 |% W& n  O  X: \5 l5 T0 C, h+ B  X+ q9 y: {7 Z
WMI 可以访问的信息类型有:
  {- F6 u* f6 d, y0 `0 \7 Q6 p8 D   Win32_1394Controller
" \2 \0 n9 N( M- p   Win32_BaseBoard4 H1 n  _8 @$ e, B5 O: s
  Win32_Battery
+ _0 ]; }1 `9 ~) C3 Y$ |' E$ L   Win32_BIOS
2 R% x: I% _6 V7 X. D   Win32_Bus1 P5 x1 ?7 b3 b) ^6 z, L
  Win32_CacheMemory0 z; U  u" X. h3 Z! [! J
  Win32_CDROMDrive/ N7 ~! c# t  q$ p
  Win32_CurrentProbe/ n" J2 O: k% Q: H6 u% _! t- L# ?& |
  Win32_DesktopMonitor0 E' [: a/ {3 m, X( m4 w
  Win32_DeviceMemoryAddress; ^4 [. H% c0 A4 X
  Win32_DiskDrive( ?! t: \! l& v/ T3 @9 N
  Win32_DisplayConfiguration
* u$ U' f- P5 b$ R   Win32_DisplayControllerConfiguration
- F0 b& d0 X5 W& H( k   Win32_DMAChannel2 d% L% ]# L0 s% a
  Win32_Fan
3 G# I/ @' X4 U' h9 G7 @/ d1 V   Win32_FloppyController9 A2 t6 K$ _& q9 J/ ]7 w. S
  Win32_FloppyDrive. b! l+ n! _' ?2 t/ {$ d8 s
  Win32_HeatPipe
4 M9 L, m8 S3 [) r! n8 r   Win32_IDEController0 h6 I# J. }+ P+ j+ K) ]$ L
  Win32_InfraredDevice( _4 e! d) e. G* r9 T& }4 {' H9 Z
  Win32_IRQResource3 s7 V1 K. p) l- F
  Win32_Keyboard
# ]( ^% B! }/ Z   Win32_MemoryArray
6 V  F7 d5 X5 k+ o   Win32_MemoryDevice
* M* N0 h' l% f6 a   Win32_MotherboardDevice
! q% h* d8 r( x3 T7 |1 @" a   Win32_NetworkAdapter, X7 M$ ]' J8 N3 \, M7 F* r' a/ _
  Win32_NetworkAdapterConfiguration
$ `3 p3 u7 _( t5 g" G0 i4 w   Win32_OnBoardDevice
9 L# {" x0 e+ l7 s1 F5 K& J; C   Win32_ParallelPort
1 ~* P8 W7 O2 e& |& D6 K3 |   Win32_PCMCIAController+ G0 ?- u. M5 v/ P' O2 E
  Win32_PhysicalMemory
/ _( V( s. A7 y7 b1 W   Win32_PhysicalMemoryArray
$ c+ O6 U5 R/ x; P* I   Win32_PnPEntity3 t! A' M+ S. U, |4 [2 u0 A
  Win32_PointingDevice
0 ?8 X, V, p2 U' f2 C' _. W   Win32_PortableBattery
4 q( D. ]; h" L% y* b7 K  ]9 L8 q) T   Win32_PortConnector
6 W0 b7 b0 s/ h# P$ u8 s9 a   Win32_PortResource
* f, o3 K# W5 |% N: S   Win32_POTSModem
( Y+ {. Y7 Y! q+ Y  O7 A3 C" b   Win32_PowerManagementEvent
3 L; S0 l: }3 W  N/ U; B9 e   Win32_Printer7 y7 C+ n% E0 {# |  \" t" m) ]
  Win32_PrinterConfiguration
% Q" u3 t# P; d1 i! D( ~+ x( t   Win32_PrintJob5 B7 Z( ~! A( Z5 p6 p" l
  Win32_Processor
7 A; n# ?' N0 E/ i. c- o; r& D# _! V   Win32_Refrigeration
/ s  l! c7 l2 @0 j   Win32_SerialPort
) W( s) ~/ x' f   Win32_SerialPortConfiguration. c6 E& d7 H6 c4 C
  Win32_SMBIOSMemory
7 o9 U# C' j0 ^   Win32_SoundDevice9 ]. H9 \+ w' B3 e% @0 F
  Win32_SystemEnclosure4 _1 [  M  K/ k) h( ?
  Win32_SystemMemoryResource
$ E! w, b7 L  `1 r% M   Win32_SystemSlot2 T! w: N& D- ^7 E* a' U
  Win32_TapeDrive: N8 V3 ~/ j8 H* B" K$ N$ K+ d: Z3 f
  Win32_TemperatureProbe( n0 u1 [1 X) s5 ]% l0 v8 `
  Win32_UninterruptiblePowerSupply
5 k( Z8 _0 |1 ~2 B+ W& D   Win32_USBController
( M4 V: K0 e" d0 L2 V* T' X: [   Win32_VideoConfiguration9 r* w' H% a* R
  Win32_VideoController
' i! d4 n+ `$ `5 x: _& u9 A   Win32_VoltageProbe+ ~) U: p& B6 ^9 i/ h( c# R

7 ]8 F" m* s' u- o  G" t2 n' L以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-23 09:12 , Processed in 0.018912 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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