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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
  s( b0 o+ S$ c7 k* P! W( s; \* M
' E4 b) h6 i% l6 s5 j: O8 Q  _$ r# f: z! L% D* K
--------------------------------------------------------------------------------% M3 K/ i7 u9 F3 v: ~
WMI: Windows Management Instrumentation (Windows 管理工具)
- k" T  ^& A( a) D' y! h   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
3 u7 K7 ~4 X7 C' S4 M0 M   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
: y, r+ W! X6 \" h7 O   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
6 V( z" v  e3 L2 o- J& Y3 g0 f& x" I) s& B
--------------------------------------------------------------------------------* y" T3 \4 v. i: Q$ I- s
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
! y. h3 O! T! r3 l$ S" l0 c/ _0 ^! I5 T# \7 a7 p
--------------------------------------------------------------------------------
  [* _* O5 a# ?$ Y① 初始化 COM 接口:
, q5 {$ Y5 [! F# [8 U1 t   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。6 n  V1 T) P7 t
  这两个函数在 #include <comdef.h> 里面定义。' t9 y3 D; M/ W+ f* O0 I/ g3 q

4 N& e# {2 P6 p" r9 N② 获取访问 WMI 权限:
$ D9 m6 k/ W0 i3 g7 j8 y1 P   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
8 X2 V! x3 m* D' `/ W/ V1 H( z/ L   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
2 c: s: v* O% f+ m; F
9 I% U* [* q5 j) @③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
/ N  I0 u( Q" b4 p2 G   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
$ X# U; W' q) S! O7 g$ G
& J' ?8 l+ [" G% l' ~8 Cvoid GetWmiInfo(TStrings *lpList, WideString wsClass). q/ _, e8 G9 b- |" o3 q+ M' S* F
{
& T7 R& j( ?9 Q! U( [  IWbemLocator *pWbemLocator = NULL;) M" x5 L$ d, l& M, U
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
% X" `9 y) U# y& Y" U) l   {; j/ I* V; m( ~
    IWbemServices *pWbemServices = NULL;
) |, _$ t% n4 L1 E# s     WideString wsNamespace = (L"root\\cimv2");
& c! {7 X9 i  H3 _8 }     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
, H5 u9 [$ C+ V* _      {
: t- G1 A$ K8 N9 M9 }5 X        IEnumWbemClassObject *pEnumClassObject = NULL;) R, g, @# D1 V) ^
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;  L% y  ~2 d/ h2 P' `
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)  I0 @3 R6 I- `6 _) |
        {
& N$ z# B4 {( b           IWbemClassObject *pClassObject = NULL;  W# p# X) C! Y& k; b1 Q' b6 ]
          ULONG uCount = 1, uReturned;
2 E, K' ^, D* i0 P3 q  j$ H           if(pEnumClassObject->Reset() == S_OK)8 x- o. A) {1 j: u/ {" Z
           {
7 V$ [7 @% v) Q7 t. i              int iEnumIdx = 0;
+ ]: i8 }8 T6 x! V              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
, {+ _0 t" v2 z* b  |               {
; t: {1 w% A  ]3 j2 w/ v! @7 W                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");$ ]% w: |: B1 S& d
% X$ I: m) i9 B; l2 a
                SAFEARRAY *pvNames = NULL;& F9 ~& e4 n3 e, x  c
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
! S: p( ^# N+ ~' G" R0 g. j3 W. ~                  {+ O8 J  r% z: h: X% t4 b+ v
                   long vbl, vbu;# k- S* c0 e3 y' _( u' s0 Q9 Y
                   SafeArrayGetLBound(pvNames, 1, &vbl);, K( Q, \( e! q) I
                   SafeArrayGetUBound(pvNames, 1, &vbu);
7 h( b! F& L! G                    for(long idx=vbl; idx<=vbu; idx++)
, b' s/ P/ K2 J" j4 s                     {; E9 O8 e: }4 j7 e- `( K1 O7 z) m
                      long aidx = idx;' X, Q! z* R" E# a
                      wchar_t *wsName = 0;2 [* W7 a9 T# E! A9 N3 x
                      VARIANT vValue;
3 }! f# R8 H! O: H" ^                       VariantInit(&vValue);
8 U7 g% }6 t7 M# _( P+ S                       SafeArrayGetElement(pvNames, &aidx, &wsName);
" J  O0 l9 G) p
& ]0 ?2 y. C! c4 J                       BSTR bs = SysAllocString(wsName);& \2 z& P; J* y
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);- ]2 O% |3 V) v# V
                      SysFreeString(bs);
% L! l1 ]( a" I# L! [1 @' h3 K1 c7 }: l
                      if(hRes == S_OK)  x8 T4 ~- J. n1 ~( Z) C9 q: ~9 [
                       {0 d8 m! u# |3 R5 M6 h8 Z
                         AnsiString s;
, t) L' y& ^* B+ k6 Q/ R                          Variant v = *(Variant*)&vValue;
" b7 r+ l  [" h" Q1 `8 U8 G                          if(v.IsArray())
5 }, n; {  ?) L                           {) y5 r1 T; a) q$ g; y1 {9 i
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
8 f' B" ?% D: i6 a" D                              {2 \' w1 ^/ H. u& E5 `9 n
                               Variant a = v.GetElement(i);
2 Q3 ]" N: L2 w2 q                                if(!s.IsEmpty())" I. j, V! z$ P5 ^( e1 v
                                 s+=", ";
. \. ?3 z% s, L0 F, _4 Z( [1 q8 g                                s+=VarToStr(a);2 u9 _$ ]" n: W* s8 Y
                             }
# M, b/ u4 t2 K9 q  l                           }
- `! p2 \6 r' T* }6 Y                          else
9 H) z/ @2 \  Q! e- D8 d. T                           {" a( D9 k: a, d5 c! q# _6 Z
                            s = VarToStr(v);
/ ]: W! ?1 u9 q/ m+ v4 _                           }
* I6 h- {9 h$ g3 z& M- b+ u2 K                          lpList->Add(AnsiString(wsName)+"="+s);- n7 m3 G9 _# C2 u5 o- A
                       }) i$ v  f8 H; Z/ r6 d/ b! L

. \+ r+ f- v( W/ k5 y! I5 B6 h                       VariantClear(&vValue);
4 N2 Y3 `# z5 g- d! g- u                       SysFreeString(wsName);9 y* ^6 v+ _9 G! \
                    }
% [7 Q' ]" w8 p9 T7 W) v+ i, i' |                  }
% ?' v% F' l# e+ N5 o- P- Z) j                 if(pvNames)SafeArrayDestroy(pvNames);2 |4 L, c% g( f  O8 h# o
                iEnumIdx++;
6 l9 g1 A3 M) p7 q               }1 K$ N, }6 T+ W8 V
           }9 w6 `4 u  ]1 k; D4 y/ W' H
          if(pClassObject)pClassObject->Release();% v- F- k2 p. D  w- _
        }
8 X/ K# e1 m7 |) u( b% w: @' D        if(pEnumClassObject)pEnumClassObject->Release();! @' i/ j" S) y# n, K1 v
     }3 v4 U' u# l( B) X) M# r
    if(pWbemServices)pWbemServices->Release();
. k$ I; g8 z$ c9 t. e, D$ y# m   }
% ?$ h! o- a# M  if(pWbemLocator)pWbemLocator->Release();8 F% d! }, d4 X- j* _
}
- |- n# I$ d, ]//---------------------------------------------------------------------------
& f$ r' }& h' T6 v
1 J- f8 B. v2 j  [' f( {// 通过 WIN32_bios 获取 BIOS 信息:) q: V; z- ~: ~( i, o6 v4 W
void __fastcall TForm1::Button1Click(TObject *Sender)- q- j0 Q+ [6 A8 P
{
% u2 W3 l3 p0 R    Memo1->Lines->Add("================== [WIN32_bios] =================");0 C, _6 Y/ d- ]1 r$ Q7 l  M; o
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
1 N. T: z# \2 l5 {6 j0 ^    Memo1->Lines->Add("");, o9 }  w% }. T1 }& N1 i
}4 Y) ?+ f5 t& ]

  Q+ S$ N; Q2 u* Y2 z8 a4 k--------------------------------------------------------------------------------
! f4 q) I6 r2 t; s: h/ V
; U  Y) w' R5 l  z; R0 W2 ^: SWMI 可以访问的信息类型有:; `7 ?5 {0 x: k) }% J; z
  Win32_1394Controller7 q. ~6 q/ c, h+ }
  Win32_BaseBoard& d8 G7 h- B& o2 d6 @7 o1 ]
  Win32_Battery
