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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)% Q" n' i# Q: [: c' Q  k; ~

% t6 U. m; B9 y1 c9 h  x' R+ R7 ]
--------------------------------------------------------------------------------8 F* j1 x  n, H# E- D8 H" |
WMI: Windows Management Instrumentation (Windows 管理工具). X& T2 ?5 C% {" H8 m' E) L& `6 f
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
. M5 k9 @9 z0 {5 N6 ]# S   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
+ r4 L* y$ ~0 L   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 . B) D: K- x) d3 e5 j3 G

' D. E3 |1 u" Y--------------------------------------------------------------------------------
$ G! r9 Y9 L* A" i! }1 GBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面. o, k8 `* [7 }9 I# O5 K+ E4 y6 |3 o

& S) Z( |8 P  |* v. y--------------------------------------------------------------------------------
: S7 j% I% }# Q9 s8 i6 t① 初始化 COM 接口:  y  f5 r: e" f* B! [7 N
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。5 R3 r) @- {- t8 Y5 H- z9 J
  这两个函数在 #include <comdef.h> 里面定义。" V/ @& q7 t& }2 i- z
/ |. Z$ u+ A: p
② 获取访问 WMI 权限:
6 [. Z' i7 T6 P% D/ _3 M2 L   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
9 V" P) R5 Z  G! }5 W( z   如果这个函数返回 S_OK 获取权限成功, 否则为失败。  ]8 k4 P0 u/ p' G0 a5 V
) b$ w$ v/ h' d
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
1 `, `; ~8 E& o   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。* u& O( s$ O( J2 `4 }' {

* |$ U3 {7 o0 I) lvoid GetWmiInfo(TStrings *lpList, WideString wsClass)9 r- {0 L& |. }5 t
{
. j, f5 Y4 l1 p: E8 L8 M2 g  IWbemLocator *pWbemLocator = NULL;' `" x/ c6 j7 Z$ A! Y  I2 ~
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)8 g# u- V; h7 S: _3 G1 t5 G) c/ o
  {& k9 \7 ?0 t4 |7 o9 V
    IWbemServices *pWbemServices = NULL;% P& D' [5 u8 F, E. P9 `" F- d4 \# X
    WideString wsNamespace = (L"root\\cimv2");
- s9 M9 ?4 \1 t3 i     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)' G! T! \/ }& |& ^! s  p
     {
) j0 O$ _7 P3 Q& W        IEnumWbemClassObject *pEnumClassObject = NULL;
( \3 q, S& p- b6 c" H+ G" g4 ]. p8 t" L& Z        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;8 ?) d5 H; j5 ~9 v  j' v
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
- `4 g4 Z2 D& y         {' h; I* @- V! @, b) T
          IWbemClassObject *pClassObject = NULL;6 ^7 R) ~+ O) x+ H: ?
          ULONG uCount = 1, uReturned;
; Z7 }0 u. Z6 j7 j( V           if(pEnumClassObject->Reset() == S_OK)4 S7 s8 E" h: J  d2 S5 {
           {$ G. e8 j# t4 P! e, J9 D8 C- G
             int iEnumIdx = 0;  u& ]- }0 g6 @' Z
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
& N$ r) `; h& [  s4 a               {
$ Z) d  [) {+ \                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
! J* k+ r. I0 f0 k- B6 q5 g  e% T& g  Y7 u! A& x0 K" n( h
                SAFEARRAY *pvNames = NULL;
7 X" ^6 M' ^  u6 f                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
% f! p, }' ]+ g. ~* ]                  {
$ d9 N' V9 d% f0 \. _                    long vbl, vbu;
" r8 h' P) o0 F5 O                    SafeArrayGetLBound(pvNames, 1, &vbl);
1 p4 X8 ^  W2 A                    SafeArrayGetUBound(pvNames, 1, &vbu);
5 v' ?; C/ }0 Z, f) u8 h, |                    for(long idx=vbl; idx<=vbu; idx++)
# X* }3 v. r& _, d% _% j/ c. k                     {
" \9 Z9 c0 a: b) r; ]+ i8 _- h: ^- F$ Z) m                       long aidx = idx;' H- p5 t) g, Y; z' o, W
                      wchar_t *wsName = 0;. o9 Z0 A. v- Q+ K- V% B
                      VARIANT vValue;& I& y. Y3 P2 q$ s7 ?3 `: d
                      VariantInit(&vValue);6 K: V: f1 O# t  w$ h6 v
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
* `) K+ q0 O/ O' v; \: B4 z/ O* M
$ z3 l. h( l$ J+ \3 L8 G                       BSTR bs = SysAllocString(wsName);( Z7 B6 ]/ T. O& a! L# E/ b0 S; J
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);- Z. f/ H# T; J; p, U0 u+ D2 `8 i
                      SysFreeString(bs);
6 c: \- [4 s, i) P7 X  ~  P' {$ ~+ S& c" X3 \+ x. T3 q
                      if(hRes == S_OK)' S# y! h+ }# o  ]; i$ F( {
                       {( P% }; Q( W9 o! o' A
                         AnsiString s;
2 i: r& _$ d+ D6 C# N+ u                          Variant v = *(Variant*)&vValue;# j( s+ n8 o! s2 Y7 O+ F7 q& m/ [
                         if(v.IsArray())% X" Z# |! h% Y* O
                          {3 J" a. q3 ?$ @. e$ h5 ]
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
8 [# ?% b1 |3 x& _4 c. A                              {
3 y% M5 [$ z* d$ {& o                                Variant a = v.GetElement(i);
1 w  m: e* U- u5 L) r7 ?                                if(!s.IsEmpty()). P2 e3 }; B9 ~# ]0 F
                                 s+=", ";" C( p4 r$ ]+ }6 M
                               s+=VarToStr(a);
& s: m4 H% q/ M1 t1 U                              }
+ |7 e* ]' x' ~1 h                           }3 n4 }' ?8 W7 _* I- ?8 }! j( d
                         else
2 P( g# P% K# c                           {9 \% }( j) g9 l# R9 ^. T& [! X
                            s = VarToStr(v);0 }  P4 f; t; H
                          }" @! O7 L2 I5 ^" `( J% O. {
                         lpList->Add(AnsiString(wsName)+"="+s);
  [2 \, _8 \0 n                        }) y- K! M: `6 v
( |5 M. B1 u7 @1 ^) _, j
                      VariantClear(&vValue);2 m! U0 U% W  I5 \- ^- D% O  T
                      SysFreeString(wsName);$ Y, \& j0 [8 ~, B3 \  B1 ]
                    }
