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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)- @+ X0 v. L% ?

! K3 M& ]4 U/ [5 B" I4 U8 T5 ~+ |3 I: i4 Q4 M/ ~
--------------------------------------------------------------------------------
" F2 j: i7 W# ~WMI: Windows Management Instrumentation (Windows 管理工具)
2 c5 s0 B" N, m" \, P2 ]* l   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 - ~/ r( d% p3 Q" z  k$ y
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
# x5 t3 u4 D  ^  a; S   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
' o# [: E3 u! h7 {+ [* Z2 M. B4 V1 l& E. G
--------------------------------------------------------------------------------
# W7 T1 G; N6 G+ Q- F+ \' P7 [/ ?3 [BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
: G8 X" s6 l* B; W3 @
) e" [1 C' G1 o0 Q--------------------------------------------------------------------------------7 |# y( m% b# c6 o0 V) h
① 初始化 COM 接口:
# r3 e5 H. v' @. A   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。+ w/ E! W$ Y$ f% Y1 R
  这两个函数在 #include <comdef.h> 里面定义。. x% t: h& O' w4 A

$ t/ ^$ N' V% F' S* P' [② 获取访问 WMI 权限:$ g- o0 n: U& f) q
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
1 f7 S4 j3 G& P) H7 z3 v& E   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
2 ~( y* M/ d/ R9 L% s, U0 d! V* E3 g( B8 u$ v  {+ \
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:9 n  D1 y# Z! y3 K
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
$ k& N3 X' t+ R4 K( f3 f% J, ?6 C- R% r2 ~, H$ [: D
void GetWmiInfo(TStrings *lpList, WideString wsClass)
  N/ `7 p, t: u+ ~{$ ~( T! P' Z9 V& t
  IWbemLocator *pWbemLocator = NULL;
# X) A9 B' D$ j0 d  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
9 K4 N( o6 k/ Z- |+ G0 q   {
/ Y* G# C- J  s; K. F2 [     IWbemServices *pWbemServices = NULL;, y! o8 s! L# u: C  H
    WideString wsNamespace = (L"root\\cimv2");( I3 r  Z" s9 {
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)3 `  `  W: y! D$ }! R; H
     {
3 T# R- {; D3 [. W3 n6 m) c' s        IEnumWbemClassObject *pEnumClassObject = NULL;
% Z. b) ^! ^& m6 A        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;4 k  X& c2 k9 E7 H5 n5 ?
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 A" K+ U, a. [7 r! |         {
& R. |& V- v" X( O  o           IWbemClassObject *pClassObject = NULL;' Q/ B. H$ B* \+ K8 N" p
          ULONG uCount = 1, uReturned;
8 e# B7 k4 c7 Q) e* S           if(pEnumClassObject->Reset() == S_OK)
. J/ e- B8 r7 ~0 @8 i; O2 @$ c, y            {
8 A3 `/ c2 r7 ?  y, W1 L1 `              int iEnumIdx = 0;# e3 |  g8 N# Y2 Z2 ?9 A* s0 h
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)" p. O+ y1 r2 C& n- o  j' l
              {* K- v5 _% I2 O. K
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
: _- y( t, C& n( Y9 s9 C7 ~
7 w' z. f) T) c$ t3 H                 SAFEARRAY *pvNames = NULL;
7 u  k* U2 v5 S4 q* ~; J/ x6 b                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
+ r$ _+ X; O  T; z( }                  {, S8 _1 I, _, ?
                   long vbl, vbu;
' |1 H$ K) V$ P                    SafeArrayGetLBound(pvNames, 1, &vbl);8 I. B) G* d  `( r4 n: y
                   SafeArrayGetUBound(pvNames, 1, &vbu);
1 j8 I( m7 q4 D, B: F! d9 Z( x                    for(long idx=vbl; idx<=vbu; idx++)7 h1 a& ~- |- C3 `. E
                    {
7 h1 s( A7 P. l1 P8 T7 B                       long aidx = idx;
* |" \" Q/ R( F0 z2 H  r; l                       wchar_t *wsName = 0;0 i- q0 s: R4 t. I% [5 n
                      VARIANT vValue;
, D2 D  |9 R0 B) h6 a8 p2 C! k                       VariantInit(&vValue);3 h1 G6 g: a3 \: k9 Z6 V
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
/ ?5 A" T! R- X3 @. D
2 q1 z" R4 n1 l# {                       BSTR bs = SysAllocString(wsName);
. y( l' j3 _' z8 I! e) \                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
; w9 a( b3 v8 X9 n2 w/ _/ x                       SysFreeString(bs);
# H$ D& m, p# e6 [
2 [8 i/ h. `, t                       if(hRes == S_OK)0 U: t7 T) e/ g  @
                       {
. m+ H3 ~: z: d% E( N  H8 L. h8 I                          AnsiString s;
1 d0 I& J- ?3 z( B8 s, }                          Variant v = *(Variant*)&vValue;
. o: B9 p( s+ \7 Y                          if(v.IsArray()); u/ U$ R! B) b& T' G
                          {" A- z) o5 o" }+ G# u& ?" K
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)4 g* j& {7 M* b1 X+ g! U; e9 n
                             {3 K- I9 R; d" K( w# S2 e
                               Variant a = v.GetElement(i);5 s5 e) N1 P9 J3 `
                               if(!s.IsEmpty())
  {! r4 I8 O/ L( R7 j                                  s+=", ";
* p+ g/ r2 H7 |4 \/ n! T                                s+=VarToStr(a);0 E, r: w# {+ Q/ o: c4 n
                             }7 q4 f) v* u/ Y' K. s
                          }) J4 i0 ?2 n( T5 n
                         else1 G! J- b# d$ V. m
                          {8 K& `% ?" f6 t) x+ l
                            s = VarToStr(v);
2 t3 h9 O- o, o4 M+ O' M                           }
, t5 `  v  {$ @3 B                          lpList->Add(AnsiString(wsName)+"="+s);( Z. J4 r8 h/ X3 B; k% v
                       }
+ Z) u1 W/ A, x# F
8 \; f6 A  r' M6 U, C                       VariantClear(&vValue);
$ U) ~: r6 r- D0 j4 Y                       SysFreeString(wsName);
" t+ n* C2 y6 x9 ]- y                     }
2 H0 A  y+ e4 L5 [                  }
- l1 T0 g# ^- A* h: S  v                 if(pvNames)SafeArrayDestroy(pvNames);
0 @( y* ^) q! x; S7 l0 Y# O; u: A                 iEnumIdx++;+ X' g8 \. t7 h3 `: l$ O) w
              }7 x1 G( f* I. j+ |
           }/ K5 J. C3 }1 T. r! \6 ^; O0 @
          if(pClassObject)pClassObject->Release();
, E: [! @4 m" E% @( i         }
. H3 L- \# P- {% e' M; N2 Y. o, b        if(pEnumClassObject)pEnumClassObject->Release();
: a. V5 `+ x. X) o8 @2 f0 y" {" o      }
9 D- e, W, _1 g* _     if(pWbemServices)pWbemServices->Release();
* }7 N; t& g9 c( t- J   }$ v6 }! ]8 c7 p, ^. {+ b$ C
  if(pWbemLocator)pWbemLocator->Release();
- ]/ Y0 D9 s6 B$ g* h5 T5 k5 T' v}4 A, V2 y  C6 k  g8 P
//---------------------------------------------------------------------------
; M' O- r* H7 C9 U; P( f/ e1 p, N' B! Q4 T
// 通过 WIN32_bios 获取 BIOS 信息:
% C- c7 p4 ^+ A, Nvoid __fastcall TForm1::Button1Click(TObject *Sender)
9 ]  Q& A- \! [+ Z6 [8 |{! c5 s; Y, w  D* d- T" P3 w+ W7 y
   Memo1->Lines->Add("================== [WIN32_bios] =================");
+ z) Z5 x6 ]) ]    GetWmiInfo(Memo1->Lines, "WIN32_bios");8 ]9 b! C! P% d( @7 e4 J$ j; ]
   Memo1->Lines->Add("");+ W  s0 T" S5 |9 E, W0 q! C
}
0 ]( `  D$ P7 `7 u3 d* ?' Z# v, W0 {/ I4 ~4 v% _' T) l
--------------------------------------------------------------------------------
4 s8 [$ v. v& |9 f5 A
7 ~/ J! m5 ~( mWMI 可以访问的信息类型有:. b. l9 m' `3 V5 E
  Win32_1394Controller7 A) ?, \, Y) n, o6 y) C4 m
  Win32_BaseBoard
. k3 _; R7 @0 R* B. @% c4 F   Win32_Battery4 E0 B5 x0 b# h4 d- V
  Win32_BIOS
" k+ C# X0 X: J: @$ s- }   Win32_Bus7 s- k" {  ^! K4 l8 f
  Win32_CacheMemory6 v7 j/ P7 t0 ]8 Q# P8 k
  Win32_CDROMDrive; C5 \: ^/ Q% E. R: I4 ?9 `
  Win32_CurrentProbe
% r- s( c9 g* d# J6 M/ {0 I. D4 G   Win32_DesktopMonitor& d% U9 G# h- m, L" b0 t' G8 ^
  Win32_DeviceMemoryAddress( n! h, |  w. V( f$ L8 s
  Win32_DiskDrive
3 I1 I1 P0 P" R0 `   Win32_DisplayConfiguration+ a  _, e2 s' j+ J. _9 X, S& F( N
  Win32_DisplayControllerConfiguration2 g3 a# Y7 o0 |4 j5 L
  Win32_DMAChannel
8 e; h/ O  g! {& z3 \  e) g   Win32_Fan
: G; V& W' O: N& r  Y7 I& t   Win32_FloppyController
, J0 {9 Y5 ^/ K9 P9 h   Win32_FloppyDrive
+ H* v; i5 o' _" Z: t% e  p   Win32_HeatPipe
0 }! T0 ?  B2 d3 P9 _. A4 S5 k   Win32_IDEController
3 ]/ S7 a9 H6 u0 r+ d/ K0 c! M   Win32_InfraredDevice
( ]6 {( V# V' i0 j/ N) b' S- y   Win32_IRQResource
* W7 f* |8 J0 a% z& |( N% Z   Win32_Keyboard
+ z+ F- {; |& t; y& @! L   Win32_MemoryArray
' [: F! V. D! S& V1 f6 A   Win32_MemoryDevice
- H  r- n& o4 Z9 M$ v4 e" }+ n$ o   Win32_MotherboardDevice: d! P4 ]3 u, u' p8 P
  Win32_NetworkAdapter7 M  B# W3 \3 A, A$ g5 i( m: B
  Win32_NetworkAdapterConfiguration% T. n0 H5 o, C$ `+ ]
  Win32_OnBoardDevice
! z! u* X1 w, a   Win32_ParallelPort: J/ R; X5 j0 U  z' I* I, [6 u
  Win32_PCMCIAController3 K7 V9 p: i$ l% `% V; b2 B" F$ d
  Win32_PhysicalMemory, X) B% A+ w3 o' h3 S5 I
  Win32_PhysicalMemoryArray- c' I4 b, U( J8 N
  Win32_PnPEntity
  H1 A- Y3 P; I, }; P1 f( @   Win32_PointingDevice( W; {7 J4 s& ^
  Win32_PortableBattery
* u$ `/ Y: a  T1 `   Win32_PortConnector
4 X! Q5 J# n* e# }   Win32_PortResource* z# P  S# ?, u6 g( @; v1 C
  Win32_POTSModem2 V) f) U, k/ E* V4 |; n: U7 N
  Win32_PowerManagementEvent
% [9 p% x* C5 x! C( ]' c/ L) v   Win32_Printer
! T! U. Y  j1 E# p) j) \: ^   Win32_PrinterConfiguration. Z1 c0 ?2 [3 Y! P  P4 H& B& n
  Win32_PrintJob' X9 a/ o; `( Z* X7 r: o! o/ S8 @
  Win32_Processor0 Q# c+ Q! `8 l
  Win32_Refrigeration& K* ~: Q: `: V: D3 A4 d7 X7 J) m; w) T
  Win32_SerialPort
9 H5 v9 i4 I1 R3 X3 a. G   Win32_SerialPortConfiguration
4 q8 `5 G! u5 _' j$ A* q+ T   Win32_SMBIOSMemory( X, E1 F- g7 v/ W% Q( n0 ]
  Win32_SoundDevice) p& C% _. f! ?. c8 K
  Win32_SystemEnclosure
  N) m7 S  E; o3 {# v   Win32_SystemMemoryResource
6 M) L3 j6 b0 ]6 R6 |; ~9 z   Win32_SystemSlot2 g) ~; X% a* h
  Win32_TapeDrive
, i2 K1 |9 x8 D4 l* z   Win32_TemperatureProbe
; Y4 m5 x, Y8 O, z. P   Win32_UninterruptiblePowerSupply
: F6 r6 g0 [7 ^0 f   Win32_USBController
( g" a- x8 ?# ?   Win32_VideoConfiguration0 w) {) t# s+ Y7 `, C1 P4 F: I
  Win32_VideoController" q5 ^. T: ?5 _/ Z% f2 ~. Y3 ]
  Win32_VoltageProbe
( A: E# G$ `6 P7 `5 b4 z
0 H. N# O( M  A* V以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-15 15:02 , Processed in 0.019691 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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