& @' k, I8 Q6 b- F9 P   Win32_BIOS! P+ p, T" c  E/ Z
  Win32_Bus" T! B2 t4 J, ]3 G$ m3 C
  Win32_CacheMemory4 M1 @4 \2 u. b8 n7 T8 @
  Win32_CDROMDrive9 J9 W/ j8 p  x9 |1 _* ~$ P
  Win32_CurrentProbe
& O6 c, G; R) \/ ^4 C7 y4 g) P+ K) y   Win32_DesktopMonitor0 {/ \  ?8 w! f7 J
  Win32_DeviceMemoryAddress
% R$ O8 L2 B6 y   Win32_DiskDrive
1 e3 O" l* v0 x0 r   Win32_DisplayConfiguration! l5 {( N( n1 `* }! D
  Win32_DisplayControllerConfiguration1 d9 y8 @5 W. ~" N
  Win32_DMAChannel: }3 n7 ], _+ d
  Win32_Fan) X, i0 s$ p4 f% }
  Win32_FloppyController
/ S6 }$ j+ P$ N$ V9 R$ E   Win32_FloppyDrive- x3 \4 Z0 K/ u7 I
  Win32_HeatPipe" e5 L: }/ S$ N8 ]# }1 [. p
  Win32_IDEController
% S) t' x! _2 |, q7 W   Win32_InfraredDevice7 }3 B9 ]4 [9 F& X1 j
  Win32_IRQResource+ G0 m9 X" K9 {# k
  Win32_Keyboard* R0 {+ V% g3 s. j0 o/ L3 A. p8 Z
  Win32_MemoryArray& s+ P2 c# y) F
  Win32_MemoryDevice( P# Q5 @+ Z+ E' f, d
  Win32_MotherboardDevice) P9 h) m9 W& G# ?0 L
  Win32_NetworkAdapter6 I$ o2 u3 K. |- S! H( b
  Win32_NetworkAdapterConfiguration
. N6 i. l) O" {2 Z. O0 F# u& V* x   Win32_OnBoardDevice; v- D' F6 b, `4 ~
  Win32_ParallelPort& W  w1 x: q( X: B) Y3 i
  Win32_PCMCIAController
