找回密码
 注册
查看: 13289|回复: 0

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)7 n  k0 ~# `# c; d! G
1 I' f- f( _' d. X' j$ G( E1 z

' \1 q7 h2 q( S. K0 O; s--------------------------------------------------------------------------------
3 }- F; `$ x- H( E& K$ mWMI: Windows Management Instrumentation (Windows 管理工具)) q" ?+ x/ h* j: q
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
7 G* M+ i7 X2 G$ ], ]8 X% b/ L0 d   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
7 T3 g4 o1 f, [' ^/ Q   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ; P1 q7 g5 P9 ], `0 N, N

, X" a6 }/ R4 V; b# G1 Q--------------------------------------------------------------------------------
! q9 }; X  u% zBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
; t2 N; Q6 Z; }& F2 n  V7 L  y; f- f. G3 o( J
--------------------------------------------------------------------------------
: \2 w$ g" U1 E; O8 c0 z① 初始化 COM 接口:6 U0 Q8 F4 i; v* ^4 y/ w8 A
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
" b6 X3 W* U) I4 m4 t0 x   这两个函数在 #include <comdef.h> 里面定义。. \, P& d2 N6 S/ z) p

8 E* V. `% a1 v7 Y- E$ K8 V7 |% c② 获取访问 WMI 权限:" \2 D( k2 d) c/ U+ K
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);2 Y0 R/ N8 V( {
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。& F9 g' t7 M1 z  p7 ^' m( d: ]

2 b- D3 a. H/ p" D3 {③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:' ~5 c! v2 i$ P( y
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
& z( i4 G. Y7 Z6 h3 a$ f3 v: S
: G5 z/ B; r1 o) X, uvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
8 \8 ]. }2 ?$ v{
) b; \4 p, L; ~% V  IWbemLocator *pWbemLocator = NULL;
, b% Z% z* ^: ]3 {8 a7 [  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)! U1 @! q* f' {
  {
2 A8 {5 `; p1 U2 J  k7 j* R     IWbemServices *pWbemServices = NULL;
5 ]- w6 k$ H+ q6 q     WideString wsNamespace = (L"root\\cimv2");
+ c$ o5 J& g# ^: D& |8 }: q     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK): o! m; E/ p6 M  `) U. p
     {
# t' y/ S" K5 b- p" a, B        IEnumWbemClassObject *pEnumClassObject = NULL;
- p7 U( w' y. _: {        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
( a# ^* g1 b8 i. i9 Z$ }        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
( V% M0 @' u/ i         {1 a; \! d) c" g( R9 h5 i' J
          IWbemClassObject *pClassObject = NULL;' h+ ?  D& A5 O* `# N! M% b0 ^
          ULONG uCount = 1, uReturned;& d  z# U3 f* W
          if(pEnumClassObject->Reset() == S_OK)' u1 T4 U# P; Q
           {4 F: @1 a/ |4 H' p
             int iEnumIdx = 0;0 `& v& r3 r# G9 [
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)* l! t1 J( q: @: d7 _2 ~1 a% N& k
              {4 V9 m* j+ Y9 R3 i. c# T
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
  ]8 O. }0 q& f8 Q
; U4 u' q  c  n9 |                 SAFEARRAY *pvNames = NULL;2 W2 |( i! y6 Q9 ^) u
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)$ m$ H" h7 x6 P& a6 C+ x- L
                 {
$ A9 S! s2 L/ Z7 x. o, v" z                    long vbl, vbu;
/ R* }1 x  z+ g* c. W                    SafeArrayGetLBound(pvNames, 1, &vbl);3 c3 K- ?( G7 ?8 a0 h
                   SafeArrayGetUBound(pvNames, 1, &vbu);
8 e3 P' S* z- B; C4 T) _; \9 m5 D                    for(long idx=vbl; idx<=vbu; idx++)
( C6 r# d- ?6 C7 O                     {
0 j' d  @# r4 e6 z' v) H9 z3 t                       long aidx = idx;
; k" u4 C+ B4 v" T: T) L7 Q5 u                       wchar_t *wsName = 0;
3 O, G/ A$ h8 z" T" f' R, D! J                       VARIANT vValue;
; S6 g  q  q7 ~) h8 G                       VariantInit(&vValue);: P8 A3 M4 O. H
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
& v! P. e7 u; D" h
# Z; C8 v. y4 a                       BSTR bs = SysAllocString(wsName);
: f. |& {0 \+ d! [$ R1 l                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
  |9 }8 O  K6 n2 Q5 ?                       SysFreeString(bs);
6 X3 v) e+ o7 z; X. t& F; V0 Q! F- f2 x
                      if(hRes == S_OK)
6 c* L- ]; y$ t6 Z9 M5 J7 y                        {9 |) n7 |7 G+ A# @$ h
                         AnsiString s;6 c& h$ H4 g6 A6 b" [' E
                         Variant v = *(Variant*)&vValue;
$ a( D+ B: `; F2 M( w                          if(v.IsArray())
+ |% X. X/ M6 o; L% J                           {0 D0 ~3 u- L' c. N
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)0 l  C% R  V" ~. s! S
                             {' D2 R' N9 f" {( F. s+ U0 E+ ]' E
                               Variant a = v.GetElement(i);
: I( C1 i; q) Y2 s                                if(!s.IsEmpty())
' c  `7 R  _( J                                  s+=", ";& G" g! R6 d- s0 @" ?' u
                               s+=VarToStr(a);
  C& H. L5 Y' _; ^! v                              }
$ v- ]+ H& H6 ~$ Q: Y+ k+ p2 Y  L# @                           }  C% t' C* q2 {- t. w4 Q  x
                         else
# g; z8 Z  }3 Y6 F4 w. d                           {) t0 \0 O5 e1 Z) j2 n9 h0 ~
                            s = VarToStr(v);
& Q, G) ^: u) S# H$ R  h! c                           }0 u* X- l& o$ A& E+ \( q
                         lpList->Add(AnsiString(wsName)+"="+s);7 Q& @1 e4 y. B/ ?( N5 Q7 [
                       }. |5 l6 q) x9 {: M* Y

1 f* x! X0 o7 L' H  {+ j% ?( u/ Q                       VariantClear(&vValue);
2 H* \9 z1 @$ ?' c  s' m3 A                       SysFreeString(wsName);; m: j8 O) v) M9 T6 l0 j- V
                    }6 H, {1 `" ^: z8 _% x/ f6 h) y
                 }! m& W6 a. \* L: O) ^6 T
                if(pvNames)SafeArrayDestroy(pvNames);+ s* \! m2 v5 Q! Q
                iEnumIdx++;
; M$ D, h9 H3 r8 M, O- a7 E6 Z               }
' p; \& b8 ]- y2 m( H            }
' G' x( {0 D& ~& T4 D- Y+ n           if(pClassObject)pClassObject->Release();: t6 ~  |5 ^4 X+ K! k
        }
1 T9 T  T% s  Q" D$ l7 z        if(pEnumClassObject)pEnumClassObject->Release();
% `9 ]& i0 \( L" E. Q      }
# g, u* w9 d$ |, u     if(pWbemServices)pWbemServices->Release();% F+ O) j1 ~# ~: D4 y5 Q
  }
# F9 F- x6 ~' x) ?$ X" v  if(pWbemLocator)pWbemLocator->Release();
# f8 L  X7 ?2 m, S}1 t. Q8 v6 p3 a7 l
//---------------------------------------------------------------------------% t: w, p# i4 \0 _

" Y# J2 @1 J* C, R2 J4 m// 通过 WIN32_bios 获取 BIOS 信息:
$ m* Q; E/ V' y. a' |2 qvoid __fastcall TForm1::Button1Click(TObject *Sender)% r: d8 S! V; w, X& I
{
6 C# I: q+ ~2 n1 T( o    Memo1->Lines->Add("================== [WIN32_bios] =================");
8 B/ j  G, ?9 E+ L9 H' P    GetWmiInfo(Memo1->Lines, "WIN32_bios");
; X' j) L4 }8 a( ~7 T    Memo1->Lines->Add("");. i; A( c- u0 M9 t" V4 {. p2 d
}  S3 T! I$ f* ?
, R7 a& G" b# E6 q& N
--------------------------------------------------------------------------------- ?$ G  [, Y- C- O) V9 i' k" }
0 T4 X9 @" y5 y! @7 \; a
WMI 可以访问的信息类型有:# z: p: F$ u' x4 m- W; g0 d4 L% T
  Win32_1394Controller  S: H0 M: v+ c& {' d
  Win32_BaseBoard
8 D5 i# k. O; a' o8 E0 f( r# N   Win32_Battery0 A$ t: f1 ^! H" X$ ^- F/ ?
  Win32_BIOS
3 S: h5 h2 l& \" a+ z   Win32_Bus
9 M. j. H0 A$ I  C! S   Win32_CacheMemory+ C9 `/ X4 Z/ O7 h
  Win32_CDROMDrive
  z3 W- Z4 Q# Z   Win32_CurrentProbe3 d/ U, S6 W6 G$ l, x/ W6 K
  Win32_DesktopMonitor6 ]0 s  n/ Y( l5 U' W) r4 U
  Win32_DeviceMemoryAddress
2 n1 n" |' \1 E8 j+ w- s   Win32_DiskDrive) k2 H7 x1 ^0 {4 O
  Win32_DisplayConfiguration5 U9 D1 h! H& \9 [/ f- a2 t) @
  Win32_DisplayControllerConfiguration
0 b5 Q2 `7 b* S$ b/ U   Win32_DMAChannel* W7 I# q1 R) s0 u8 D$ C
  Win32_Fan
  P7 V6 i- Q7 y% z   Win32_FloppyController
/ V& b4 K5 X/ x$ L+ h% S7 \   Win32_FloppyDrive
- E' n7 m' q8 D" Y/ j2 J* n* Q& U# o   Win32_HeatPipe
2 x% t" k8 K/ @9 d( Z8 {   Win32_IDEController
, O' ]. ^  R) k, E" p, x7 l   Win32_InfraredDevice
' t$ g7 \, d6 A! r, }   Win32_IRQResource. C) @% {8 J$ m. \7 t9 r* m
  Win32_Keyboard8 ?9 D! _! n1 J8 p% g5 ^
  Win32_MemoryArray
" V1 ?+ [% m( C; A( H, A# |   Win32_MemoryDevice
$ u6 P' X6 T/ }0 c' F2 `   Win32_MotherboardDevice% V# I$ O9 l$ c) y- v
  Win32_NetworkAdapter
* L9 N: ]+ a# P   Win32_NetworkAdapterConfiguration7 T' x4 Y4 A4 m: O3 |% t( a$ t
  Win32_OnBoardDevice. \& a' I9 n) p* D& [
  Win32_ParallelPort& x) O% ^: _4 _: o2 Z3 Z9 g
  Win32_PCMCIAController
! @8 ~; V! y7 H8 a   Win32_PhysicalMemory$ J. i4 @5 k! ~: R4 h& ?7 n
  Win32_PhysicalMemoryArray+ @* A- P6 `2 f+ {  y
  Win32_PnPEntity  n) ~2 w; e, G# u- k# W# k  e
  Win32_PointingDevice
  ]6 V1 U1 a8 }5 x   Win32_PortableBattery
9 X6 x% v& i# Q4 g% z; ~   Win32_PortConnector5 }) N* \2 W' ^' p5 s$ Z! u$ n/ ~
  Win32_PortResource: @& S3 q* ]0 \: s
  Win32_POTSModem
