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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
- s# t/ K' p/ S/ X- l' G6 _* `3 m7 j

- i, T2 r2 S# m  a8 Y--------------------------------------------------------------------------------, p$ h$ |/ [) l# d
WMI: Windows Management Instrumentation (Windows 管理工具)
' N3 P4 ?1 x$ u& a  z   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
4 h6 T7 j* C, A* ~1 d   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
8 P5 X/ j  O, w+ r   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
+ {3 W. y1 I8 t% q) A" u! j" j9 Q1 J0 C$ M9 o+ u: H
--------------------------------------------------------------------------------
' E" ^& a4 ?3 a/ w2 K6 iBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
3 b# ~! J- D7 Y6 j5 V$ v* D8 y* f1 t1 _& Z9 J- Q
--------------------------------------------------------------------------------$ c1 r7 b% Q" v/ E5 F* a2 p  @
① 初始化 COM 接口:
2 Z. @, s8 h+ d( F  T. K7 y: o8 u: ?! A   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
9 k5 b0 |) R$ b% s1 }% M   这两个函数在 #include <comdef.h> 里面定义。7 X; M  Z2 D9 @- c
2 D( \+ C7 K1 F. N
② 获取访问 WMI 权限:
# {/ I5 F" s% q) i4 z   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
3 d4 B7 k$ Y- @4 t* w/ |5 ^) O, i   如果这个函数返回 S_OK 获取权限成功, 否则为失败。. O: A0 g7 O, \) |. N0 i8 P2 ]

& s, N( Z4 {2 D, ~: @: c③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
, @' b3 |( \( k% V( f* @; o0 D   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
: l$ L' A+ L) J) g, N3 a' q  z0 J$ O$ m  W
void GetWmiInfo(TStrings *lpList, WideString wsClass)
0 }9 e0 C% ^" @1 T* C3 }{
* i, U2 r5 Q& I  IWbemLocator *pWbemLocator = NULL;
9 q, ^) {) q; \$ f. C  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
6 B* O1 h! ]. K1 ~! e) V: ?   {' j" @, ^, G! m( y4 Y5 v- Y2 U
    IWbemServices *pWbemServices = NULL;
) O# `! U( E( z6 C' t5 Z     WideString wsNamespace = (L"root\\cimv2");  z* F' @  ~" @5 q, C9 y1 ^& G( f. _2 x; u
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)$ H' Z: t: h  Y% T
     {
4 R, ?+ [- m; F/ ~        IEnumWbemClassObject *pEnumClassObject = NULL;
- C% ?5 D! l7 p% a        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
; p: i9 m' R' ]- S        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
/ `# N. }- O; r- E4 }  v+ ]8 ]9 l. r         {6 k% M- \$ \4 R  ^0 K
          IWbemClassObject *pClassObject = NULL;
9 t8 X0 h. F! Q) O# _0 H           ULONG uCount = 1, uReturned;5 H2 [- G# [. p' H7 D" |5 o
          if(pEnumClassObject->Reset() == S_OK)
* d* `' \  f7 t: B6 x. i) j- c            {
( N( t' C2 H5 e, `! o  _' l# n              int iEnumIdx = 0;+ T' R/ q( i; X
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)% O. H7 u$ |1 n1 a
              {: A9 q1 f! O  g
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");1 c$ o) H" F( k1 a. g* B" u( |

9 Y" F8 i! I9 _& H! d( I& ?                 SAFEARRAY *pvNames = NULL;
. l! }4 r  d3 R7 h+ r# t                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
3 f2 }& T9 t6 P6 P& Y( F' f) K7 N3 ?                  {0 x0 E0 b5 o3 S" i0 u- q2 l0 e
                   long vbl, vbu;
/ p- a4 L& a' M- Q6 _3 n% T% g6 |                    SafeArrayGetLBound(pvNames, 1, &vbl);
' Q7 Q" [& {1 `4 Z( l0 D                    SafeArrayGetUBound(pvNames, 1, &vbu);. H& a1 T. j, G, ^/ C4 f
                   for(long idx=vbl; idx<=vbu; idx++)2 w5 B- K# [! h5 H: t  C" \
                    {
# N+ }, w+ l4 u; x7 ^9 o                       long aidx = idx;2 @) d6 P8 u0 A
                      wchar_t *wsName = 0;
/ I* R5 G$ P+ q+ J1 p5 @; K, X                       VARIANT vValue;
9 }; L8 ^7 |5 g% R                       VariantInit(&vValue);, M" J( n6 o6 T* n( t& R, X
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
8 L. _. D: J5 ^7 M4 }6 z" O$ g& p% a# [; n
                      BSTR bs = SysAllocString(wsName);
$ T+ u+ }8 I4 {- F# v! h1 z0 V6 ]                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
3 q* u5 Q; N" R' x: a7 L2 t                       SysFreeString(bs);5 D, y+ M8 j7 N! O/ ]) X
* ^6 g7 m6 T7 z" a7 H$ @) y) c
                      if(hRes == S_OK)
& {" {# {2 \# k3 \                        {
% _3 @8 q. ^8 p3 Z9 O3 t" E2 s3 [# P                          AnsiString s;
$ h+ P) k0 s2 F3 f. r8 Y( a                          Variant v = *(Variant*)&vValue;1 ?0 r4 ^  n! f7 n- P  q+ y- D
                         if(v.IsArray())
% P; o* X' a& [) L1 U9 j; I                           {
1 l7 U2 A) G0 J                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
6 A$ c9 W5 I/ V  b6 Z( Y5 ?                              {& C5 s$ Z1 j4 w  O) j) ^; [% x
                               Variant a = v.GetElement(i);/ p1 u  {$ z+ @! b- n: k! V/ @1 r% j5 e
                               if(!s.IsEmpty())! ^# O3 x' S; ?
                                 s+=", ";
; U5 I2 C0 M& k1 z0 e. `                                s+=VarToStr(a);
! j8 Q  z, s3 y  K, H                              }
' u0 V) C/ Y4 D2 ~                           }! O4 a5 t: s7 i2 h3 [4 l" \1 @# X3 u
                         else
; Y, M1 d: q8 r                           {
" T5 A# m0 D& H' f9 r                             s = VarToStr(v);! ?5 L6 E2 S) m/ M
                          }: V$ v" H& j. i& r. I1 E
                         lpList->Add(AnsiString(wsName)+"="+s);
  y0 q, A9 i; n  B9 I& `- n                        }' B- Y' x5 k) \8 V3 U* h5 E

. C0 f" O. @5 A. ^* ?( a                       VariantClear(&vValue);# A& o8 a7 k) H/ q1 H' M
                      SysFreeString(wsName);# x, m5 X8 X2 V7 z" I& J
                    }
" l4 A) Y% y3 o( `: o% g                  }( B6 \& k0 L( w# W7 ^& o- `( l
                if(pvNames)SafeArrayDestroy(pvNames);; w" i/ s% M+ Z; W
                iEnumIdx++;# t) e  C0 B3 ]9 s: o) X
              }! L# x, s3 V& G! `$ v) w3 C# L2 j% f* \
           }: O% e, i5 C' G
          if(pClassObject)pClassObject->Release();
