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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)) v! _! a8 h" j2 h' P/ t
2 d( G4 ^4 f( W' i

: r3 i2 T. N! W( e* g' \  ?+ _. z--------------------------------------------------------------------------------
7 x) q" K9 d( `+ }' s& w) ?7 Y) WWMI: Windows Management Instrumentation (Windows 管理工具)
7 Y" [( j8 W3 O! v0 K% U: V7 N$ r   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
1 x# w" r7 ^: i+ Q8 f; ~   利用这个工具可以管理本地或客户端系统中几乎所有的信息。( j5 o* [( v* u1 b1 {
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
4 X' Y" w# H8 F8 L. x" v
9 [) s0 e  k! x$ w8 I+ u( v--------------------------------------------------------------------------------
( j2 O4 |) K) R: J8 _, IBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
. b. O! L, I8 t3 N* s. n9 ?* T" ]+ Q2 H$ K
--------------------------------------------------------------------------------
% o4 \0 V( q$ [* M9 R$ a① 初始化 COM 接口:
( i& d2 J5 Q( r5 ?% h1 Q   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。2 o3 l5 K; m- r# p1 ~& h
  这两个函数在 #include <comdef.h> 里面定义。
( I# s! y3 K+ H2 m
/ x7 \- c7 c, d8 F② 获取访问 WMI 权限:' z, g0 L: A/ }/ Y/ L
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);) l9 U  C" X# X6 \- A1 r
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。" V, u; i6 ]. a, p0 s. C; Q

% u$ c) {  B( k3 j③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
! }& E! b- _+ L) z( P$ ]) L   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
: I) L7 e$ I5 C
8 w- ]/ j% d$ l0 Yvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
) a9 N1 r9 G! E{
4 P$ i0 Z6 x# o& L1 [  IWbemLocator *pWbemLocator = NULL;
: X. S& ]1 V% }- D* |8 a  N% D  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)0 L9 P' W7 N: g7 h/ i
  {; ?6 y/ c" b" _: c* f
    IWbemServices *pWbemServices = NULL;
3 e, L" ~" S! J" H* c" N     WideString wsNamespace = (L"root\\cimv2");
' b: `4 X, {* H3 s9 t     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)9 K" I+ E8 e3 T1 _
     {' L6 M3 B: l1 b% |( D9 W: e# |
       IEnumWbemClassObject *pEnumClassObject = NULL;
. v1 c( [7 v! A  d; I' ?' C        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;" `8 q9 J9 T3 A: R1 a
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)* G- ^2 t3 e4 D6 U
        {
3 ]$ L, i6 O4 @5 }) X           IWbemClassObject *pClassObject = NULL;
6 M& G) f' r+ h9 k, |           ULONG uCount = 1, uReturned;$ i. B4 y% e4 t
          if(pEnumClassObject->Reset() == S_OK)
6 A8 y: k, f; K2 H9 U: E' y7 V            {# [  `1 \5 `, K
             int iEnumIdx = 0;
