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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)5 N: }. W2 s+ ^: Z1 z: F

5 f' Q5 |% Q' A7 c  }! J2 `: L+ S: q  w
--------------------------------------------------------------------------------
6 a  b% J9 ?" QWMI: Windows Management Instrumentation (Windows 管理工具)
) T& R, k# C* Q" G" R& ?- z   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ' s: u7 X% f7 Q  V8 U% ?3 ^
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
. E$ w/ e" g/ d4 L) @   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
2 n7 _. Z! h+ c3 M. P( g% }4 D) C" W2 h( G7 s
--------------------------------------------------------------------------------
" W+ {# ^* c% k4 RBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面2 T5 J+ f8 J" V

/ Y$ N8 O1 O: s0 \* {--------------------------------------------------------------------------------
2 U; }% s( z9 O' B* }* t/ \① 初始化 COM 接口:
" l* h( o2 d( c" g) L" ?   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
  ~. a3 A; z7 |2 B/ d   这两个函数在 #include <comdef.h> 里面定义。$ \4 @: M7 ^6 k% o0 y

( M+ C$ j9 i7 J( u& J② 获取访问 WMI 权限:& ]( @; S3 d; [7 v, p2 E
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
( Z$ n$ e& ^9 E. q' L' M4 m   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
& p0 Z% U" x, B+ q2 H
, U2 m* F( K7 g. }2 J4 B& F③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
" A- _: P& J/ W7 A8 ?; {. C   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。" ~  l; F. O0 y

2 d* I' [( x) k3 F, i" M# A1 hvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
4 D, {" {- y7 _+ U{
/ H4 J7 X) h2 d- N8 Q% ~  IWbemLocator *pWbemLocator = NULL;. X, q8 {' s& ?
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)/ }8 ?3 L# p- b
  {: E! u! K, X$ q  [; F$ |
    IWbemServices *pWbemServices = NULL;
. H2 M0 d- J# L+ x: e  H     WideString wsNamespace = (L"root\\cimv2");4 O1 v5 z* F( M: o; c9 Q
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK); x! o, h  Y) J5 ^8 |0 H
     {
8 g9 B  P6 E  n' ]        IEnumWbemClassObject *pEnumClassObject = NULL;1 l/ H& s; P! G
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;# j" @1 l- r5 a" M! l$ ^
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
( q9 m! ]- x2 K, u' t/ Y3 u         {
1 J7 j- M1 `9 ~+ P           IWbemClassObject *pClassObject = NULL;
2 _( S' |5 y/ G# a+ J, x) ?           ULONG uCount = 1, uReturned;4 D5 W; V4 z; S) v5 @" f) U, K
          if(pEnumClassObject->Reset() == S_OK)
3 `- g4 Y* Q, Q5 f+ Y            {) d% i5 }7 Y( V5 V
             int iEnumIdx = 0;. o; N2 J) a: E+ ?$ q# D: }
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
, A4 X5 f  A# g! @' c5 t$ S               {
! V$ t0 U# O: y% j                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
1 E1 J: p  q9 T3 [
# F0 K, N3 N5 e+ G                 SAFEARRAY *pvNames = NULL;  [  N! N6 z& ~* F# r( }
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
1 S# F4 r$ p- L( Q& {- H6 e                  {
* p) p3 K/ l6 I4 ~+ u5 J: s                    long vbl, vbu;
. L! A" ~2 J; V. R6 u0 o# V' k                    SafeArrayGetLBound(pvNames, 1, &vbl);' F' [% |7 K+ ~- t  t
                   SafeArrayGetUBound(pvNames, 1, &vbu);
3 }$ J- R$ Q: K! ]8 |                    for(long idx=vbl; idx<=vbu; idx++)
& i4 }1 U3 r- V2 V1 p                     {
! u2 P+ W+ f0 Z8 p. `2 v! ]2 k# }                       long aidx = idx;
, s) R: m/ ?9 V3 l; t7 a                       wchar_t *wsName = 0;
. D  y6 ]0 t. e' G  b                       VARIANT vValue;6 h" A! R. g. A  \
                      VariantInit(&vValue);
  _; S7 c& ~1 C- a! t                       SafeArrayGetElement(pvNames, &aidx, &wsName);6 A. t( R4 M1 S

7 t3 x4 I! R3 t0 B& \                       BSTR bs = SysAllocString(wsName);
8 b$ w, e- j7 ?" F$ I                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);' `9 _3 q" z( a8 X) F$ n1 Q
                      SysFreeString(bs);
( I4 K, y! h6 y8 A3 W- V# s
/ U1 V" A  |; d& U) ]( L  N- p                       if(hRes == S_OK); u! O/ q6 }% ^9 f9 S3 Y
                       {9 b9 \( g  K1 J& S9 _
                         AnsiString s;
# ^; c; V% A4 l, Q5 X; e  {                          Variant v = *(Variant*)&vValue;
8 {2 }8 j  Q& ~' h/ K                          if(v.IsArray())% q$ f% R1 j  M9 D
                          {+ E$ d4 L! j2 ?; O& o
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
6 M* A# b$ l% s- E' V5 D( z                              {
1 z6 x! p; }% E4 k% j                                Variant a = v.GetElement(i);
4 Q* V5 x9 J' c0 ]$ t/ g2 B7 v                                if(!s.IsEmpty())
# {$ P; T/ O* _, D+ X( h2 B: s                                  s+=", ";0 @9 D& x1 b( |
                               s+=VarToStr(a);
2 b: {! W6 P$ o, R/ }( q- D- l4 ]                              }
7 R$ l  [0 [: i3 r                           }
* q) e+ N3 N( z3 |2 i! [7 }                          else
% }0 `$ j# r" N" L& T* s                           {
- V) T! r, z. t( ?                             s = VarToStr(v);
: l) E& b( |& ~% A' Y) K                           }2 U5 }; i& t% ]) O8 J& J1 n
                         lpList->Add(AnsiString(wsName)+"="+s);
! `: ^0 i5 `! ~7 j$ k; j8 k7 E; q# `                        }
8 D# y8 ^  g- Z: q: C
' z: j% o9 u* `) _+ P  i! p                       VariantClear(&vValue);# k8 W" L7 k. {
                      SysFreeString(wsName);4 j% T2 Q$ Z( z6 L% o- ~% w
                    }- p9 ^) V" o. J/ c( c  H1 [
                 }+ K' C1 O( W- K/ {
                if(pvNames)SafeArrayDestroy(pvNames);1 l' [- E: w/ W
                iEnumIdx++;, w( g6 n1 s5 p: ]! w% y8 g
              }, v+ k7 C7 u. t- |: X1 j. m
           }