. B7 @# a  {0 x                  }  m; S5 R  j8 J
                if(pvNames)SafeArrayDestroy(pvNames);, t( M6 P( |8 K& Q* H/ J& S
                iEnumIdx++;
- g  j" M" L  P' J               }  ~' I/ |8 ~# P! M0 A
           }
2 M% h5 z# T4 `; w% N3 @% h$ K) ]           if(pClassObject)pClassObject->Release();
6 Y1 v+ L- ]. D5 q' \         }8 i; e' p! q" M" g+ m
       if(pEnumClassObject)pEnumClassObject->Release();
1 V: p3 x' |# G( _/ Y      }
  R( F1 \, M  h- l/ s! E     if(pWbemServices)pWbemServices->Release();% h: _2 J4 N2 ~, G
  }
! m; i# {! E7 Y4 a6 N& f0 h/ z  if(pWbemLocator)pWbemLocator->Release();7 |+ x6 Q& M) d1 Q7 N
}# N. K) {/ i) H  q% _# u! Q
//---------------------------------------------------------------------------
* G  V0 {' v) v/ C$ J. Q4 K2 l5 l! w# P
// 通过 WIN32_bios 获取 BIOS 信息:
$ {5 O, z, ]/ D2 x, rvoid __fastcall TForm1::Button1Click(TObject *Sender)0 e) _5 r+ S. `
{: H5 o: l6 I3 ]
   Memo1->Lines->Add("================== [WIN32_bios] =================");
8 c5 ^* [% Y2 J    GetWmiInfo(Memo1->Lines, "WIN32_bios");
" r4 Z6 ]$ }9 ^: y, U* ~8 E    Memo1->Lines->Add("");
5 a- D% ^1 ]' G7 P7 E}
3 u$ m8 c. w& d4 d' ]) E3 S* K- d9 V" `% |7 S5 u9 W/ F1 y2 p
--------------------------------------------------------------------------------
' L# _7 a) d" U7 R* n
4 |* I3 a) E& G$ @WMI 可以访问的信息类型有:2 R  l9 Y2 F) d5 O, P) q: D7 h
  Win32_1394Controller
; _. d9 S9 D1 p0 Z) I$ Z! Z   Win32_BaseBoard" m" J, F- Q1 M/ T& M
  Win32_Battery
