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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)8 b' G6 f- Q' e; w- G

2 P0 G' K0 s* y9 m4 }
3 J! O" }6 w$ J: b) Q- z: }--------------------------------------------------------------------------------2 s1 q  h# c1 U! K" D* D
WMI: Windows Management Instrumentation (Windows 管理工具), T7 q, t) e0 K
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ! y- ~% z  }9 ~
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
4 l+ C7 ~$ |0 K+ V5 z" \   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
' B0 |. _3 V) o, a) R2 `7 |
& C' J4 T1 G) z) D& L--------------------------------------------------------------------------------
0 A: q) E% \( D' F8 t; C5 A; xBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
( K. F7 x# L0 U1 y, k7 Z* X
. N& K! A/ E: V% u--------------------------------------------------------------------------------
: D  ]" {$ Z" e  T, x% {# w6 y# J8 r① 初始化 COM 接口:
+ W$ l4 V. P0 ^+ J9 t" e   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。) \! o. ]1 \5 u) R
  这两个函数在 #include <comdef.h> 里面定义。* o1 r$ g( d4 j1 ~5 q1 K% h9 u# S

, H; x- Q# q0 |" }② 获取访问 WMI 权限:
, @1 |/ }. j% j5 \! j: j) N3 o   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
7 J" V3 c' c' U' C6 W   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
- x- F0 j" W# e
0 ?$ ]$ U* S; _4 w# @) V③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
; e1 o. O0 s5 B" f1 ^' f: B   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
6 Z. g; l! G+ i8 o: X- V; O5 a$ v# n' f6 `. o$ N( ^2 Q+ r
void GetWmiInfo(TStrings *lpList, WideString wsClass)
1 e2 Z4 A' s8 c5 }9 |) I/ @{- A4 N# }$ E, l! ]1 m  a
  IWbemLocator *pWbemLocator = NULL;