- Y# O  ]  A7 \2 x   Win32_PhysicalMemory
2 Z9 B3 N0 S, t; @4 ]) c. a   Win32_PhysicalMemoryArray# U: d0 S: m. P0 ?/ w
  Win32_PnPEntity
1 s8 S- w& u# i   Win32_PointingDevice
0 R/ k) ^6 g. Y/ j; d   Win32_PortableBattery
* W0 Y( _  ?4 W8 ]) b1 q   Win32_PortConnector& H3 e  Y! Y5 B
  Win32_PortResource
: d. {! G- b  a4 `4 y3 |   Win32_POTSModem
6 x6 K2 I3 @% x% v/ j   Win32_PowerManagementEvent
! N9 w+ J; _. e" X' k6 H( O   Win32_Printer2 n/ \/ D0 |1 t8 T( W  z
  Win32_PrinterConfiguration
5 `7 a0 P0 _7 q   Win32_PrintJob1 a- i( G, a7 k8 F
  Win32_Processor
% i0 E, E9 V, l5 N* \7 u2 i' I  l* E   Win32_Refrigeration
6 t9 j3 h$ T5 Q0 `) J( h. K! U   Win32_SerialPort. O7 S! Z, Q( ^0 ^8 @) U: O
  Win32_SerialPortConfiguration7 H3 H& W  h  \3 {8 ^3 Y* D2 r6 k( y
  Win32_SMBIOSMemory
" O5 [$ P1 [, l+ e   Win32_SoundDevice% |1 b: E" M( ?2 w; ?
  Win32_SystemEnclosure
" N8 W  ?( }4 n   Win32_SystemMemoryResource% z8 m" C; p. {$ b1 p) b( Q
  Win32_SystemSlot1 [0 F+ g* W1 J! y, A
  Win32_TapeDrive9 K- y2 p7 b; ~& e- _7 S; E
  Win32_TemperatureProbe
- J+ A/ ~4 _' Z+ v  {" B   Win32_UninterruptiblePowerSupply$ b# [9 s+ E4 D2 r" ]+ a5 X
  Win32_USBController
( `1 u" p) P/ a- ^0 g   Win32_VideoConfiguration. r3 Z% F: }+ X  s) u
  Win32_VideoController
# I* F9 U0 X9 c* o4 X7 }   Win32_VoltageProbe8 ]2 f* Y7 O  K- ^6 x/ G
5 l# U, F- O  d
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-16 00:32 , Processed in 0.021236 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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