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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
, H+ a/ w  T, Q% C1 ]% ?+ s+ P. E9 b% w/ L- g+ S  b8 i5 G

' g! P# h% t8 D1 ?2 q% e, v% T, m--------------------------------------------------------------------------------6 s# L1 C- ^) L, {
WMI: Windows Management Instrumentation (Windows 管理工具)& X* b% ^) i) G2 N
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 + q0 H5 g4 M( f: X2 Z
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
# @, h; z. \1 P4 q) U2 d   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 8 M# p7 F" a& `5 \- N6 T
6 u9 J- q3 L4 V( Z: A9 u/ [- n
--------------------------------------------------------------------------------$ x  ^& o5 D. j$ i
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面  `1 }5 D9 t- r
* D0 T- J# I4 I# b; I  c1 F6 l
--------------------------------------------------------------------------------/ X; E" x9 y7 x6 y1 u
① 初始化 COM 接口:
( M& ^6 i: P( P   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
; `( X/ D1 X. q$ a/ m   这两个函数在 #include <comdef.h> 里面定义。( E, T, ~0 F4 k* ?1 Q& P
6 ]# z; x3 s9 q  t, d% D0 X4 F
② 获取访问 WMI 权限:7 y( ~8 F" @! @$ i- K% O4 H
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
% d: v, H9 I. m8 x, V  x" Y! E   如果这个函数返回 S_OK 获取权限成功, 否则为失败。2 C. F3 \8 X5 ^+ {* ]' _
; T( D! F, K- E2 x; ?. E$ y, N
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:! ?1 V1 y: D9 \  w9 i
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。) l3 |- R; i1 l# P- E- Y- x

" A, e# w: v  {: Y$ F6 ]void GetWmiInfo(TStrings *lpList, WideString wsClass)
. E: B* O0 U: @( `4 R9 v" C! V7 o{1 ^( {) i- q8 l$ t& q
  IWbemLocator *pWbemLocator = NULL;
  A* ?! K2 R. t# ~3 `& ~  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
: x3 ?. l3 s) I3 ^  l   {" e4 C4 l/ Q; M7 f" H
    IWbemServices *pWbemServices = NULL;
! Q: E3 i/ t8 J3 [( k) }     WideString wsNamespace = (L"root\\cimv2");" [/ H6 A+ J, x6 [: t1 A9 j% Y
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)  Y" p5 e; S& y9 G6 A% E  J& t
     {& y6 Z0 S+ I) E5 U* G! ^7 l/ b
       IEnumWbemClassObject *pEnumClassObject = NULL;4 z/ a6 |) S: M2 ]! Z  e
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
# h( K' [6 M( E; [, S        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)% h2 d1 D! m# y6 D" q/ p7 E5 h
        {
; ]% U( Q$ i0 X( G: c           IWbemClassObject *pClassObject = NULL;
3 z) [$ y: Q" r4 M. H" U           ULONG uCount = 1, uReturned;
' P) o; G$ \: m) d           if(pEnumClassObject->Reset() == S_OK)# @' h# e; a: F' H' I
           {
3 R' C0 N  O7 y4 N+ x              int iEnumIdx = 0;
5 y, ^. G* }  \6 k5 Y              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)- }( W  T0 e( Z; u" [/ [
              {
. `* h8 b, U+ I. c$ f; D$ \                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
$ i6 V3 F. d& k: x% A/ n1 W- o: `$ v! W
                SAFEARRAY *pvNames = NULL;7 P3 k# V( x. N( t
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)* S' s: Q2 Z* n% v  e; G
                 {- x7 l# s9 Q1 U' A6 L0 j
                   long vbl, vbu;( G5 g1 Y0 T9 W9 Q" f- y) Y0 w
                   SafeArrayGetLBound(pvNames, 1, &vbl);* ^8 k' d. S0 a) S' P4 A
                   SafeArrayGetUBound(pvNames, 1, &vbu);4 g+ \# H7 b8 W% }) r7 z
                   for(long idx=vbl; idx<=vbu; idx++)
% }; ?( _+ O0 U. n! [1 h. e                     {
7 l4 R! _5 {0 i+ w0 m6 n. z4 j                       long aidx = idx;
8 f& Q" E* W: g8 \' b5 ?                       wchar_t *wsName = 0;
  {9 i9 [' ?; F                       VARIANT vValue;
8 `8 p% s6 Z5 ^. `9 `                       VariantInit(&vValue);! }! l( f# b, D% V# t! m& ^
                      SafeArrayGetElement(pvNames, &aidx, &wsName);9 C8 y  ~4 H9 A9 W" L0 Y

6 c' x9 c, s* h2 I                       BSTR bs = SysAllocString(wsName);$ c& a' n2 b* c
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);' c" o' p  Q* ?. L! ^6 O
                      SysFreeString(bs);" P, r7 X; r' p) t

# G1 U: T0 \) b' _% d                       if(hRes == S_OK)
+ ]  v9 @+ D* m$ R                        {% }4 A+ \( X" S" u5 k) W2 \
                         AnsiString s;
5 o+ b, M1 N! Q3 h. `                          Variant v = *(Variant*)&vValue;
7 B4 r' \8 @3 `                          if(v.IsArray())
5 h0 K; M' M% ~) k                           {3 g) G$ L. E/ p1 Y) O0 [$ i
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++). n( v7 ^. h8 k; P: v  I; s
                             {
3 z$ n& k+ R, z7 H3 f* M                                Variant a = v.GetElement(i);& Z0 L) \/ y! y* u8 k4 u. z
                               if(!s.IsEmpty())
5 x5 H" [7 g$ k  G* W8 I                                  s+=", ";
2 A5 G$ u& ~& A9 _$ `; I                                s+=VarToStr(a);0 [# z( n- v8 z; y$ i
                             }
- L3 w5 f2 b  y/ w1 o, T% N                           }& W; R+ p5 K- m. s2 E, W% f, o9 h
                         else
! f, Z+ z% E, F% w% e                           {8 v. T( `0 K" H5 p8 D9 ]
                            s = VarToStr(v);& w5 ^" F: w  k+ |& }8 c$ r5 u1 P4 H
                          }6 g+ |' G1 u6 R4 m) e$ K$ ]; |
                         lpList->Add(AnsiString(wsName)+"="+s);3 ^! u# R# |! x, }! D( L/ |
                       }) E3 m4 k6 {/ H- E& z2 \

) U* l$ b! N2 T6 U6 @                       VariantClear(&vValue);
6 }9 h1 q+ P2 d9 ]/ M                       SysFreeString(wsName);
; y! s9 g7 H) X: \1 U4 Z7 f                     }; q5 D' N: |, ]) |7 n; o
                 }, G2 ~+ O* r, |& d2 `
                if(pvNames)SafeArrayDestroy(pvNames);
( E+ a7 v2 w, Z- J" Z9 d5 C                 iEnumIdx++;
( E' |! C8 }7 K% Z5 J$ v               }
! r) @1 x; X. x            }
- n2 v% W. {& A           if(pClassObject)pClassObject->Release();
( k' G& ]' o# P' [         }
( m# b& K) K# [# f& W/ B& C        if(pEnumClassObject)pEnumClassObject->Release();" P; H' y) `6 A; v" f
     }
' ~* K4 ~0 @7 g  ^     if(pWbemServices)pWbemServices->Release();
3 }$ s6 ]( C2 X$ o& y, c8 R   }
$ U4 D; H2 R5 v2 j) p  if(pWbemLocator)pWbemLocator->Release();
: m* c% c  F; f& U3 D+ @; l}
" J- W9 q0 m8 O) O//---------------------------------------------------------------------------
4 a) u/ ]9 @( a+ t4 W8 b8 ]
7 t% x+ u. P; _! d& s9 X4 O0 Z// 通过 WIN32_bios 获取 BIOS 信息:
( D) b2 X# n7 D) q& u2 Kvoid __fastcall TForm1::Button1Click(TObject *Sender)
$ c* y* `& M  f; N% V$ D) k: n{* Q" L/ Q! F7 p- X3 s' x" t5 U1 C
   Memo1->Lines->Add("================== [WIN32_bios] =================");* |2 m2 H- ~+ d+ D1 Z/ t5 n' o6 k
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
0 x4 A9 B9 _1 I# w    Memo1->Lines->Add("");
; G7 v; P* C7 M3 x; E' B5 c7 G}# u7 `2 r! R- z
' [: @" P5 g6 ]( h9 E6 V  i
--------------------------------------------------------------------------------8 w6 y' Q- c4 U' C  l4 Y5 Z$ f, b0 L+ h