: n( K: r0 h: r- y   Win32_BIOS, ?" r0 c3 Y/ k2 n6 }6 h3 i
  Win32_Bus
& n" O2 l0 m' T) M& f  W! o) L   Win32_CacheMemory
3 f/ w. Y9 b/ Z, e   Win32_CDROMDrive2 ]4 y, X/ @$ R
  Win32_CurrentProbe, ?8 U5 J, K$ t6 N
  Win32_DesktopMonitor- n8 ?- i5 G. n
  Win32_DeviceMemoryAddress
2 g: Z5 X& R6 N' G   Win32_DiskDrive
' {: K# ^9 M( n/ N3 S! P1 w" }2 d2 W, d   Win32_DisplayConfiguration4 l  `$ c3 J5 |2 K3 E% a3 K, \
  Win32_DisplayControllerConfiguration
" e4 J! z3 l. @9 c# _4 g   Win32_DMAChannel( _# t7 V8 ?0 [% a# j) n3 u; H
  Win32_Fan$ h# l) q; |! r) i0 j
  Win32_FloppyController% p* L& c. P+ L
  Win32_FloppyDrive3 ~" L7 z0 o" d; ]: ?  @6 ?  M" b
  Win32_HeatPipe
( d0 h) a$ M6 a- g   Win32_IDEController# d5 n3 E% ~  T/ v! W
  Win32_InfraredDevice
) m0 q4 J# @, h# y) R   Win32_IRQResource
2 h( s0 v1 a8 k0 [9 x6 @) h, B   Win32_Keyboard- |( A& ]$ s3 P; b5 h
  Win32_MemoryArray( i2 g8 ?; R5 d2 [1 l
  Win32_MemoryDevice
5 Q- ]9 L) c9 a9 {" @; l' f# e   Win32_MotherboardDevice
( K6 W9 y# p$ @9 Y   Win32_NetworkAdapter" ^7 E/ M+ |" ^
  Win32_NetworkAdapterConfiguration
7 ~! ^9 Y! Y8 [: v' v   Win32_OnBoardDevice
8 R/ \% O+ z5 E. Z   Win32_ParallelPort8 q1 E& ^. D5 O& G/ o+ [
  Win32_PCMCIAController5 q( m, g4 U0 Y' p6 D
  Win32_PhysicalMemory
0 N0 P0 \; H0 o& J: m% U' q' h   Win32_PhysicalMemoryArray' b7 O  o( j# m. f
  Win32_PnPEntity
& Z+ P3 N7 s% u  i   Win32_PointingDevice
, R. Y5 g  O7 y. K   Win32_PortableBattery
+ u3 k1 C. X$ |( H   Win32_PortConnector
# i9 Q  v$ N% h   Win32_PortResource9 g+ Q' g" f, E8 c
  Win32_POTSModem) F* F* V( `% Z% i+ \
  Win32_PowerManagementEvent. I9 p. Q+ z& J' K$ V
  Win32_Printer) w9 w4 p5 [, `" p, _
  Win32_PrinterConfiguration
: P, Z, E2 ^  Z   Win32_PrintJob
2 n4 ~: J& l# j3 @1 C2 w. v& e2 k   Win32_Processor
! ^4 g/ u+ B% x) J0 D( P/ ?2 c   Win32_Refrigeration( c: Z8 [& Q* i" e
  Win32_SerialPort- m5 I5 M7 \4 e: L" d$ e
  Win32_SerialPortConfiguration
, o) S$ {! n1 w& F4 @# z   Win32_SMBIOSMemory$ k: b7 C. f: X/ Q/ j. I4 |
  Win32_SoundDevice7 [, H6 Y* Z2 ~- c5 y
  Win32_SystemEnclosure5 O6 |9 O& k* e' x
  Win32_SystemMemoryResource+ ?9 e$ T  F, l6 {* o# m
  Win32_SystemSlot/ a% c4 f0 h) W- g0 S1 q
  Win32_TapeDrive
! P: h; Q6 k+ d( F. N! Z+ N   Win32_TemperatureProbe
) @% G2 p) e7 G" z' f0 r   Win32_UninterruptiblePowerSupply. {, s5 Z3 X1 R& _3 V
  Win32_USBController2 R0 |% \2 q. _4 k9 m5 ?% c
  Win32_VideoConfiguration$ E4 x% r0 j5 c% y# s
  Win32_VideoController
( `5 y# d6 S  \; |  |   Win32_VoltageProbe
9 _& h, z  B8 k8 G& |9 W' x, [) o
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-17 14:37 , Processed in 0.020786 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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