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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
. j  J8 ]( w  e8 W5 `- o  D( x6 L: Q& ~" o; F
5 X8 {. Z. ?7 _# W
--------------------------------------------------------------------------------
" U& X0 O& \# D+ ~# eWMI: Windows Management Instrumentation (Windows 管理工具)# w( `7 a" c! [9 r
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 1 h) l3 J0 ?' z9 v) Q
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
7 Q& ]) a! D6 S. K   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 . h, M, Z) D9 t( B# u8 e* t0 R# Y+ ~

  N( M$ q' p3 Z) \6 Y7 T' P--------------------------------------------------------------------------------
( T/ r( X5 b; w+ ]7 G. `BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面8 m! s. \7 s- l" v

8 h( q: `/ E3 O& @5 p6 j; ]6 j" _% f/ V--------------------------------------------------------------------------------
, [/ P& E7 f5 J① 初始化 COM 接口:! b- a( _3 ~# U7 U/ \+ q
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
4 |+ r3 g1 y9 \$ m  j! ]2 [7 `/ s   这两个函数在 #include <comdef.h> 里面定义。5 t7 n% F+ U" O  j0 {; c
8 X4 P" M5 l$ ?& t+ ]# p- G
② 获取访问 WMI 权限:
3 f- t1 `$ Q* M   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
9 K0 B1 Y8 I0 u$ {: i   如果这个函数返回 S_OK 获取权限成功, 否则为失败。- ^2 n8 o! J3 G0 x

3 E, x8 \7 Z9 q③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:$ V) P$ ?3 H2 v  z' T: d) F6 @
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。# @6 h3 ~: z0 [! l
4 V% F+ h# V5 z5 J/ e9 s4 R
void GetWmiInfo(TStrings *lpList, WideString wsClass)
5 b. q/ p- {* x6 W5 K) i{
) V  \( N2 d4 ]* d: c  IWbemLocator *pWbemLocator = NULL;# [+ V5 y3 h0 @$ V% v1 j
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
- V0 |5 y. S+ o; E   {
3 N& U2 k/ D7 u) s     IWbemServices *pWbemServices = NULL;
) |! k- X' s& @& U/ n2 J9 k& H     WideString wsNamespace = (L"root\\cimv2");
  y9 P7 h, m- H' x3 m( G     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
% E/ p# ]& ^) `      {
( i1 Q/ J3 B; K1 l1 c2 M        IEnumWbemClassObject *pEnumClassObject = NULL;
4 r4 _# g2 V$ a        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;5 }# i7 Y. _( C0 d! J. }! i
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK). H& v" P# g& }. {1 k  I
        {3 M" V+ S* H5 d' L3 L
          IWbemClassObject *pClassObject = NULL;
5 G) b4 F- V& e; m2 U8 |, _4 @( x: @4 n           ULONG uCount = 1, uReturned;
( t0 c: Z+ g  u# Q0 c1 y           if(pEnumClassObject->Reset() == S_OK)
: T, j( L# Z: ~6 W2 F/ J& w            {+ I3 C; d9 d5 p1 A. ]6 W: \% T
             int iEnumIdx = 0;
7 J4 S- E/ N* Y  C3 H8 f              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
4 N7 P1 i* P, O               {- W4 M+ |1 u) O1 M# ]0 u  t* \
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
: r. b6 }/ O; Z9 T& B
( e5 g+ V2 H7 q                 SAFEARRAY *pvNames = NULL;, Y. V" }1 q/ Q- t' G
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)+ b, K2 C+ b! Z* z" Q* E
                 {7 m" |) B2 d, ?* T9 X4 B4 Q, `2 T
                   long vbl, vbu;" F. d3 ~  V) @
                   SafeArrayGetLBound(pvNames, 1, &vbl);9 @& v/ N4 e$ @, C( u$ b  j
                   SafeArrayGetUBound(pvNames, 1, &vbu);4 R# g% R. ~! n1 z, c
                   for(long idx=vbl; idx<=vbu; idx++)
. p4 g3 q( q2 v3 C7 n$ Q                     {
* V) A. m7 o# B9 T- H) T( n                       long aidx = idx;5 B5 D% W: u9 n9 E6 S
                      wchar_t *wsName = 0;
: a. W4 C! {% Q( o! H                       VARIANT vValue;* X  O9 F% P2 h$ _" t
                      VariantInit(&vValue);
9 }( u' Y" E& c5 r                       SafeArrayGetElement(pvNames, &aidx, &wsName);2 r* ~# I  `9 M' }; J# ^3 m' W

. c# R& ~6 [  w9 D; p                       BSTR bs = SysAllocString(wsName);
& Z- C+ C' A2 v  u; L6 p- r                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
- `, C! I. t* x( o9 S3 j" _                       SysFreeString(bs);( j  V3 W0 V& O( `7 e

% s6 [/ q( M7 i; ^/ p) i. O2 }                       if(hRes == S_OK)7 l# u2 g- B; P; p/ h! K
                       {; o/ _5 h' ]" `# s! J! P1 N& @
                         AnsiString s;
, _  V2 A* a8 r. p* z                          Variant v = *(Variant*)&vValue;
! X) [' ?2 I0 v' E- f& z                          if(v.IsArray())
1 x5 Q/ v& p: w0 R$ c. C                           {
  D! j2 y) F1 g: M                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)  q6 a6 [( H, p
                             {; w2 t1 ~% R3 b$ \3 Z
                               Variant a = v.GetElement(i);2 [( ~% x1 H2 m- Z3 q% ~% h; R$ Z
                               if(!s.IsEmpty())
$ u8 r$ V5 g( z1 T                                  s+=", ";+ v( [) o, t# a
                               s+=VarToStr(a);: t: A0 s5 H* v; N% N3 y
                             }
; \) b$ W/ i& V( |8 C. i# q0 S                           }8 }) U; l- @# w0 K# w
                         else( ]: ?0 ^% L) Y8 W. ~% J
                          {
% L! {3 l; |' {7 z5 g                             s = VarToStr(v);
6 h" @( t0 W! B% r! u                           }
; h1 Y  H1 f+ r3 m                          lpList->Add(AnsiString(wsName)+"="+s);" W% s5 o. h8 y/ C2 B
                       }
3 ?% S& Z) ^0 |) o6 t9 h3 i/ q' n; Y# Z- K' E
                      VariantClear(&vValue);
7 _5 n) y; F( F  ~" M                       SysFreeString(wsName);
; p" k: R) M" C; v                     }3 n9 I1 \1 T; n- @& O
                 }8 K6 H3 I! n- C2 d6 T+ Q
                if(pvNames)SafeArrayDestroy(pvNames);/ g5 g& T' Z2 \5 j3 ^
                iEnumIdx++;5 m. R5 o5 K7 Q! q
              }; p5 _9 V! v/ J  a0 g' j+ ~- z( @
           }9 U1 a5 B. d/ ^: p0 y  Z
          if(pClassObject)pClassObject->Release();0 [/ |' u# w* y/ [# k: ^
        }6 s6 y& a# B$ I5 w9 Y
       if(pEnumClassObject)pEnumClassObject->Release();
( }7 W2 I$ I9 u$ K# h3 ]5 P      }# h/ X% |" @# f! {
    if(pWbemServices)pWbemServices->Release();
# c+ n" r; \* K) ~% S' j1 a   }
+ @$ B' L1 L+ ?% ~. }) x& E  if(pWbemLocator)pWbemLocator->Release();2 w9 m4 k; J$ p2 R# L3 ]+ A
}
# f7 V% ]% ]) n: T2 j8 ~$ r//---------------------------------------------------------------------------
* l) l& e# N  l% Y# P& j' O7 z- F4 V! M- \0 F0 B! k+ j+ u# [6 N, P5 Z0 F
// 通过 WIN32_bios 获取 BIOS 信息:
8 \. Y8 @/ |3 c0 P$ u. _void __fastcall TForm1::Button1Click(TObject *Sender)7 ^' T* r& I) ?' j1 p6 `. f
{
( j3 K9 p; R  _2 @8 }- l+ K; b" G    Memo1->Lines->Add("================== [WIN32_bios] =================");3 @4 V) j( ~( e/ t/ K
   GetWmiInfo(Memo1->Lines, "WIN32_bios");+ V3 K0 R* z) x. @2 i, H( Q$ |- j
   Memo1->Lines->Add("");* _- h3 [  f* H" C- o# \2 ^
}
: S$ `4 e3 I+ e; Z/ |# N$ v1 L5 m& L$ X& k2 i; s1 R% B% j* s  ~
--------------------------------------------------------------------------------
. d  j. e, ?6 O
% [8 A* x, R' X7 B; H9 c' ]2 }WMI 可以访问的信息类型有:4 _- J  f" `+ A5 ~. G, y) e
  Win32_1394Controller
+ @8 @- h4 s# z1 i* k   Win32_BaseBoard
  D; @8 R' f- ]   Win32_Battery# G* i; ?+ E8 P% X6 b/ o; k
  Win32_BIOS/ h8 J4 i8 K3 n+ ?$ f
  Win32_Bus
1 E3 x' z6 I" |* v  @   Win32_CacheMemory+ \2 y8 e; E  b# D: v
  Win32_CDROMDrive5 o/ P  c( c- n' z4 l/ L1 l) b, Y
  Win32_CurrentProbe; _6 q7 q/ v* @- n, {# c
  Win32_DesktopMonitor
- b+ M2 d" n! r* M; `4 e7 I   Win32_DeviceMemoryAddress* r. `1 v  h5 k+ i5 l# c
  Win32_DiskDrive0 |9 p2 Y% q  S. K/ v) q3 U
  Win32_DisplayConfiguration+ [) F; V% A8 c5 l/ l; k
  Win32_DisplayControllerConfiguration  ]7 H% z% F* o4 z0 q' d
  Win32_DMAChannel6 w- }, |, N9 D# l6 ?" n
  Win32_Fan% W4 x6 c  Y, X3 ~# ~% ?: t
  Win32_FloppyController
  z( E$ B) e1 H! x9 k   Win32_FloppyDrive7 x' n  p, |# [& t: N# r5 f, T
  Win32_HeatPipe
4 }8 v0 ^& U4 d* j, f7 W4 K   Win32_IDEController  W1 P* _& I2 j& q( W
  Win32_InfraredDevice
/ b0 t: J3 J: R6 `# S1 J   Win32_IRQResource" h# z0 k/ y! r+ s9 {% G
  Win32_Keyboard
! k1 n$ U7 W+ B* z+ z( i   Win32_MemoryArray
( S; T* D4 U7 K7 s& R; F# U3 n   Win32_MemoryDevice  I0 Z3 _# j) u; s
  Win32_MotherboardDevice  r1 C9 Y  T: ?' d. J8 P
  Win32_NetworkAdapter- X# D) C1 p# r9 t
  Win32_NetworkAdapterConfiguration3 M3 }* [/ |) h/ V# n2 L
  Win32_OnBoardDevice
$ y7 r& [: p1 P6 p   Win32_ParallelPort7 r* n" b) w! N" |  o
  Win32_PCMCIAController
; f0 I, r' d2 S) D  S. p6 ~1 j   Win32_PhysicalMemory& R* V3 J/ C6 {  z8 J$ L' {* U6 h1 w
  Win32_PhysicalMemoryArray2 v& z8 l6 N& g) _1 @* V
  Win32_PnPEntity" H) H" F7 d' Y* |& w0 o
  Win32_PointingDevice
2 s% h, j1 \4 Z/ }9 x; m  B   Win32_PortableBattery! [2 m- R; f- P: R. i# o
  Win32_PortConnector
8 X8 }. K% A/ X6 |# ]0 z   Win32_PortResource
4 F! C! f# I  O3 B/ T. S2 {   Win32_POTSModem1 l' H* G% h3 v) N; }+ d
  Win32_PowerManagementEvent
" W0 R4 i& E. q, ^% r   Win32_Printer6 i2 H, C  G4 Q) o0 u& \
  Win32_PrinterConfiguration
2 [. f4 U1 R6 B& g. u5 ]8 A9 E7 `   Win32_PrintJob/ R) I7 [. {* R0 a  k  J8 o7 J
  Win32_Processor  V5 \8 ~  S% T/ V' T
  Win32_Refrigeration
7 `6 Y' O, T4 T3 ]+ ]3 W   Win32_SerialPort
9 f: d% q+ i' L0 \. [1 R9 _) q   Win32_SerialPortConfiguration
% l' W2 T/ J; k; O5 Y: y. Y7 `   Win32_SMBIOSMemory: @1 ~$ a0 B( v+ j! V* A$ ^
  Win32_SoundDevice9 a1 B8 m) i# x9 }$ O$ i
  Win32_SystemEnclosure2 R7 u/ Q( ?0 i* R/ A& p9 o9 X
  Win32_SystemMemoryResource0 Y* T# k+ s( u" [) F
  Win32_SystemSlot3 D4 f, r; `: Z; I
  Win32_TapeDrive
/ M5 i9 E, J/ v' g4 w   Win32_TemperatureProbe
) H  i: ]  W% J6 m9 @   Win32_UninterruptiblePowerSupply
$ c% z% V6 U3 K! {6 v5 Y5 ~8 D) W8 r   Win32_USBController" q" v, {* q3 u/ M+ |
  Win32_VideoConfiguration  p3 r; u; [) _8 \
  Win32_VideoController9 O; d" [3 f- w% [) x' G9 F, k
  Win32_VoltageProbe& s1 G' o1 W# ^1 O  C

' ~; t  @/ t% l  \1 f8 f6 Q# j以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-27 08:56 , Processed in 0.018528 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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