5 u: F  j" l+ T, v1 f) y           if(pClassObject)pClassObject->Release();0 B+ y6 P; F: \4 F, M
        }+ ^  D- g0 b9 q
       if(pEnumClassObject)pEnumClassObject->Release();1 m! j1 ]& Y8 S% c9 k5 O4 [
     }% B- F0 T2 L( j6 `' I2 G! N- B
    if(pWbemServices)pWbemServices->Release();
) i: C0 |# _: D, u   }8 E/ x5 W+ z. C+ a. @1 |' u) L3 `2 f
  if(pWbemLocator)pWbemLocator->Release();& ^2 e$ W8 F1 F  G3 S' d
}
, p2 z1 T* l3 |9 A3 v3 \% g//---------------------------------------------------------------------------
& B) v2 Y& G; m+ B- H+ e" F  G! e+ G7 C0 |
// 通过 WIN32_bios 获取 BIOS 信息:
  ]/ ]: O# b$ O( v8 nvoid __fastcall TForm1::Button1Click(TObject *Sender)5 P" W7 C7 l  F% ^2 `; b5 A
{6 \  x0 }' d2 T  ~* v5 w& Z- j9 W
   Memo1->Lines->Add("================== [WIN32_bios] =================");
# M1 \. |0 s+ S5 a$ e( l$ f9 W    GetWmiInfo(Memo1->Lines, "WIN32_bios");
  ~2 H# V$ I) S4 K4 H8 l1 d3 q% Y    Memo1->Lines->Add("");
8 j/ j5 I0 w  J/ E- P}
# z# l. b% N& d$ U# u( F
+ P, d+ j; X4 d: X' ^  R7 |--------------------------------------------------------------------------------
" k0 b* r3 a9 O( b2 T4 B- v: M2 E) c* K. {, T
WMI 可以访问的信息类型有:
) M( b$ r9 s- W5 e   Win32_1394Controller. _  X- ]* U& r# x3 N, u4 s4 m
  Win32_BaseBoard5 i3 D: H# P' v% S. M4 N
  Win32_Battery
