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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
* c: [; `( O" B! q# o
% Z7 a/ j4 a. C, `" v0 F, U9 C
1 z8 O4 ]6 w, P- T--------------------------------------------------------------------------------
& R# l, ?5 y4 D+ kWMI: Windows Management Instrumentation (Windows 管理工具)# U, Z+ l$ h# s2 i; L2 R
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
$ R: ]9 _3 ~- [5 R, ^3 l   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
  D% {; P# }" u+ B" D   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
6 N$ G! |8 ?! E% V) ^  h" w0 f! G. e
--------------------------------------------------------------------------------! L  N  v' J# n* q& K, e% ~6 D
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
; d7 M5 ?5 d- b# z, B( ~" p# F& Z. R) T
--------------------------------------------------------------------------------. a4 Y/ b% ~$ s1 E
① 初始化 COM 接口:
8 L6 R* V0 ]) y) V( g& ?   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。( c! _0 R- v( N. V& A8 v
  这两个函数在 #include <comdef.h> 里面定义。- Z1 G$ Q7 k& x$ r

  ^* F+ K7 W, l1 E② 获取访问 WMI 权限:
  s' s" J  y( Q% u: \   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
- n& S; n& U! [/ w' V8 e   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
$ r! G+ {; o3 E/ M0 i" @9 D+ \& \! N7 X+ D: M
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:5 ]& U. y8 L# M+ w# a: m: f
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
# z1 P5 B) D9 Z+ v7 J7 d1 I& w8 b$ Y1 F
void GetWmiInfo(TStrings *lpList, WideString wsClass)  M4 F$ L3 p; o0 ]
{( Z* r6 U. t% h' J  K" E, }
  IWbemLocator *pWbemLocator = NULL;; d5 T* |5 r7 t+ e: k- R. E8 d) |
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
# ?& b* ^# s' u; ]4 x2 |   {2 `9 h4 K7 k0 L" ~/ ]
    IWbemServices *pWbemServices = NULL;4 y& o( y- }5 ?* L/ [1 I
    WideString wsNamespace = (L"root\\cimv2");/ S/ w! C9 U; d, h  o
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)$ E6 ?$ T, d1 n
     {* B$ ~) j; v3 ~3 y3 R; q+ [1 h7 m
       IEnumWbemClassObject *pEnumClassObject = NULL;1 h5 Y8 T; E( \# S
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
# U5 H8 z! m- e        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)# Y8 G. J, O5 W
        {1 L  s7 |# n' _8 v  Z
          IWbemClassObject *pClassObject = NULL;: h+ a- Q* q7 r' B
          ULONG uCount = 1, uReturned;: _6 O' ?, x( C% P& o
          if(pEnumClassObject->Reset() == S_OK)) C( }) m1 u' o, f, P
           {
2 l# L& p6 h  a6 ^% W8 Y' @0 F              int iEnumIdx = 0;
& {- ~' `; J  l! |              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
( k0 Q! Q. L2 n! R0 x1 M               {+ U8 [/ T# b. I
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");8 d) c$ ?! _, Q' Y* N* o
# |+ m2 m0 J: N
                SAFEARRAY *pvNames = NULL;
2 ]' L# h0 W, }0 H: y+ }. C                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)4 W/ [, f9 Z' h  a% J% k
                 {# X# I+ R) t  D
                   long vbl, vbu;
1 f" f6 g9 N2 u$ a7 z; R) R                    SafeArrayGetLBound(pvNames, 1, &vbl);
% R$ \/ f- |% o4 m                    SafeArrayGetUBound(pvNames, 1, &vbu);  f$ @1 N, `5 M; T
                   for(long idx=vbl; idx<=vbu; idx++)! ^( N7 O) X, v& B
                    {2 q3 ]0 V/ H4 P# `- o6 W- Q: j: Q
                      long aidx = idx;
4 j9 S' w6 M5 x- M' X* W( B                       wchar_t *wsName = 0;
" \" e% E, q. H! u* x                       VARIANT vValue;
! [' h9 k: h/ y1 e, U$ e; G                       VariantInit(&vValue);
( N2 _& T/ ~  [. w6 k' o8 ^                       SafeArrayGetElement(pvNames, &aidx, &wsName);" s; F$ x+ K+ [* D5 V

% D9 d$ H; K. Y, W                       BSTR bs = SysAllocString(wsName);1 o! J2 b: p" w0 {- Z6 O& X3 o
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
$ \/ `- f4 S5 m1 I2 L9 K* x                       SysFreeString(bs);
# i( w: a) U, v! j* X
! N2 C3 B7 ^6 W: B8 b- U8 N1 B                       if(hRes == S_OK)5 ~- x) K- K& x( P
                       {& N. k4 }% y( W
                         AnsiString s;
& m( f" {" a, ~  _* c% E0 f                          Variant v = *(Variant*)&vValue;( P6 m  W+ A) @) E4 e8 H
                         if(v.IsArray())
# ?) c( `6 Y2 W+ k9 Z                           {
2 G; z0 b% u9 t5 j& q. E* C                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)5 l% e) U2 m# K. N8 K4 h
                             {9 a7 |& ^! S& T4 C
                               Variant a = v.GetElement(i);, s4 k  r* ]% b6 e
                               if(!s.IsEmpty())+ C1 P/ |* ~4 {- a
                                 s+=", ";/ l, m1 s% [3 p2 ~: y4 U
                               s+=VarToStr(a);& f% l) {8 M- l% O& g- H+ j
                             }
; h5 F' b' P( Q                           }
  p5 _8 T0 H6 c                          else
9 y9 M. R( E( g& q                           {
& X' P& V3 @. J                             s = VarToStr(v);- Y: q( o) l4 ]
                          }
# N# r/ ^) W; j5 e                          lpList->Add(AnsiString(wsName)+"="+s);) v$ p( Y! a* o& _
                       }
1 |0 x$ [* m. _$ q$ T1 G& x" O1 }
                      VariantClear(&vValue);( k$ t# ]4 U) E8 ^9 V
                      SysFreeString(wsName);  |7 o# a2 U6 \) z4 L: ]( H9 V
                    }! w9 S. C$ A. _
                 }
# D; v) K6 s: x/ s& g" p. }5 t                 if(pvNames)SafeArrayDestroy(pvNames);: K. G4 K: A8 Y' J
                iEnumIdx++;0 D3 q' J. F9 e, Y5 a
              }2 h! q9 z/ E/ d7 T0 l* A
           }
2 o: }/ ~9 p$ m, {& y( i0 p           if(pClassObject)pClassObject->Release();
* f$ H4 w0 n" T- U+ K         }
# N$ D8 A: o% b+ }        if(pEnumClassObject)pEnumClassObject->Release();
- J, x6 f* N. ~( Q0 \+ e      }; S+ d3 L! d8 g
    if(pWbemServices)pWbemServices->Release();
, \; r% e/ `3 E5 @. k   }
  r* ]. Y' B$ p) d  if(pWbemLocator)pWbemLocator->Release();7 O* k2 q- F1 H3 Y( |, I0 E
}  S$ i9 c, Y- M! i$ Y0 O
//---------------------------------------------------------------------------4 c: a+ z. r1 J3 m  k/ _
4 V) K5 \. ?/ r6 J8 q* x1 {2 j
// 通过 WIN32_bios 获取 BIOS 信息:# t4 y9 |, Q+ m7 G& n
void __fastcall TForm1::Button1Click(TObject *Sender)
. y' ]* a) C! |9 I{1 o7 A. K% Z2 Z$ w3 j8 c1 G3 i
   Memo1->Lines->Add("================== [WIN32_bios] =================");1 d5 e( q/ J% d  g4 \0 i5 U  u( n
   GetWmiInfo(Memo1->Lines, "WIN32_bios");2 e) e1 H8 w# J
   Memo1->Lines->Add("");
' k! a( b4 x' V  V1 U$ u) e. _- j}
; r3 p3 A: a1 S( R3 K: d' Z+ Y
( m# ]; Z4 U. y/ g0 m+ M( D--------------------------------------------------------------------------------& \, E; ^! G$ L" l
% S& ^: ]4 o$ V* D: W3 u
WMI 可以访问的信息类型有:. U2 {. b" s, m% o- y
  Win32_1394Controller
: t/ {# @( T$ `' Z# `( H% i   Win32_BaseBoard
" s0 n1 [# ^3 z# V. _' z. A; _+ ^8 r   Win32_Battery
# B# Z; q8 O- S! R2 t8 q+ {4 y   Win32_BIOS2 A. r# z% j" K, g3 G: H! p
  Win32_Bus
4 @) N  @& z0 f1 V+ V   Win32_CacheMemory, x" V: l3 W1 Y$ b
  Win32_CDROMDrive
: K' w4 K+ F$ i: S# i   Win32_CurrentProbe9 Y% ~( B6 e- ]* O- B8 O
  Win32_DesktopMonitor
2 Y9 ~7 ?3 i8 _1 ]2 \! H9 b+ V+ C   Win32_DeviceMemoryAddress
1 \# d! j( ]. |4 r7 N/ I   Win32_DiskDrive
+ ]1 i2 `2 {% o- a   Win32_DisplayConfiguration
3 w8 Q) J6 s9 i( b! _2 J( `6 N   Win32_DisplayControllerConfiguration6 ^$ v1 L! i9 W- _
  Win32_DMAChannel/ u- I6 O  L0 ]6 f( K
  Win32_Fan, e( L4 f) _" k( Z3 \. V
  Win32_FloppyController! `. V0 \* u: y, m. r9 n
  Win32_FloppyDrive* k5 t9 V1 r6 r& {
  Win32_HeatPipe! N6 `+ i, h$ Y  T% m' u9 `) Y
  Win32_IDEController! S7 x  F* [/ [% t/ _1 h$ w8 ]
  Win32_InfraredDevice
& s) L9 B' R( P. E$ Z9 A# i   Win32_IRQResource0 s# s: z5 ]5 s9 k
  Win32_Keyboard
9 \/ R* ?9 h; C: V/ b! ?8 a   Win32_MemoryArray
+ T. s9 _" Y' z) B0 J. T+ D7 |   Win32_MemoryDevice
0 ^! W3 M. S% W7 F   Win32_MotherboardDevice4 j6 n6 t# o9 k& i5 A( p' ?: D
  Win32_NetworkAdapter
: s+ F/ |* J( C   Win32_NetworkAdapterConfiguration
. b4 c# p. h9 x- [7 W1 ^   Win32_OnBoardDevice: j) ?6 r0 j9 w4 r
  Win32_ParallelPort
  n! t! o% y& D4 m, W/ u" T   Win32_PCMCIAController* s3 Q+ M5 k& r4 ~  R3 p" V
  Win32_PhysicalMemory+ S" A8 b# }" h
  Win32_PhysicalMemoryArray
, I# o: T: |: g4 E( U   Win32_PnPEntity
5 X. m* A$ Q+ e! U7 Q9 L  I   Win32_PointingDevice
# ]/ s9 q3 z6 g) D% }3 K5 J   Win32_PortableBattery
3 U2 u9 @: v9 i9 O! {" s3 G   Win32_PortConnector* ], D: ^, u/ ]6 b) V0 v
  Win32_PortResource! p( t9 J; W4 W7 N
  Win32_POTSModem
1 ^1 l! {% l* {" j8 r( h  I' ?7 x   Win32_PowerManagementEvent
( ]+ g, a7 S1 N# P) n2 K   Win32_Printer0 B  [+ m) r, a3 k1 Q/ \
  Win32_PrinterConfiguration
9 y7 F: K0 X( [; e& J5 b   Win32_PrintJob0 }/ R6 h: f" n* |  E. u
  Win32_Processor7 \! |' h9 E- G
  Win32_Refrigeration  }) q! S& d( l7 A% Y: s8 d! r
  Win32_SerialPort7 o" l$ t. x% u% a8 C4 F  T
  Win32_SerialPortConfiguration- q3 q. V& u: K* d
  Win32_SMBIOSMemory
% T8 v; x8 m0 ?9 R5 _   Win32_SoundDevice
2 C$ c% J3 s9 U, d# K& ~   Win32_SystemEnclosure
" ?( ]+ U; v; P% O, @3 S   Win32_SystemMemoryResource; G; q: |3 O, [( Y
  Win32_SystemSlot! y; v$ t! B  h0 o) d! K+ ?/ q
  Win32_TapeDrive4 v5 x3 j7 I- H7 V) S( r
  Win32_TemperatureProbe+ [$ T( ~( {) R8 A% n; F$ g
  Win32_UninterruptiblePowerSupply9 w. H+ D, C! l2 E9 V7 T
  Win32_USBController+ s( k2 n3 F. {
  Win32_VideoConfiguration- |$ x' h2 I0 N: j* o! c
  Win32_VideoController
6 ]7 T* T& a: ]( q3 f4 G  Q& Z1 T   Win32_VoltageProbe
" ?/ E# Z. s" S8 E) t+ ?8 l; P  t; m) @) ~$ T( g! W+ w
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-8 18:01 , Processed in 0.021927 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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