/ v# }: S2 n, z& s: m  X/ _              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)1 h, H/ `4 U3 f0 R) {+ @7 X7 Z
              {
# H9 q( k3 p+ _6 i8 z                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");$ T6 y) O$ J8 V. r4 J
% ^& V9 T5 c; F9 u$ _* l1 D
                SAFEARRAY *pvNames = NULL;( j$ l% Y  f; D2 q. f# l
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
% u" H3 F1 b( h+ I& Q                  {7 X+ K! b+ E; A& ?; L0 R& ~
                   long vbl, vbu;; j( k& i- W! ~: M0 u7 D8 _# U9 O" X
                   SafeArrayGetLBound(pvNames, 1, &vbl);
; `4 G+ M2 s3 b, }7 U                    SafeArrayGetUBound(pvNames, 1, &vbu);; F6 k5 n9 @# h
                   for(long idx=vbl; idx<=vbu; idx++)
, H8 z; `) _: V  j                     {
4 `6 J" g. {- X: p7 U                       long aidx = idx;
/ \8 \% u; @# C" \6 _5 J8 s                       wchar_t *wsName = 0;
4 D  a* v8 Y" h0 L  d                       VARIANT vValue;6 p0 Q6 }, F. L
                      VariantInit(&vValue);
+ Y) g6 c  a- B) [( o9 Z) ^+ r1 ^                       SafeArrayGetElement(pvNames, &aidx, &wsName);
, h+ k5 O( R8 J; S5 j% s. v
( k9 p! a# J2 Y9 `+ b" [0 @                       BSTR bs = SysAllocString(wsName);
, j4 s2 x  C( o5 H                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
& Y1 v, X- B; W& A+ \                       SysFreeString(bs);: Z" Q( ?% x& w* T1 I6 f/ e: D
0 ?9 R: _3 ^! ?4 v$ v! V
                      if(hRes == S_OK)
: |% u$ ~+ v8 Y5 _                        {
' ]3 u9 Y, A* h- A4 x+ s                          AnsiString s;9 i$ b, J& J7 n+ y' j
                         Variant v = *(Variant*)&vValue;
) `: |1 o: `, H3 ^: z                          if(v.IsArray()), v2 V  A" P1 W2 M
                          {: Z* S: C# Z9 n' J' C  R3 V# y
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
* t8 w3 e' r/ U0 }) K                              {
+ g+ s" k3 ^) C' O  u                                Variant a = v.GetElement(i);0 x+ B- v! \' R# ^1 w3 o0 T& }
                               if(!s.IsEmpty())
# a# V) i1 c2 v                                  s+=", ";) J# l9 o% D  T' f4 E% B
                               s+=VarToStr(a);
8 x! E8 ^' Q7 s- `                              }$ a$ H* b" @8 Q1 M. {4 M  T+ d0 C. Q7 p
                          }1 s2 E$ k8 M% ~8 j+ C4 X$ h8 P( G
                         else
( ]1 y2 K$ u  \% h$ y, W                           {
5 Q, U7 S& E: }, n7 }5 ]                             s = VarToStr(v);
+ W% H+ u( x4 \                           }
6 U& i2 y& b: w1 v& K5 i0 x                          lpList->Add(AnsiString(wsName)+"="+s);
, T! H( q/ A5 w+ e- o- E                        }, a' x/ i5 \6 L, \( n  Y

5 K8 m7 p; P! N6 |                       VariantClear(&vValue);
. ~8 V7 ^! ?. L/ `5 s- s                       SysFreeString(wsName);
  B6 F4 x0 g& F, E" y. Y8 t                     }3 Q  }" `5 j: `
                 }& d3 y2 f" T% `! v3 P! p
                if(pvNames)SafeArrayDestroy(pvNames);9 ]5 v8 H/ Z( s! ~
                iEnumIdx++;: k* M( D/ N8 Q5 V9 d
              }) O; |$ g! \- u( f, h+ X4 a  C
           }% z8 @9 k) z% `& z* D
          if(pClassObject)pClassObject->Release();; @/ z! g: ^. C% x; H" n
        }
  D  A: Z. v! n( w6 S4 G        if(pEnumClassObject)pEnumClassObject->Release();7 M; U) D% z4 ]! J- d: T8 m; T
     }
+ r* A  R6 V8 s( e( W4 n7 g     if(pWbemServices)pWbemServices->Release();
- b: T4 H! R" Z   }" Y( U' M* k+ s; ?
  if(pWbemLocator)pWbemLocator->Release();( T# ~( s7 e. N6 C
}
1 p2 i& ^7 J6 j- {! |3 t7 z//---------------------------------------------------------------------------  O: }, ?' }$ P" I

  d% I$ d, O6 K  M  W. X: w// 通过 WIN32_bios 获取 BIOS 信息:" h7 _9 L6 {" V$ |
void __fastcall TForm1::Button1Click(TObject *Sender)" U2 ?5 X5 x/ V' v& s
{
3 A8 [& ]$ e% I3 |! |    Memo1->Lines->Add("================== [WIN32_bios] =================");) s  Q9 M$ j5 _. T' |. S% I
   GetWmiInfo(Memo1->Lines, "WIN32_bios");9 N5 u' E3 Y$ H* R4 O- F' E0 W
   Memo1->Lines->Add("");( {2 |0 W4 K0 d& m2 m9 z! q- J
}  E6 |3 C9 r7 I$ W- N* T' W

9 ?0 ]  c) q  Y( V; F8 T6 {--------------------------------------------------------------------------------
" C: J; q1 B6 A9 P6 X; Z$ O: H8 i) x" E+ \1 I/ U7 r% J0 A
WMI 可以访问的信息类型有:/ a3 |6 k) x- h; A; J" a$ J
  Win32_1394Controller5 r* k# n% _/ ]  @* e/ A3 h
  Win32_BaseBoard+ l9 t  Q5 Q/ i. J$ Y% O6 o, ~
  Win32_Battery6 g' W7 C5 i9 I1 T
  Win32_BIOS
- W& C* J# ~5 }9 {: Z: C* p/ M   Win32_Bus# T, D2 ?$ E) U' B% e# L' {
  Win32_CacheMemory
; m  f3 T+ L. ?" `  A, u   Win32_CDROMDrive
! d# D4 p8 o0 B   Win32_CurrentProbe& R; C8 e9 J5 l! J* `4 \5 P
  Win32_DesktopMonitor
8 j3 X1 W; t- G1 [   Win32_DeviceMemoryAddress( p0 T, ^/ j; N% R; T
  Win32_DiskDrive
+ j7 U' k+ m9 k" t0 O' f( d1 Q   Win32_DisplayConfiguration  N5 L# t& v5 S
  Win32_DisplayControllerConfiguration: \% o9 i5 a( r0 p8 |  Q! f0 P# e2 Q
  Win32_DMAChannel
2 M6 K; P- H! z8 m* B+ }   Win32_Fan5 @+ J) y& G0 @3 z* }( p9 r2 R
  Win32_FloppyController
+ Y$ ^' Y; v  E+ ^) F   Win32_FloppyDrive
3 g3 d) d" \* I+ y/ A5 G   Win32_HeatPipe
. Y5 _$ H: K$ G  r! Q% p7 B' b8 _2 b   Win32_IDEController
! w# q8 n: r6 d4 f5 M1 x* x   Win32_InfraredDevice+ l( T1 Q, Q5 A" _3 u. M
  Win32_IRQResource4 ~& T7 q& T+ j
  Win32_Keyboard) h( i9 E9 C& N7 A) U
  Win32_MemoryArray0 A7 K2 w* J* \# X6 W4 ?
  Win32_MemoryDevice
. ~& A% L& X2 C7 t! A5 s/ h   Win32_MotherboardDevice
$ t* o5 X# ~4 |/ B, ~   Win32_NetworkAdapter$ x: ~: U) t# h" y
  Win32_NetworkAdapterConfiguration4 A& V3 f# q1 O8 c
  Win32_OnBoardDevice" {+ b6 L: f, p# T
  Win32_ParallelPort
$ m  Z; y2 F, U% e+ \( Z$ _3 `* s   Win32_PCMCIAController
  [3 P$ `$ G$ f* ^; m- n   Win32_PhysicalMemory
/ x0 h4 j# ?0 E+ {& E   Win32_PhysicalMemoryArray
" D+ C# G/ J: D, G. o* l2 m1 ^( p   Win32_PnPEntity
+ O! b* i0 F. Y   Win32_PointingDevice
# A* s+ P5 b! }. K9 s; g- ]1 Y5 V   Win32_PortableBattery
# ?$ O2 W! H1 {8 n% C* I  m   Win32_PortConnector, i, Y2 c8 @6 A6 O
  Win32_PortResource* b5 S+ I. k) Y
  Win32_POTSModem* M! U; D/ B' a' u6 J6 v
  Win32_PowerManagementEvent
: v) G9 s2 k3 n6 |% o   Win32_Printer( T8 z9 J  I" Y* h# _% k1 Z
  Win32_PrinterConfiguration
  _% R. c- g$ l3 U' I   Win32_PrintJob$ |. ^& L1 ~+ q& n9 o" J5 t1 O/ _4 c* ^
  Win32_Processor% A3 I: @, n. m$ e1 |4 e1 W
  Win32_Refrigeration
. p& S- ?$ R/ v" G' j' {   Win32_SerialPort9 s& e" A" k/ z' D
  Win32_SerialPortConfiguration
4 s/ H# _9 Y. f8 _+ [, u7 b) R4 x5 h   Win32_SMBIOSMemory
- W; K# g) v# k; H5 g& j8 r. B6 u   Win32_SoundDevice
: U8 g9 }; O- ]# E6 \   Win32_SystemEnclosure2 S3 Q2 v2 i# x8 h6 y0 o
  Win32_SystemMemoryResource
# y" t" d. y2 K. D7 O5 R! r$ A   Win32_SystemSlot
6 r3 E# N: Y9 K( |   Win32_TapeDrive9 ]; j& _* ?( j1 v
  Win32_TemperatureProbe6 J' A9 E+ l$ Y0 W
  Win32_UninterruptiblePowerSupply
% q9 N* w5 W8 K  M* q   Win32_USBController8 V. i7 e9 \" X1 w: `9 l
  Win32_VideoConfiguration% l) D- `. P& L' ^
  Win32_VideoController1 Q9 n) B& C' G( ~
  Win32_VoltageProbe/ C9 `8 q- b$ A8 y7 t* n
; l  F" Z3 }/ }
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-14 00:42 , Processed in 0.020757 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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