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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)2 \. r; b9 Z. N0 f' h
4 k9 j- e# L+ R* U$ O

2 A' a# M1 u) u# _! I--------------------------------------------------------------------------------# l) N1 R8 L8 c, _# {% l2 D4 u
WMI: Windows Management Instrumentation (Windows 管理工具)7 J5 Z  s) g' }7 C. M& c8 ~( y
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
* Q, z! g! \  T- {+ o   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
& @9 |. \/ L3 R  `3 E4 v   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
1 Z* G) e( j. T+ x$ o8 h; e7 N9 ]4 R) K! f! ^+ X6 O3 f
--------------------------------------------------------------------------------4 }# u: g. P: U, a
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面) R5 f+ W: o' O2 j( ?
) D, {$ w+ L  E9 w6 r
--------------------------------------------------------------------------------8 I& e2 L( {. k* B/ g/ w. \  |
① 初始化 COM 接口:! X* Y8 L( ~' Q* _
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
2 U" J; m! j: b' s$ M  t   这两个函数在 #include <comdef.h> 里面定义。2 p$ }2 Q4 [( x2 h
: ~% K; m; \8 H( X; w1 J& u
② 获取访问 WMI 权限:
4 M* |% X4 Z! M8 z5 Q   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);( P. o! N2 D. }; e
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
0 u& |% K# y: g: c2 k9 c" Y9 V$ E* ^) z9 D
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:4 K. u8 h0 n! @6 X& T
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
4 }5 K9 b; }/ S# t8 c* v; l% B9 D, @& i% k( O% P
void GetWmiInfo(TStrings *lpList, WideString wsClass)
! \* S% P' g5 B+ X2 O1 H  _6 \4 F% _{
: z0 l' p0 t' j; ?3 ^  IWbemLocator *pWbemLocator = NULL;
/ r% B1 k+ W, S% u4 _) i5 Q0 q  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
! {) h' t) D" u7 O* `/ K   {/ u( z, K+ N8 z1 ?8 v! r/ v
    IWbemServices *pWbemServices = NULL;' M5 k* q- m# `
    WideString wsNamespace = (L"root\\cimv2");
: O5 D7 e; o/ f2 {$ ~% e     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
. q  Q9 u6 C# l/ n' X# e0 [  W      {
8 X6 F7 O5 G$ C& x& A9 Q$ h! k# F" a        IEnumWbemClassObject *pEnumClassObject = NULL;  h: h% o9 l3 I
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;. I4 p8 F5 n9 s" _7 N4 g9 A2 u
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
9 U) n2 r. _5 q! @- i) {         {
$ `# i/ l' ~4 Z3 F7 J/ p7 Z% g           IWbemClassObject *pClassObject = NULL;& C1 V9 E1 U* i8 R( ~  @% E
          ULONG uCount = 1, uReturned;0 Z( U9 J) K* [& M
          if(pEnumClassObject->Reset() == S_OK)
/ G4 L: K8 J1 u: E6 c' g            {
9 I# w# C/ n& D8 E2 v              int iEnumIdx = 0;8 G. w$ q, U$ O0 f6 l
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
& z2 B5 ]8 R1 q7 C               {* ^/ E  ?% G, }- C8 T
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
3 ~8 `# n) e; j, u
: X/ e% G' o  k7 V% I                 SAFEARRAY *pvNames = NULL;
% ^- A, x2 {) [4 k4 l' Y0 r; K                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
+ {& g/ }2 B( L- Y- S                  {
8 @3 q& s" E. a) Q- D  I) c                    long vbl, vbu;  }+ e* J5 N" J' d; e
                   SafeArrayGetLBound(pvNames, 1, &vbl);
4 m' Y/ C% h8 K4 j$ z                    SafeArrayGetUBound(pvNames, 1, &vbu);/ Y4 A2 h8 Y9 x# p
                   for(long idx=vbl; idx<=vbu; idx++)
0 z* P& ~( e( w5 ~" Y                     {+ b3 a+ _, t% A3 q, |
                      long aidx = idx;  I/ _4 G. q& g3 `( ^2 O5 t
                      wchar_t *wsName = 0;
2 T' w7 F, k5 T9 W& {+ o                       VARIANT vValue;5 \3 C' g8 R! B, n
                      VariantInit(&vValue);' l. R9 j1 P- O6 p0 q4 p" i
                      SafeArrayGetElement(pvNames, &aidx, &wsName);- h; C( }2 Q1 B+ d/ L! A- r

" x/ j% u+ F' x5 z1 T$ C                       BSTR bs = SysAllocString(wsName);
- V/ x. o$ c1 w2 M                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
: R  ~. h$ O1 a3 k" |' G                       SysFreeString(bs);: [# W6 A0 ?8 \$ X7 {6 f+ P
* U% O$ n+ z& O; X; e) t
                      if(hRes == S_OK); h: h& u0 t( ^
                       {
; b2 P) j+ F  q( g. ^. f9 N% ]- o                          AnsiString s;
$ ?. o) J$ A) D- }. Y, u0 i* x# r# U                          Variant v = *(Variant*)&vValue;3 e2 y" a4 T8 u: `2 R: f
                         if(v.IsArray())8 y$ [+ J$ o9 N3 Z# @, O3 Y+ `
                          {$ V' F2 N& @3 ]6 w2 ^
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
, g0 x' l2 |/ J                              {" A7 ~6 K% Q9 }& q# k
                               Variant a = v.GetElement(i);3 J/ v  v6 `4 \, z2 q* |6 K
                               if(!s.IsEmpty())
* b+ z' ?0 _6 i7 M- n                                  s+=", ";/ B1 E, X- \. _9 M
                               s+=VarToStr(a);5 C/ P6 \! e( ^# s+ U0 X: t9 z
                             }
$ {( j$ k/ k0 }4 c" @                           }( o9 H- D7 C7 _( J" |0 q
                         else
% h# A  _& W$ m5 I2 H                           {
' g9 {( O' Q. M9 O, G( q                             s = VarToStr(v);7 w# E. l$ i( S1 b
                          }
: l  V! [! r5 i% C                          lpList->Add(AnsiString(wsName)+"="+s);
6 A1 V' ~' m4 ^& x* M2 E6 i: ~                        }( m: A8 ^, a# e) ~' e7 m
0 w! B- D) ?; U; J7 o
                      VariantClear(&vValue);
8 |( p& \- I9 W- E4 X8 E                       SysFreeString(wsName);
' R& P1 ^; c* ]* w/ P4 B4 [! W! t                     }
! g  `  Z6 `9 D$ q& b                  }
0 R) u6 Y* U, U" k$ I, m0 T                 if(pvNames)SafeArrayDestroy(pvNames);
4 F6 C0 S1 T. B7 N                 iEnumIdx++;
. ]8 |" g2 r4 ^# B- h4 k7 ^$ Z               }
! F9 }' c2 o& B! t  p1 C" B            }
4 e1 C- n4 u+ {( R4 P- O           if(pClassObject)pClassObject->Release();
# [% K, J9 }1 k( ~% b+ n         }
+ u0 }- z5 P% i+ ]- K0 s3 u6 j! x        if(pEnumClassObject)pEnumClassObject->Release();7 {  j: B/ D4 G9 X8 j
     }3 N$ Z  H  a4 N" j3 A" Z
    if(pWbemServices)pWbemServices->Release();
+ v6 \+ q/ [! ^   }
; B$ ]5 J+ @3 }' s% j: ~0 F  if(pWbemLocator)pWbemLocator->Release();" z2 |( y' w. N
}
5 H9 t4 s) A" M3 x. h) h) B% G//---------------------------------------------------------------------------% u2 Z* @/ X# P6 |
* ?% X3 }7 Q/ m
// 通过 WIN32_bios 获取 BIOS 信息:
* O$ h: w% j& v4 C4 Z) Cvoid __fastcall TForm1::Button1Click(TObject *Sender)
+ l7 P2 z, \  D. s7 C/ s% k" p) u{
1 @+ A# Y, F& j+ A2 c: [2 V! O  J    Memo1->Lines->Add("================== [WIN32_bios] =================");: v! K) h4 y- b2 y: E  y( @
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
0 s5 ?; \. [5 I    Memo1->Lines->Add("");! t8 n5 g; O+ C0 \+ T! {
}
5 p& c* m; z9 `* k& K5 [2 m% N( P( S" r
--------------------------------------------------------------------------------
! H, A1 u5 d; G4 F5 T  s6 K! X6 E9 ~
WMI 可以访问的信息类型有:
+ j* T' ~2 r+ F0 R8 }6 G   Win32_1394Controller$ l' @4 s% t+ Y& M% f% z
  Win32_BaseBoard
$ G5 C0 K; Q3 |. Y; A$ C2 k5 E   Win32_Battery+ V$ S  p& |- o5 M3 A! [5 E
  Win32_BIOS
0 c- u( O6 m' R' L2 Y. X! ^: e   Win32_Bus. D5 F( n) V" m7 [: W& j' C3 D
  Win32_CacheMemory, Q$ Z. E9 R* v+ m4 `
  Win32_CDROMDrive# S8 P& X: I" D7 r+ r6 {+ h
  Win32_CurrentProbe
3 {) q3 G. P) `8 ?   Win32_DesktopMonitor% I; s% }5 N/ e0 @: L, d
  Win32_DeviceMemoryAddress/ A9 e- Y+ l# `6 H9 f
  Win32_DiskDrive. l2 F, c8 c# v1 B; b
  Win32_DisplayConfiguration0 Z+ V% w; X3 k" s. o7 X6 ]
  Win32_DisplayControllerConfiguration1 X- A. o0 j; M9 w
  Win32_DMAChannel0 H. c- e7 F# V6 y5 O
  Win32_Fan; x1 U6 Z" ^8 f' ~/ q
  Win32_FloppyController
# h# \; o- n' T$ Z# p   Win32_FloppyDrive
7 c6 q4 `! E  k: Y! _% w   Win32_HeatPipe
6 l4 h) q5 W+ D3 ~- u* j   Win32_IDEController
# ?  A; _5 h" p7 I% o6 V   Win32_InfraredDevice
, X  u) n  k" r   Win32_IRQResource
% e' H6 G1 Z6 M$ V   Win32_Keyboard4 U" M& o& V; N* ?% Z6 K2 X" K
  Win32_MemoryArray0 \- i2 ~5 @/ u7 b( C3 R4 V) B/ K
  Win32_MemoryDevice% L$ w8 A6 Q: U8 A" O& C0 @
  Win32_MotherboardDevice
1 K$ `) A5 S, N5 g9 N! I& p) c   Win32_NetworkAdapter
& c$ t% {% R6 H  B: a   Win32_NetworkAdapterConfiguration+ S5 B; N4 R* x& p8 p
  Win32_OnBoardDevice! U1 t5 b, [2 X. @/ ^" f
  Win32_ParallelPort
. v! m* V( [* m* ~$ u  b8 c/ v   Win32_PCMCIAController6 T2 H) P) h3 A  [( @2 G( \: M0 ^3 i7 O
  Win32_PhysicalMemory
/ T! r9 G- \1 l6 x0 x   Win32_PhysicalMemoryArray- Q5 d8 }8 {! u4 q
  Win32_PnPEntity9 ?- Y5 ^; M5 H; Z$ w& K& A
  Win32_PointingDevice
, j7 C. k: O& H! ?+ ?   Win32_PortableBattery
$ ]! N: M& I7 @1 a   Win32_PortConnector  W4 K8 _' D/ T4 z; n0 m1 s
  Win32_PortResource
1 U- a# v2 E: H- q   Win32_POTSModem
( r5 D" G; A2 w; X2 n  W( }1 ?( ]   Win32_PowerManagementEvent
6 l- [: }# [$ M8 B   Win32_Printer$ y2 A- v7 s3 I8 T
  Win32_PrinterConfiguration
8 S. b' ^. b% s4 E9 s   Win32_PrintJob. g4 b  z  m6 X) r. D
  Win32_Processor+ E! |1 O. J5 b: r5 w0 R
  Win32_Refrigeration& ]4 V5 M7 u8 `6 s( ^% j5 a, w
  Win32_SerialPort
# p5 ?9 H2 K' M1 ^  m9 z   Win32_SerialPortConfiguration: l( P) s% Y6 Y
  Win32_SMBIOSMemory
+ [  c1 A3 [6 Y! Y8 ], {+ C& x7 y( B: e3 x+ e   Win32_SoundDevice) s" A3 l1 l( e( d& H/ C
  Win32_SystemEnclosure/ l# r# G7 n: o0 }7 |
  Win32_SystemMemoryResource3 O& S" k, S! ?0 R1 u9 [2 }' O
  Win32_SystemSlot
, W1 C# Y, ^3 A: A+ K   Win32_TapeDrive& n4 P- b& |  Y1 A& I/ E3 z) O
  Win32_TemperatureProbe- @2 ]/ \7 i; g9 ^' v2 e
  Win32_UninterruptiblePowerSupply
0 C2 q; ^8 b5 W; n, }   Win32_USBController9 \$ ^  k- G. f
  Win32_VideoConfiguration
' |- B2 X1 H) L3 L; {! D# t   Win32_VideoController
" t- H( ]/ X8 h# q- l- J$ X! m6 K   Win32_VoltageProbe
6 b9 u+ G0 X0 ~
7 K. {- ?- q8 Z" v% \* n4 G5 j0 D以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-6 17:21 , Processed in 0.023114 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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