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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
2 F5 P: ?. M3 v( t6 J  J
, a! ~8 d, q, T9 E' n
' H6 D8 J# O4 R( h$ q, V--------------------------------------------------------------------------------. e# A3 {5 M- |0 {* I0 d
WMI: Windows Management Instrumentation (Windows 管理工具)- n2 }" l# ]0 ^
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 3 {! [2 G5 D6 b# L3 n+ O
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。5 b3 }  K2 N5 t
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
. K8 F2 O, M$ J
+ O) p. }! s2 |1 m& d9 o--------------------------------------------------------------------------------
& \( T4 J7 R: m( ZBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
4 u: ~) T. ^9 a' f; t: E& F
# H. v, M) s% x' v, ~--------------------------------------------------------------------------------- \5 D5 ]& p: J/ L9 P
① 初始化 COM 接口:& b# `7 b5 H5 c. {6 Z8 E/ e
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
# \, N4 E7 a, b   这两个函数在 #include <comdef.h> 里面定义。
' B  ?7 h' A  P; K/ |% v3 R- V
/ C" e/ D6 r+ a- b② 获取访问 WMI 权限:
) E- M) ~( N; U: e( I   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);% E$ F9 J! X6 E3 N3 `
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
& R5 h! \: `- a( {# U! D$ G6 f5 r( N$ L  I" H4 g
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:& `4 |$ X( k$ \5 h& D
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
) V: e# C$ N( Y% d0 V1 U( Q( W% C5 M. ?* T
void GetWmiInfo(TStrings *lpList, WideString wsClass)- ~3 ^6 A9 u4 {$ u0 t; ~9 @
{) U) d4 F, `' L$ W. V& F
  IWbemLocator *pWbemLocator = NULL;) k* l5 g1 L$ v+ ^  [+ Q
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
# |9 N% s6 k7 T   {
0 e2 ~# |; b# _# Q- m( P     IWbemServices *pWbemServices = NULL;7 ]* P, G, z( Q" H1 ^" J+ |
    WideString wsNamespace = (L"root\\cimv2");" o& f' D; f8 |! j: \& a* P6 m" ]
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
8 F6 F9 g2 h' s: L      {& q5 j# l! Y3 |$ a
       IEnumWbemClassObject *pEnumClassObject = NULL;
" N/ `/ m: d1 ]6 w- ^        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;% e# k/ g6 ?5 @# O( G: p* J
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
; x* [! z( X& N( x8 m         {, w, C9 v4 q* \3 J& K
          IWbemClassObject *pClassObject = NULL;; Q& R* ^/ Z, o1 ?6 i( z0 a
          ULONG uCount = 1, uReturned;
" R, L/ u  L0 ^2 X           if(pEnumClassObject->Reset() == S_OK)
4 a. p5 s. a$ W  m- w8 U            {
  c0 \5 |; Z6 L4 d              int iEnumIdx = 0;
6 K9 S0 Y( z4 Y; n9 i              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK). s/ P7 o4 C! l
              {
( T+ f( m6 A9 O8 f/ {                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
* O  ^: s% c: U4 V( @! b- i- ?, m+ ~( T
                SAFEARRAY *pvNames = NULL;, H$ A$ O& k( f! U0 q/ D: ~
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
" t: I- d) l( s                  {
% B* [1 Y1 I, L5 M- R                    long vbl, vbu;
4 k  ]9 j4 G) A6 {' n2 Z                    SafeArrayGetLBound(pvNames, 1, &vbl);
  K* ?" m8 T$ Q% w  J" W, n                    SafeArrayGetUBound(pvNames, 1, &vbu);. E: S0 b7 l( W5 l6 j
                   for(long idx=vbl; idx<=vbu; idx++)
) Y  L$ v5 C( _% q                     {' ?1 l) q7 a+ v  r# B* a
                      long aidx = idx;+ D# U$ Q  Y# z# K) J7 B, a, O
                      wchar_t *wsName = 0;
2 d) N- M( x) r% Q( |* `                       VARIANT vValue;$ w7 z# F; D: @' W, _  G
                      VariantInit(&vValue);9 @$ ^9 n& P) w  \: N+ p. T
                      SafeArrayGetElement(pvNames, &aidx, &wsName);! G2 I6 b$ h4 O+ u* ~
" N, z8 P0 g& g8 H0 t; x2 X
                      BSTR bs = SysAllocString(wsName);
- v8 `1 S. ?7 i- w( D& J) O0 D" r0 X                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
  t$ y% A( l, t4 O0 P7 w+ A                       SysFreeString(bs);
1 w9 s' s, G( u- ?+ f$ o' Q( B5 E1 a! Y4 l
                      if(hRes == S_OK)
- }+ `5 O' y2 r2 T1 s2 I. Z6 h                        {
2 Y& _$ s) E' w- j5 k" j                          AnsiString s;, M) ^  Z0 I  U8 i
                         Variant v = *(Variant*)&vValue;
, u: M1 O7 y$ s7 @- w) p                          if(v.IsArray())# y8 d- w* [5 ]# W
                          {
) U7 a* S* ?5 C# c  f                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
1 J- A% @8 Z4 @# u) R+ l: r                              {( a* b, E6 A% F  K( i* i$ _- H8 v" f$ T
                               Variant a = v.GetElement(i);
& c- y% u; P% H  o: {% |                                if(!s.IsEmpty())! s  K  K, t# y, h3 L6 y
                                 s+=", ";* v' E: q. b, O7 e
                               s+=VarToStr(a);* h  h5 U  P# r  j7 r
                             }4 Q: q2 V1 g! F6 ]
                          }2 x; k, r6 v) Y" N  W/ s9 e! D
                         else
( E- n- Z# ^; s- ]/ B; G3 D% h                           {
: P( k, @; t& z0 z2 L2 E: p% @                             s = VarToStr(v);6 O) @8 u3 N/ A  K
                          }# h0 E! ]7 C4 y4 v5 H
                         lpList->Add(AnsiString(wsName)+"="+s);+ T* M# _5 m/ _
                       }; ~2 d/ T$ K: N" Y

6 \8 U1 d5 |, r" L  B                       VariantClear(&vValue);
) i" I7 Q( e6 }1 W* h4 N                       SysFreeString(wsName);
$ K8 Z" ?) V+ Y1 O- [; i% I                     }
& ]7 Z% J2 @# x' Z                  }
$ `3 ]2 e- ~* a/ ^5 E. J! o( i" u                 if(pvNames)SafeArrayDestroy(pvNames);/ ~4 |! k) E) _( H2 W
                iEnumIdx++;
; _5 D1 E2 q; p' [. L" M: k               }3 i* |3 ^  k- d% H; Y, F
           }
4 _' w) |  t: u9 ?9 p           if(pClassObject)pClassObject->Release();
3 l, u; `! _8 I/ C         }" V# w9 F: x# Z$ ^2 I4 e
       if(pEnumClassObject)pEnumClassObject->Release();3 b  ?- b6 f9 o' f/ @% d" F# h; h
     }
# J4 X3 V& J: l2 G$ _6 j& }     if(pWbemServices)pWbemServices->Release();
+ w& [! O% j3 M" t; y, z+ g   }
* L; Q* h) b. B8 g  if(pWbemLocator)pWbemLocator->Release();* j3 V+ d' m. g$ y
}4 H% }$ u1 X+ p6 O1 `
//---------------------------------------------------------------------------
+ W. `6 z: d3 K0 r! E  n3 x: I9 z" k& _8 n8 U9 ?
// 通过 WIN32_bios 获取 BIOS 信息:/ T2 a; d) K1 q/ V( l: J. C
void __fastcall TForm1::Button1Click(TObject *Sender)
; L" Y4 K% m# M- u. M% p{
- P+ B* s4 W# x/ H& b: h    Memo1->Lines->Add("================== [WIN32_bios] =================");2 W1 C" G9 W- ]5 b' i
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
4 J  U' e0 x' l1 w    Memo1->Lines->Add("");6 m3 F; M% s7 g, `1 f+ w7 G! B
}% O- j3 a7 @' \8 z* \; ~
( f$ Y! @$ s: b/ t. Y( o8 D
--------------------------------------------------------------------------------/ j) w, @; I% U* w- X+ V- E' }7 `7 T

5 ?# M+ d+ ^' P2 J* m4 E! Q* \WMI 可以访问的信息类型有:
/ z3 i9 }% n/ L/ X   Win32_1394Controller
1 K8 U$ H3 D. t9 m( r- S   Win32_BaseBoard
, R0 s( A8 l; B) ~+ {   Win32_Battery, K- `% C$ r* j3 }
  Win32_BIOS) h  e+ V* W* E% h) ?9 O8 i
  Win32_Bus
( s" O0 c; N8 r4 v% x# g& V   Win32_CacheMemory
5 x0 C5 q* |& V- M8 ^: m' S   Win32_CDROMDrive
. Z0 I* o) z1 s" s( O% w7 T( }   Win32_CurrentProbe& ~4 D. X/ A+ M* H4 ?0 N
  Win32_DesktopMonitor
4 p8 J  L! e2 e$ x& T: q   Win32_DeviceMemoryAddress
& U& d' ]5 ]0 q) F   Win32_DiskDrive
" n, N( y9 L& A8 n  F) }   Win32_DisplayConfiguration
1 a' Z7 \6 H3 S* q% w6 Y   Win32_DisplayControllerConfiguration
( F1 U9 e; P$ E, S4 `+ X( ?) _$ S   Win32_DMAChannel& V+ @1 g" f3 q8 ^
  Win32_Fan# o$ J9 T  E! p0 y# h" w$ V
  Win32_FloppyController" c: h- e4 J( ]9 n
  Win32_FloppyDrive. ^; w, p" A5 y4 N4 u7 I
  Win32_HeatPipe
" B' m! H0 T: ~1 ?2 V* u% x0 Y   Win32_IDEController
* U2 |+ t/ U+ u4 {* K/ B   Win32_InfraredDevice
5 t: O* w( V1 f% T' r4 H1 E   Win32_IRQResource) I" O) U; b3 B1 A% n, ?
  Win32_Keyboard
$ L" }2 O( g2 P+ N; A   Win32_MemoryArray
) }5 F" M7 R* a: O/ u   Win32_MemoryDevice
; O3 \( S5 e5 j. L# ^( G   Win32_MotherboardDevice
" ~. _2 x% e( c   Win32_NetworkAdapter# S' E  A- r* F) G' G3 M" T6 G
  Win32_NetworkAdapterConfiguration
0 c7 q, w1 R! u  A* l0 Q' E5 y7 m   Win32_OnBoardDevice
" N  J2 v. @* ?/ t* E. ?* b- B   Win32_ParallelPort: K6 v* R* Q/ A6 Q
  Win32_PCMCIAController; l2 p( I4 k+ d' Z6 ?
  Win32_PhysicalMemory8 O) m& l$ ?8 J& `
  Win32_PhysicalMemoryArray+ \2 Y% k$ ~0 v7 h0 p! R& ?" r% m
  Win32_PnPEntity
; E9 w+ d: J0 m' P' @   Win32_PointingDevice
. }1 k8 u# n  s4 Z0 Q   Win32_PortableBattery
( k, E1 ?, Q0 [9 S& g   Win32_PortConnector
0 t6 x. L4 B& H1 }" ?   Win32_PortResource
, r6 m% J3 Y' U8 h  }   Win32_POTSModem
/ s1 k) g4 N+ f4 r: T' A) A& n1 f   Win32_PowerManagementEvent
( c' ]# @2 d" w$ ~* S6 f& d7 {/ n5 C   Win32_Printer
& K2 O7 R* j" |3 z' @( T   Win32_PrinterConfiguration
& F- N/ [$ [" [  _   Win32_PrintJob9 V# W. _& r4 {4 u2 g- Y1 v2 |  v
  Win32_Processor2 \. j: B4 a$ \) g0 X  p
  Win32_Refrigeration0 ?  s+ R1 o: Z$ |& D, `  o
  Win32_SerialPort( U* X5 L$ {, Q  h* w4 `) y6 m5 r
  Win32_SerialPortConfiguration1 V: C- R+ }& Y. x" d
  Win32_SMBIOSMemory! _% B$ q$ x- Z: u
  Win32_SoundDevice: A( ^1 U- d. H* j4 E% _' G  a8 G
  Win32_SystemEnclosure) f& B' n. N% g7 [0 N& N
  Win32_SystemMemoryResource
, o9 b) x- X! Y   Win32_SystemSlot( w, s# G* F& p; a( M' u
  Win32_TapeDrive
! K3 M: {. h! q* t" B* M6 U   Win32_TemperatureProbe
, k; ?* B0 i3 q6 U6 i   Win32_UninterruptiblePowerSupply1 m1 U) S7 _% ^6 y# {
  Win32_USBController. {) ?$ r  ^9 l, `. m. w
  Win32_VideoConfiguration
( F; n) C, d2 }* A   Win32_VideoController
3 L+ I8 W$ `. A- l& }! h   Win32_VoltageProbe
; V# ?1 ^- g0 d  l
8 V% d( {$ u7 j以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-23 05:23 , Processed in 0.018431 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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