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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
- Y2 G( p: K' e1 B- l/ N- Y  F
9 N4 y9 G( V3 Z9 R/ E- `
--------------------------------------------------------------------------------
- v- V9 Z- \' aWMI: Windows Management Instrumentation (Windows 管理工具)
2 [0 U7 C! Y5 _4 r: @   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
! }7 v* n& V1 B! i   利用这个工具可以管理本地或客户端系统中几乎所有的信息。' |$ M: M& T) K7 X% ]$ N( g7 a. d
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
( N. t# Y7 O3 t8 r( M9 o3 j" q1 e& G6 j# p  s% ?" z
--------------------------------------------------------------------------------& Q! b* ~6 y& l
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面& s, b/ e: R$ W. z% k$ v* x0 s5 Y
. M( L' z3 ~0 q! |
--------------------------------------------------------------------------------6 J0 M4 n( {- `& i9 x( X0 u; m+ X
① 初始化 COM 接口:
5 x5 y9 x' l9 z# G   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。1 Y0 r, b9 v* _; O7 v! r" r
  这两个函数在 #include <comdef.h> 里面定义。
+ C# C6 x, Q, B/ w2 \
4 k: X8 z' M' o3 z: j② 获取访问 WMI 权限:/ K4 M/ \- r5 p9 ]8 Q$ ]
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
3 Y( q$ y/ R2 `, x* A* e   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
9 X0 h) I4 N# W. t9 }; s9 G6 P% n, V) ?. `$ o! `; r% q
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:- y+ L" }7 |: ~0 V6 F- v  ]
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。9 G* W  P8 m  q6 J, {

7 I' r, y, m9 |5 r' i$ a% ?void GetWmiInfo(TStrings *lpList, WideString wsClass)! K/ I  m2 X/ C0 h
{& y# R: e; P" p' B' `( Y1 F
  IWbemLocator *pWbemLocator = NULL;) g1 ]1 M3 \/ Q; s& J8 F
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
4 v5 d: I- u  x# D: l   {+ w- c9 @! ?, A% N$ V5 @% }
    IWbemServices *pWbemServices = NULL;# b3 ~: n& [+ s# c
    WideString wsNamespace = (L"root\\cimv2");  A2 a+ M8 ~+ a9 A% \. ?+ z
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)! P2 G& }8 \  Z7 `
     {
& E  d9 h/ x! t: Q! ^        IEnumWbemClassObject *pEnumClassObject = NULL;
) O1 m' s# ^6 L        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
! W$ Y! S. j# }: k' I# l        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 e' S. }) B. p( f0 m5 k         {7 z$ z7 Z$ i0 t+ O9 g
          IWbemClassObject *pClassObject = NULL;# F; w; i* `+ G& I5 l
          ULONG uCount = 1, uReturned;, ~' s4 m# p& B" g& P3 |
          if(pEnumClassObject->Reset() == S_OK)* |  j8 x1 T( U9 [- S
           {' T2 m! _8 U8 D/ ~( L
             int iEnumIdx = 0;9 P% B, h  t. k9 ?/ I  t
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)' j$ ?) s2 B* s% N) ?$ d! Y
              {
* `/ q8 Z' ^0 _* V% A                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");9 w, [+ [+ e0 |( l1 R# P* M0 N8 I
) M' T2 B, v. |
                SAFEARRAY *pvNames = NULL;
$ W5 f: l* {8 C                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
  M3 p  D; X5 f! Z) T                  {- d8 L1 ^+ t  N3 e6 v
                   long vbl, vbu;
  J8 `9 Q7 n4 {/ I, n                    SafeArrayGetLBound(pvNames, 1, &vbl);
, U- V* d) x" Y                    SafeArrayGetUBound(pvNames, 1, &vbu);; j( j! a0 F  @" @& B2 i( X3 T" q
                   for(long idx=vbl; idx<=vbu; idx++)& ?& F4 e( r+ i; e) ]% L& {* X
                    {
' L5 m. q3 H6 o/ J/ X; M. B( \                       long aidx = idx;
8 y3 p* g( F# }* q                       wchar_t *wsName = 0;- S- _+ ]9 V3 i# n( A2 U
                      VARIANT vValue;
$ x, m0 a/ ^, _2 B                       VariantInit(&vValue);
+ n# n+ V9 N) d) y5 @1 e: Z! A                       SafeArrayGetElement(pvNames, &aidx, &wsName);
- v8 d) t# U4 E* w, b; p( X' @. y1 o* _: K6 {
                      BSTR bs = SysAllocString(wsName);6 j& Q; w- D& l8 z  \
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);& t+ ]9 [6 s$ x/ g2 A
                      SysFreeString(bs);
) [: c% E$ r+ e, C3 H4 ^
) J7 {" x& [! [3 g1 O$ a: L                       if(hRes == S_OK)
9 A! T* ]) s6 v, O9 K                        {% {* L+ m0 m: T  k( M; ], n1 c
                         AnsiString s;# s% g4 D' A8 o- O
                         Variant v = *(Variant*)&vValue;/ t. S; W& F# s+ P, B3 q; E
                         if(v.IsArray())
; U  D5 I, z9 }! C; y. W                           {
  q1 Z; Q1 K# ^% Q; a                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)2 K# P$ f0 ?2 g; t" z) u
                             {
: c4 a( H% k7 M3 ?# [                                Variant a = v.GetElement(i);
& O. r, i2 K. W* O5 B9 k, ~' v" D& F                                if(!s.IsEmpty())7 ~9 Z2 g6 f! D# ~2 Y4 a* @& _
                                 s+=", ";/ ?* _& Y( w" G, s; @" h
                               s+=VarToStr(a);
7 ^: P. \5 a: _1 Z7 H; u                              }& {( U; N5 F6 G& G6 W
                          }9 Y, `) d6 a# r- M" s  g
                         else8 J6 Z) t9 q9 k% A! o0 D
                          {; }0 Q8 @/ O2 g
                            s = VarToStr(v);
2 _6 T4 c' k5 H4 t1 @! Q9 l/ n/ E                           }" Z6 w" s* M) U5 N
                         lpList->Add(AnsiString(wsName)+"="+s);
9 D: t: |) v- W                        }# h3 T$ w/ B7 @- T& f
+ j* u! K% I1 L5 y  P0 S' h
                      VariantClear(&vValue);
* u7 y( L% J% G1 r2 |                       SysFreeString(wsName);
* |1 k- }* I/ b# m, h0 s% e                     }
) v5 T) W( {% X8 s                  }
# S: M$ c. K; G/ w- M4 }0 Q                 if(pvNames)SafeArrayDestroy(pvNames);' {6 \+ M  l' Q# i1 T6 C" G
                iEnumIdx++;+ K& O6 l  ]- P! @& T9 L3 V
              }
( n) j  X' O1 j% }+ J            }
  B. d8 e1 i3 F+ L5 y$ C% ~           if(pClassObject)pClassObject->Release();0 d8 O) a% V" e$ v9 n, C: C
        }! Z7 g0 V' j9 {) ]5 B7 B: i
       if(pEnumClassObject)pEnumClassObject->Release();7 P8 A# J* R# L+ p
     }) U8 D1 N' N- {* p, R! m
    if(pWbemServices)pWbemServices->Release();
+ }; p# F/ D  S   }
+ b2 S2 Z( `$ J% f  if(pWbemLocator)pWbemLocator->Release();
! |) j& I: f* Q) V8 w0 \}
2 }! U  b( d" o$ ]: ?3 i! Q% t5 g//---------------------------------------------------------------------------* ^5 x( D( T/ {- R& N
( T' A9 y: K: Y# r. O6 o
// 通过 WIN32_bios 获取 BIOS 信息:9 H) `! v) w* d  y; s# N1 h; C/ i
void __fastcall TForm1::Button1Click(TObject *Sender)% f- B# ?. p; \) q& t' _0 }5 Z6 o& ^
{
* ~, ^1 |: v: w    Memo1->Lines->Add("================== [WIN32_bios] =================");
+ A4 b; u7 s% U$ {' f9 c    GetWmiInfo(Memo1->Lines, "WIN32_bios");
6 n7 h8 l# |4 }' K/ {0 Z- U- U) C4 T    Memo1->Lines->Add("");
2 {1 G" c4 X  E  R}/ j2 n) {* U9 j# g! t* X% l

3 [# O5 |  c* z0 f. T--------------------------------------------------------------------------------4 H1 k) R& m7 |& @9 i. J: \
7 K# m: _8 d1 c. Z& u
WMI 可以访问的信息类型有:& l! p' ?+ @- W/ u; V  H9 |; c
  Win32_1394Controller
7 ~3 D1 i3 R$ B3 @: p0 k   Win32_BaseBoard
3 W2 ]' d" i! Q. g5 y+ y9 a8 }   Win32_Battery  h3 j0 y3 q4 A
  Win32_BIOS
; I- C. d3 j' x0 `) G+ v/ e9 z   Win32_Bus) a9 ?# S" N$ r! `* E9 d
  Win32_CacheMemory' L9 U+ x7 }& n5 X( Z- w
  Win32_CDROMDrive
( @4 ]' [$ j. R% Z; k   Win32_CurrentProbe, Q/ a% {; s0 ^5 s
  Win32_DesktopMonitor
0 D! S. _, g0 Y; [   Win32_DeviceMemoryAddress; i1 j4 U: u/ i; N7 A, O% m
  Win32_DiskDrive- k; P! n+ S# i
  Win32_DisplayConfiguration
6 n6 i9 U! W9 N   Win32_DisplayControllerConfiguration) q, R/ k3 i9 |" J# X
  Win32_DMAChannel& k  W  c% D! M4 W5 z2 b
  Win32_Fan1 Q' X1 j5 A1 j+ W, h3 j# A
  Win32_FloppyController
, _5 c' s# q) X' t   Win32_FloppyDrive
7 y1 u, A  k; d" s/ H2 G   Win32_HeatPipe" h5 |( x7 [, D
  Win32_IDEController
( q0 l, H) }; a* t% V   Win32_InfraredDevice
! q$ O* }7 R! F! F" d+ z   Win32_IRQResource
# T# p2 w4 a/ E* H   Win32_Keyboard
! B0 c* B7 b+ i8 V' g+ g+ E3 o3 K   Win32_MemoryArray
9 X. a1 W( a7 \( s' W6 ^   Win32_MemoryDevice. u' ^/ s% j7 h8 Q# s6 C
  Win32_MotherboardDevice
; E9 T+ U2 G/ d" N   Win32_NetworkAdapter
# x4 U  }1 v# |5 `! y   Win32_NetworkAdapterConfiguration. F3 }2 |, O  ^! s
  Win32_OnBoardDevice( h  e+ T+ I" G3 i0 }$ H4 p
  Win32_ParallelPort
# N& a" r, _, a4 m+ g   Win32_PCMCIAController& m# s( p) H( Y& r( ~
  Win32_PhysicalMemory" r2 }/ P8 t3 ?2 H9 n9 i
  Win32_PhysicalMemoryArray
: a! s6 j. H2 g) Y4 L$ x' \- R   Win32_PnPEntity
7 J# L  c6 R* i! s- y& s6 J% s   Win32_PointingDevice  S( _4 e4 J) S9 F# o' {
  Win32_PortableBattery
7 f* t5 ]- }: q! d- x7 @4 I   Win32_PortConnector& F0 ~1 X5 s! q& d- L  F
  Win32_PortResource( d' S, G" S7 m  @* b* p2 @9 S
  Win32_POTSModem6 y. G3 ?8 H( i& Y
  Win32_PowerManagementEvent# K: e5 }, g# _5 u' ^1 [0 s
  Win32_Printer0 H* ?8 V! u* O1 |2 R
  Win32_PrinterConfiguration" t8 p6 R8 E5 ?  t* F' c
  Win32_PrintJob8 E  H: }: l  a7 W
  Win32_Processor# T2 @) r; \  j
  Win32_Refrigeration' J1 o+ n6 P; p, ~: Q
  Win32_SerialPort
6 K9 x( ]& b- l. ]8 i1 G; u   Win32_SerialPortConfiguration3 C0 b2 N0 n3 Y& m4 J  _
  Win32_SMBIOSMemory% Y/ W! u/ ]  `3 @, s5 o6 R
  Win32_SoundDevice( D; \4 Y! }$ l
  Win32_SystemEnclosure
9 {* p3 f0 I8 m3 s) `0 w   Win32_SystemMemoryResource0 b- a/ z$ K/ @  }' _
  Win32_SystemSlot
; j/ @- X/ }  }: z! [   Win32_TapeDrive/ E. H9 f1 k6 n+ B
  Win32_TemperatureProbe; o5 e2 q. W: i5 ~
  Win32_UninterruptiblePowerSupply- G$ }1 S9 d" i( ]
  Win32_USBController
! I, z# r* H. I. g* T  k   Win32_VideoConfiguration
/ a" a6 J) W( H5 O   Win32_VideoController
% @$ }- K6 h( g: d9 _   Win32_VoltageProbe
% e! [6 t/ J7 V& A* O8 ^6 W- R4 n( L( O# M- q
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-23 23:08 , Processed in 0.020047 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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