9 Q6 {3 C! q! j: \1 u6 i   Win32_BIOS
# n; R$ X6 A3 [- u0 B   Win32_Bus1 ?3 H; Z& l. v7 w0 y1 O
  Win32_CacheMemory/ y6 N  R* q5 X: \
  Win32_CDROMDrive
: G( x" W; q  w, x   Win32_CurrentProbe& n8 @8 u* C; I
  Win32_DesktopMonitor
) a4 j: |& L' O# e$ T2 h   Win32_DeviceMemoryAddress
. E( U$ }# ]- o0 T/ @   Win32_DiskDrive
( R: S( T% t: h9 p" {   Win32_DisplayConfiguration- R3 R9 B2 c0 ?! D1 f' ~
  Win32_DisplayControllerConfiguration  c% ~6 l0 R# {4 V$ X" b$ N
  Win32_DMAChannel' z% R) G, X( m& w
  Win32_Fan
) z& q1 W. g* X, q# q/ e: G   Win32_FloppyController
- T2 a* p0 u' p   Win32_FloppyDrive4 T. U$ J  M2 T5 x
  Win32_HeatPipe
/ c5 S& R/ f, ]: t( b; W/ C- ]   Win32_IDEController' T$ t+ Q$ k# r' s; F5 y
  Win32_InfraredDevice! Z, U, `# T1 I$ Y; p
  Win32_IRQResource
  ]" q8 g$ ?2 x5 e   Win32_Keyboard6 l  o- g  J" G' o
  Win32_MemoryArray# K7 ?6 u0 K: S* U( ?/ m
  Win32_MemoryDevice; D  G4 ^, P# M  q- i! V; n
  Win32_MotherboardDevice
- m+ {2 D6 ?* a; e1 q2 `   Win32_NetworkAdapter
: v. e- I; t: t. o! Q   Win32_NetworkAdapterConfiguration2 j! Q2 v! y) E' C  Y6 M9 E
  Win32_OnBoardDevice
5 u% h* {2 ?; D# p2 c. s# z0 T   Win32_ParallelPort' R2 W9 E, t: q' T& R
  Win32_PCMCIAController- B7 {1 A9 y" K$ z4 K
  Win32_PhysicalMemory* m$ a! g9 J  N% d, \
  Win32_PhysicalMemoryArray
. |$ o+ p6 K& @7 @& W   Win32_PnPEntity
6 W& U6 r5 K( ^- s0 T/ _- f6 v   Win32_PointingDevice8 I5 S4 X5 p3 B: R  C
  Win32_PortableBattery
7 ?% k$ f4 v5 O# `% r$ F( t   Win32_PortConnector
" D' M; m0 n3 z9 v   Win32_PortResource& o' o/ B6 L# l
  Win32_POTSModem4 h1 m2 _5 ~# |8 `7 M
  Win32_PowerManagementEvent
' X% ]- `! N1 d& E   Win32_Printer* x# c! ]. H5 i3 o
  Win32_PrinterConfiguration2 T$ ?. A' t# X. B
  Win32_PrintJob2 \1 T1 U6 t9 s- E6 W
  Win32_Processor/ e9 T! y4 c! O* n; i
  Win32_Refrigeration2 D+ n& H3 t7 j  r
  Win32_SerialPort% [. m4 G7 l3 M
  Win32_SerialPortConfiguration
2 T. J+ V3 M" a! x1 c   Win32_SMBIOSMemory0 {" H0 S8 P5 W# `' B! s7 S) X
  Win32_SoundDevice
5 Q& y! }3 p9 i5 y7 `& Q   Win32_SystemEnclosure
* b( a$ @- }. ^6 P! E& L   Win32_SystemMemoryResource
+ P1 |+ N  X! x/ V5 c- s   Win32_SystemSlot4 H& w4 M4 B1 a
  Win32_TapeDrive3 t' c1 t3 N$ |; I9 A* L6 I, Z
  Win32_TemperatureProbe
% D; M' L' q  z2 g1 P" q- n9 n1 O   Win32_UninterruptiblePowerSupply
. L) w  @3 V( H; p5 f& N. g. h   Win32_USBController% c# o5 X, X6 m+ a) Q. u2 l" x
  Win32_VideoConfiguration# s$ ~, v" x" `  j4 M# [6 a9 ?
  Win32_VideoController
( J' q% i- y$ o6 `$ \0 K   Win32_VoltageProbe
8 |3 j: p3 V, Q* o$ W8 p6 s( V' U% h# }* X$ i3 F( M! n5 e
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-29 16:53 , Processed in 0.019420 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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