3 z5 @4 ~2 n/ N3 k/ R3 ^% ?WMI 可以访问的信息类型有:2 }( h/ h4 T" a& ~
  Win32_1394Controller' v: m& \7 |1 E- m8 N
  Win32_BaseBoard7 O& m4 r( a. C3 u7 _* m6 R
  Win32_Battery. A5 J+ {# x/ H
  Win32_BIOS
. U2 j  x6 S- y8 Q8 Q   Win32_Bus% a6 }6 d8 l4 [) A- p3 m  z7 v
  Win32_CacheMemory5 J. N0 g  I. x- `+ I5 b8 I
  Win32_CDROMDrive" t4 F" o: ?) P1 H$ t- e1 }" F0 `2 K
  Win32_CurrentProbe
' W7 D% k9 U7 x/ L& g6 o8 _. R3 a   Win32_DesktopMonitor0 K6 I% ~" Y% `/ K* F( m. V( r
  Win32_DeviceMemoryAddress6 v& f" X4 r1 q
  Win32_DiskDrive0 P9 w( x( w4 ]
  Win32_DisplayConfiguration1 i4 y# b: D; w2 x3 B
  Win32_DisplayControllerConfiguration, y) h3 e% m: H- ~2 @
  Win32_DMAChannel
7 e% W1 R: {' d1 E   Win32_Fan
# h& a2 x, _: W6 A9 E   Win32_FloppyController2 s, s! f$ s2 ^2 Z
  Win32_FloppyDrive
, `0 g: z  }* Q8 s8 z   Win32_HeatPipe
# r! A! }, j( i: Y7 T   Win32_IDEController8 s( s5 V- z* g. R/ X% W1 N) j2 W( K+ j
  Win32_InfraredDevice3 l' v8 K. F) j
  Win32_IRQResource% @- g( f# W# z
  Win32_Keyboard
# p9 ?1 U6 N" S2 j   Win32_MemoryArray
$ v) o7 W* c8 z, U   Win32_MemoryDevice
. G% i3 ^' k% B" S! ?  M! m   Win32_MotherboardDevice# V9 i+ Z9 `: Q2 U2 g
  Win32_NetworkAdapter
6 `; D3 n7 K/ @& C& }7 E8 ~   Win32_NetworkAdapterConfiguration( ?! e: j* Z- J8 p! a1 t7 p
  Win32_OnBoardDevice) d: u3 `) n; J3 Z# J
  Win32_ParallelPort
4 Z- c1 X$ T1 n/ I' ~   Win32_PCMCIAController
+ ]3 D. U7 U6 m. R( O   Win32_PhysicalMemory
7 k+ |5 X5 v8 Y  S4 F   Win32_PhysicalMemoryArray
7 s. c  K9 d1 x% W+ T   Win32_PnPEntity+ r4 a, B$ C2 o  P
  Win32_PointingDevice* E7 o1 l7 |6 G
  Win32_PortableBattery
7 P/ Q5 ~5 q8 t2 y6 `4 s   Win32_PortConnector
& `! |0 n( q. ^2 a: \: o   Win32_PortResource
/ K7 D$ r0 O, u   Win32_POTSModem
+ F: W( u' }! C9 L7 p   Win32_PowerManagementEvent2 X! y3 G! N! n1 }& X+ d  A3 N
  Win32_Printer
3 k  _9 f- o+ d% [  W. U. a5 k6 y   Win32_PrinterConfiguration2 v- F0 w4 H) |% T
  Win32_PrintJob
3 s" x, ~$ n$ W! C6 w   Win32_Processor
" u# D* \9 i0 e4 ?1 A/ R# h7 ^: |   Win32_Refrigeration
  K, b. i3 w% q; p+ H6 w   Win32_SerialPort
/ m2 u. H- q/ L   Win32_SerialPortConfiguration
& ]6 Z  T& l  G3 w7 y   Win32_SMBIOSMemory
! I, i+ F* }) A1 {* X$ f   Win32_SoundDevice
: _* b! {9 \, O. P6 m, Q   Win32_SystemEnclosure
+ I& Y1 Z4 C4 L3 D/ b   Win32_SystemMemoryResource
, p7 e- x; D/ }2 I- T   Win32_SystemSlot
8 ]. [) h4 l' x   Win32_TapeDrive
6 Y7 j! l  J( O& u   Win32_TemperatureProbe
( C( c; J# h' I/ m1 u4 q7 q   Win32_UninterruptiblePowerSupply
" E  e' m. A( J$ j% p2 e4 h  d   Win32_USBController( E+ C/ M  K! n' S5 t" h, N& ~
  Win32_VideoConfiguration7 ]/ M+ e  S& b* w2 W. i
  Win32_VideoController
" {2 Z7 ]1 f$ D: a  Y   Win32_VoltageProbe  o- B% l& ~2 g! C

( s3 y" Y0 u! U3 r. X5 p8 F" @以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-21 15:20 , Processed in 0.019835 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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