- P3 p0 \( n' Q( Q& a         }
: X: H3 }7 c/ J7 p        if(pEnumClassObject)pEnumClassObject->Release();* _, Y' ]) \  n7 c
     }/ s+ G8 e3 |, g6 a
    if(pWbemServices)pWbemServices->Release();
% [5 j- a. J7 j8 Z2 v: r8 f   }* {/ {  v3 w/ f# l8 a) a. _
  if(pWbemLocator)pWbemLocator->Release();( x6 l* y& p! n# M# k2 @& e
}
& p* q: f/ M- W- N6 r2 l//---------------------------------------------------------------------------& \; F8 b1 X8 K

' V. W; n; |* ?4 Z: b- r$ d// 通过 WIN32_bios 获取 BIOS 信息:; o) E( t3 k. X$ B/ H# t# V. ]
void __fastcall TForm1::Button1Click(TObject *Sender)
  O# S$ m- g* ^; Y: ?- z{
' G0 W% w; [8 n9 E    Memo1->Lines->Add("================== [WIN32_bios] =================");, b/ x$ x+ h" z) M4 H- O
   GetWmiInfo(Memo1->Lines, "WIN32_bios");5 v% ]" E# A& Q5 P& i5 T5 P
   Memo1->Lines->Add("");: ]9 I5 {, c0 C; l6 [
}. w8 |+ b8 ~, h2 G8 ]
. W; V. L/ o& O8 t/ e* y; k0 o+ X
--------------------------------------------------------------------------------& m" r$ B8 |8 g* B/ x

  W. ^/ E7 s- J& lWMI 可以访问的信息类型有:+ q" f5 y2 f/ g  x* O! O( _9 J. R
  Win32_1394Controller. ?0 q  e$ i0 T
  Win32_BaseBoard