. G1 J. Y; @3 k9 ~. o( F   Win32_PowerManagementEvent
$ v7 x% s7 l- P8 s( ?   Win32_Printer
- L3 E" o# A% ?/ L) O   Win32_PrinterConfiguration
( V1 S! S6 Z6 s7 i$ e1 Z% ~8 h   Win32_PrintJob* t( L& B$ e/ t, i4 K5 H
  Win32_Processor
% C5 [" n( V4 e4 _7 L) T: ?   Win32_Refrigeration
' v! _3 C5 p8 ^  [! K' l   Win32_SerialPort8 P: B5 ^/ I0 |
  Win32_SerialPortConfiguration
. ~+ R" m! R. S" C' T   Win32_SMBIOSMemory# E: H3 c% x% e
  Win32_SoundDevice7 S! Z) ^: J+ r, S( ^
  Win32_SystemEnclosure
. S3 }- s" L% v$ S! i0 E( u2 j/ C2 |8 O   Win32_SystemMemoryResource. @! W) i* Z3 \
  Win32_SystemSlot
5 H8 D* f% W) B6 t4 b0 v   Win32_TapeDrive
' i* `$ R( o& D  C7 `! W" d* |# S   Win32_TemperatureProbe
4 d: X$ U! u6 w4 v% h   Win32_UninterruptiblePowerSupply/ y7 j8 \# p, \
  Win32_USBController
* \/ z- ]4 L- X   Win32_VideoConfiguration
4 C) ~* u, {& w% Q1 e. L   Win32_VideoController
! ?/ z/ {. N8 b5 _* {. I, x% h   Win32_VoltageProbe
  T: x2 q* K5 W/ Y
: |2 w4 x! G3 a6 x/ ]- V3 Y6 _( z以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 07:30 , Processed in 0.018018 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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