+ n' G( v" y) G5 ~4 M& h  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)% M+ e4 P5 G* W% j" v
  {/ Y( z7 x) A2 ]( s1 F2 [
    IWbemServices *pWbemServices = NULL;
9 e( C+ h, Y$ q' s6 {     WideString wsNamespace = (L"root\\cimv2");6 c/ N" q! ~1 T- P! C; U
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)" g+ @7 Q' ?5 y! N
     {
" r& h1 `& B0 x/ |        IEnumWbemClassObject *pEnumClassObject = NULL;
6 b8 r& Y% L9 ^. b9 D" S        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;, I( h5 V4 g$ n& W! A
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)$ _6 V9 t: T; P; M1 f7 u8 W
        {
# ?$ _- q* ^- b( A0 \1 r           IWbemClassObject *pClassObject = NULL;1 O7 T& p' J/ N: }2 I- y" V. \
          ULONG uCount = 1, uReturned;
" o* o7 q. c  p  \) Y  j4 K           if(pEnumClassObject->Reset() == S_OK)
  k/ ~/ T' M1 }& i0 O            {) X0 b& H% P5 H% d2 x
             int iEnumIdx = 0;- h& Y# X& _, ~+ x
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
: @2 w- I% X0 T3 H0 Y3 [; |( D               {# p5 b0 J2 x/ C6 `/ n+ L7 E' m
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
' c, [" c/ j, w6 w; a, l5 |; ?% [6 d7 F
                SAFEARRAY *pvNames = NULL;
. w4 R; E0 a  K" \( X! Z1 \) e' B                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)' Z! h  C( N3 H: E$ w
                 {
* ]+ i/ h, ?  c  T& b/ N                    long vbl, vbu;, y7 w: A0 R- Z. w1 O
                   SafeArrayGetLBound(pvNames, 1, &vbl);/ t! L$ h; Q/ J4 n
                   SafeArrayGetUBound(pvNames, 1, &vbu);& T- D3 X: ~2 Q) [' ~3 T8 H- m: b
                   for(long idx=vbl; idx<=vbu; idx++)$ y7 ~2 t1 R* C& }/ o4 P! t8 z
                    {
1 y$ \; c& O( w6 p                       long aidx = idx;
8 g4 A6 Z* I- Y: s                       wchar_t *wsName = 0;  @2 V* R7 P3 u4 S) ?2 V) C) z/ N
                      VARIANT vValue;; a. f: s$ L# P8 I3 m
                      VariantInit(&vValue);1 [* Q' ^; F0 p9 E2 T
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
9 x2 V2 X4 J6 u  C8 _6 {. v4 h' @- p+ I! Q- ~8 J9 ^5 s! o2 O$ S) ~3 M
                      BSTR bs = SysAllocString(wsName);
& m% R' p2 t+ T7 o                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);2 b# f/ P; d) Q% `. c; _" B; S
                      SysFreeString(bs);* k" t+ q, r1 H

, b3 ^4 w, d- T                       if(hRes == S_OK)
, L# O; q0 _; w                        {
7 u& M! y4 {! g4 h5 v                          AnsiString s;
/ U0 {3 H2 l8 U, K5 j+ p2 l, r7 h) C: _# Y3 p                          Variant v = *(Variant*)&vValue;
0 t  I! @% V# O  p5 e3 ]# p                          if(v.IsArray())
, l  Y/ t7 \/ ]. p: l! x) t: R' p                           {; y/ b9 z; K3 q
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++), H0 o# j4 K2 Q" ^5 |) G% r
                             {- U5 f3 @( R, i6 R* b4 S! D
                               Variant a = v.GetElement(i);8 R" C& `: r4 s6 ^  P2 z
                               if(!s.IsEmpty())( ]  E. ~) P0 Q) v* M* e! `' E4 o7 C
                                 s+=", ";: b1 n+ R" {% m
                               s+=VarToStr(a);2 E% V# X  q0 @% R5 B! I
                             }& {$ S9 F/ K5 \3 o- ]
                          }7 X7 o4 x) n# t. L) k9 q  x
                         else
: ]4 W! W, ?  T4 E! ~* N* V                           {
& I4 t" P. Y5 Z) F0 r                             s = VarToStr(v);
* D: C1 u+ n5 |4 N                           }9 b% I% l1 a/ {; v1 M) Z
                         lpList->Add(AnsiString(wsName)+"="+s);( ^  ]6 q, h& S* q: }! z( l% C
                       }
: A* o4 j4 C+ L- `. [! W
5 a1 c! ^: C7 N/ g. p! {                       VariantClear(&vValue);
9 j3 {+ z: A; D+ L                       SysFreeString(wsName);
+ g4 R% g6 P. _  W                     }
' m8 A+ w) c5 a0 q                  }
5 B: I% L8 M% M9 j                 if(pvNames)SafeArrayDestroy(pvNames);; @- v7 [- N" Q
                iEnumIdx++;
* z9 @( t% Z6 u               }
  O* J; m( E% {1 m; H7 ~            }: z4 F5 y, o( r( X4 @: W
          if(pClassObject)pClassObject->Release();( X4 h3 x6 H; T- ~, l
        }
6 W: Y% p# c" K" f        if(pEnumClassObject)pEnumClassObject->Release();# u, U) t" h# M, s* f: O+ C+ L9 M
     }: H( b( |; e/ @) ~4 n% U
    if(pWbemServices)pWbemServices->Release();
, j: }  F5 ^' x% O3 J& K   }8 I% ], F3 C6 o4 L* R8 c5 w7 q
  if(pWbemLocator)pWbemLocator->Release();
" i; N* |5 U" C! B* N! m) I}) ?5 F* E/ c1 j9 e8 L' \8 W' t# R
//---------------------------------------------------------------------------+ c  `$ A% b) T4 P9 D/ p
# @8 o( @2 g5 A  R4 y- H
// 通过 WIN32_bios 获取 BIOS 信息:9 u% a4 M: h, l0 g/ I" \
void __fastcall TForm1::Button1Click(TObject *Sender)4 [* X5 Z& R5 h' f: p
{  p1 \* U4 Q( ^  l& c
   Memo1->Lines->Add("================== [WIN32_bios] =================");6 R' N8 p' |  A
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
  o. S& i6 q: o) [2 j    Memo1->Lines->Add("");% f( [  d. J% [3 u# @
}
! B% Y; G' P0 p1 ~' g+ T
' e; ?$ W, q4 I; @$ {9 r* J--------------------------------------------------------------------------------9 T8 o! k. W8 M& {" R! o6 k" O
7 Y: @. w8 E+ V
WMI 可以访问的信息类型有:
6 I# |* `& a/ o' C9 x4 X( b. q   Win32_1394Controller1 D( f; l# P7 b- g2 `& h& Q
  Win32_BaseBoard
% c  E, F3 x" `" E   Win32_Battery7 Y7 J3 h* G0 V. Q" i/ q
  Win32_BIOS
0 s( t! G6 L2 q% Y1 Y6 [/ y1 G   Win32_Bus+ e! T1 g- {  H# O
  Win32_CacheMemory
3 j* M& M" p$ h   Win32_CDROMDrive4 ?8 |6 ?' j# o5 c. F
  Win32_CurrentProbe
/ r& T, y9 y* @1 C   Win32_DesktopMonitor
. Q* s/ S2 f& l% S! s& J   Win32_DeviceMemoryAddress
( Y5 q& n, E1 M* p8 T6 L& B4 K# B   Win32_DiskDrive
! L8 g) A9 g2 ^) c+ a  b( B$ V& T   Win32_DisplayConfiguration4 n  b$ ?- ~& i6 `3 z- y1 R& q
  Win32_DisplayControllerConfiguration4 b) `( g1 g+ l! O/ T& R. a
  Win32_DMAChannel
9 J+ m0 P; ~5 H" I  [& q   Win32_Fan- d6 H( |$ i& A% N4 A2 y0 B
  Win32_FloppyController. J, V  o: n, @0 K) M
  Win32_FloppyDrive! {/ ^( \: \/ l5 O' e
  Win32_HeatPipe
7 {: t& Z, ~% Q6 Z) T$ }! v& e   Win32_IDEController
+ W, I2 g$ Z- }   Win32_InfraredDevice4 {$ t5 _; D# Y/ y$ A: f, K
  Win32_IRQResource7 i& N, j% g; m2 k8 \$ Q, T& @
  Win32_Keyboard* r2 f0 s. r+ _- n+ f6 p9 G2 |1 C
  Win32_MemoryArray
+ s+ {; L( c9 o- k   Win32_MemoryDevice1 |: O* s) \& O  R
  Win32_MotherboardDevice# F: n* ]/ O' ~5 _# Y
  Win32_NetworkAdapter5 c1 N! X, n6 {8 \/ a) L" o
  Win32_NetworkAdapterConfiguration
4 E+ B" p) B, A! b& _   Win32_OnBoardDevice
+ N/ B( v; L  d/ F. ^! M1 g# T   Win32_ParallelPort- ?4 H& ?* E- v
  Win32_PCMCIAController
0 l* h* Y7 t8 ~2 W2 e   Win32_PhysicalMemory
; n- B) t8 _" a; q   Win32_PhysicalMemoryArray
3 V) x+ o& ]8 m& p+ t2 L% V   Win32_PnPEntity: [  H- v# X- `  y& ~5 q
  Win32_PointingDevice
3 Z5 u; W7 L0 u% r, l: ?0 Z   Win32_PortableBattery# x4 q: \5 Y: n0 r
  Win32_PortConnector
/ s; E& R; T! C/ A5 l) M2 |& C   Win32_PortResource
* |8 M" T) ^/ `1 e* P   Win32_POTSModem
) ^1 L9 y" G8 X* l0 n  i   Win32_PowerManagementEvent
' ^+ J- ^9 E$ o( N   Win32_Printer
0 S# J! X& w: v  Y   Win32_PrinterConfiguration, ^2 d* s% [# h, h: @) m
  Win32_PrintJob
$ z: Q: @% Q5 S' ?; Y( V1 u; P8 S   Win32_Processor  r" S8 H8 r) h2 F& x( ]$ f" z) d2 S
  Win32_Refrigeration
* s% r$ B5 i* e' ^# \6 Z   Win32_SerialPort: Y5 y% x; ^# N- v' x  W
  Win32_SerialPortConfiguration+ A) a- W+ c/ x% ]6 I
  Win32_SMBIOSMemory
" k' |$ @3 ^+ t! _7 R. O   Win32_SoundDevice7 W7 M9 _% `5 H9 p- e1 y
  Win32_SystemEnclosure# H; d: F. A, V0 p' Q
  Win32_SystemMemoryResource+ _$ l$ ]4 Q$ I, r/ U* y+ y
  Win32_SystemSlot
0 k+ Y$ m) g5 h# y  M/ j) |$ x( S0 D   Win32_TapeDrive
8 D7 S( x/ M4 q3 }+ e* E   Win32_TemperatureProbe
* L' a* b- o  M. w1 R   Win32_UninterruptiblePowerSupply1 |# r/ P3 ?* m; A3 o
  Win32_USBController
6 U2 e/ M9 P% }* |) n/ j, ]   Win32_VideoConfiguration
. ~& J  N  I7 w2 T( b7 G  r   Win32_VideoController
9 ]# s: [$ L7 N% [   Win32_VoltageProbe4 A; s7 x% K! N0 u4 O" Q

* }, d6 ~, z0 ]$ d" e3 T7 `以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-2 22:12 , Processed in 0.019005 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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