- S2 Z3 F3 a/ U, Z. D6 |, d   Win32_Battery
& `# `$ u) j! I+ J: J. p/ P   Win32_BIOS  D7 ~8 c$ F% O) W) A& o9 \& l$ B9 O+ j
  Win32_Bus( P/ j' z9 f) P) c: s/ o
  Win32_CacheMemory0 p, ?/ P# [- z3 [4 u+ `6 W- i! X6 F
  Win32_CDROMDrive. G) G, z7 H- z- f- \  L
  Win32_CurrentProbe" |! W0 F$ E- U/ q0 f* D
  Win32_DesktopMonitor0 s" G, T* t  z# N% L, [$ G
  Win32_DeviceMemoryAddress0 ~) ]4 q) P9 X! z: ^
  Win32_DiskDrive
6 s/ G& l& `6 ~3 e( J   Win32_DisplayConfiguration; B/ n- a/ d  C5 ?
  Win32_DisplayControllerConfiguration
1 c& ^! [  b  `  Q   Win32_DMAChannel
. d& l; w) w7 r5 U! ?7 c3 c   Win32_Fan& ]. T+ a( v( c+ Q7 }; y0 Y
  Win32_FloppyController
: R9 a0 x$ F0 r   Win32_FloppyDrive9 }4 b6 |$ w6 y
  Win32_HeatPipe
. X( Q; A, S' e" N# u, M   Win32_IDEController
6 W' O" B' l' F4 H0 M1 ^; b   Win32_InfraredDevice
$ d8 n. A" O' q- b8 ^   Win32_IRQResource2 }- A1 D/ A4 H% g- B' }
  Win32_Keyboard
% n3 e' G$ v6 V; u. |   Win32_MemoryArray
0 k, j+ ~3 |! Z) T  m   Win32_MemoryDevice
3 z, f2 \; [" P4 j% |7 K   Win32_MotherboardDevice
3 v* k3 {, e6 e5 A) B0 F   Win32_NetworkAdapter' w) N& D' v( |6 Y
  Win32_NetworkAdapterConfiguration$ K, d% Q  i6 P5 ]9 M0 N
  Win32_OnBoardDevice; f0 k0 w- }& L' A7 x
  Win32_ParallelPort, p& D' U* g0 T% Y- e. u; k
  Win32_PCMCIAController1 k& A" H) T/ j4 H' S; k
  Win32_PhysicalMemory/ W5 d/ F1 V3 G: r' d
  Win32_PhysicalMemoryArray4 G9 B( n3 Q/ z8 n7 {" C# ], Q
  Win32_PnPEntity
3 x  T/ O9 d) m7 t' f3 Y   Win32_PointingDevice
! f7 L1 `4 p" o6 I; A  L   Win32_PortableBattery, a3 {- h8 |& m3 M
  Win32_PortConnector
3 V- R/ E! Q5 J3 [3 z% E3 i% _9 Y6 a8 P   Win32_PortResource
/ U7 v% a: R! }8 y8 @8 q   Win32_POTSModem; Z, [/ Y) }) w2 ]; u  ?0 x
  Win32_PowerManagementEvent+ U( s! H, q5 S& T. }7 y
  Win32_Printer
3 Z- m# r9 Q+ x# V   Win32_PrinterConfiguration6 L3 f3 _" o+ C2 k/ A* c7 \3 e
  Win32_PrintJob" o5 L, r. d! `, c6 t
  Win32_Processor: e) N- J2 C0 b9 J6 ^
  Win32_Refrigeration1 Y% h& I& o, C
  Win32_SerialPort' c$ j3 p* x* z
  Win32_SerialPortConfiguration
" S: }1 R4 C  @- e( t! ?' Q   Win32_SMBIOSMemory9 m' e7 y! j$ k8 y5 E$ n$ l
  Win32_SoundDevice
- Y& O5 i! o4 _1 l5 L5 @1 e+ ]   Win32_SystemEnclosure0 W# j7 `# ^7 R, l- t
  Win32_SystemMemoryResource
& y& r& ~! E: G8 G& g: W/ _   Win32_SystemSlot8 h, o9 m$ Y/ Q% E
  Win32_TapeDrive
2 O7 ?' c: W5 `* J9 r* ^. E   Win32_TemperatureProbe
% [- B' M- u  T( e8 {   Win32_UninterruptiblePowerSupply
' E7 g5 \  [: F3 K5 f   Win32_USBController
8 l+ ]; ~2 ?3 x% R1 Y$ N8 K   Win32_VideoConfiguration
1 w" b, P9 l* Q5 l- o- R& ?, j, e- O   Win32_VideoController
% T6 q& C8 S9 a7 Q& r   Win32_VoltageProbe
3 t1 M. g  _$ J; s
& g. N; |3 T4 Q: Q以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-20 19:30 , Processed in 0.021936 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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