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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
  o8 ~9 u' @$ m7 M4 s3 @& ]5 z. B) N  \$ Z% P# T

# B2 p( D& m6 t* i- s0 r--------------------------------------------------------------------------------
6 \2 _) d$ \8 e8 `WMI: Windows Management Instrumentation (Windows 管理工具)9 @$ i. l0 |. y: l0 F& J) V3 {/ n. T5 s! ?
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 3 y2 Q7 C9 ?. Z( u, W! r
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。' T6 d1 q& }2 {/ ~/ N
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 . x% w* B& H" f/ T

; ~" U* ~+ f$ L. v. Y3 t9 c--------------------------------------------------------------------------------& O0 u: X  i0 o0 x* a
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
& m; W9 x9 C% w) K$ O, t
6 r- I/ B1 i$ ]* f--------------------------------------------------------------------------------3 q$ X9 j; \5 w  k/ t, }& J5 M
① 初始化 COM 接口:5 M8 y' D; v2 p# A2 L, w
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
2 D3 _) o* V- t0 S   这两个函数在 #include <comdef.h> 里面定义。
  S0 i. B4 Q* m6 d2 Q$ o
4 }4 y* a. Q$ \0 m② 获取访问 WMI 权限:
. y3 f9 J, e) E/ i" ~, v   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);+ Y  g6 h* A2 q$ M( W6 M
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
5 N2 Y& J9 x. w2 N
6 l: Q6 M# r) J# n0 J1 o③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
- L  O. p* h) ~   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。/ q1 s" n5 f: W) ?5 i

7 b2 s( R2 b  f- ?6 b: avoid GetWmiInfo(TStrings *lpList, WideString wsClass)
/ W! Z9 T: j) A, _9 H  _{
2 l# ^8 ]7 I1 [- f/ I4 D6 U4 P  IWbemLocator *pWbemLocator = NULL;
( C0 a  Y4 d' F- e( D& B7 c2 Q  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)  ~# l; r* s, X0 \1 s
  {
( C% G! _! x: X9 }     IWbemServices *pWbemServices = NULL;4 m0 }8 o7 G* o# V! N0 C8 |# v
    WideString wsNamespace = (L"root\\cimv2");8 l0 [8 A' k1 P" [% k
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)8 R) O+ {2 i# v4 P
     {
1 ]4 |1 o8 [# y! Z) l        IEnumWbemClassObject *pEnumClassObject = NULL;! o- V0 h6 v' b7 _
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
0 N+ o1 S; D: J: O        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)9 h/ ?8 M3 j8 O, V
        {
6 [4 a( M2 w7 K- c7 B" B: Y           IWbemClassObject *pClassObject = NULL;
0 }" h8 V  V% R2 Y           ULONG uCount = 1, uReturned;
$ S! {3 ~# a$ }/ I% M           if(pEnumClassObject->Reset() == S_OK)9 K+ f3 {; Z. l
           {
7 |* k, f, J3 q7 C& K3 m" ^              int iEnumIdx = 0;
2 x; j5 I; ~, v              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
% L! m/ Y* b4 Q! T" J: t               {
1 o8 {. M7 C1 c                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
& S/ s- ~2 Q1 k& Y* C2 ~. ~, B' Q& W( N
                SAFEARRAY *pvNames = NULL;
# u+ B, S3 v2 R                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
* C: U: g; o* @                  {
3 B. }4 ]* ~6 d                    long vbl, vbu;* o7 d% J* q  w3 D  e
                   SafeArrayGetLBound(pvNames, 1, &vbl);* S3 {- ~9 E; x; l  B4 n
                   SafeArrayGetUBound(pvNames, 1, &vbu);* d; ^* j- z! a* B; Q
                   for(long idx=vbl; idx<=vbu; idx++)
0 g" f/ U% e4 q! T% c% s                     {
1 D6 H9 i& R& F. R                       long aidx = idx;0 `5 Z  y+ D# B) L8 L
                      wchar_t *wsName = 0;! {3 l1 e7 {8 b4 w
                      VARIANT vValue;
  d! a* H8 s: x& l$ d                       VariantInit(&vValue);- l( }; v- n. G; D4 b* ?$ |
                      SafeArrayGetElement(pvNames, &aidx, &wsName);5 ^/ t! Q( x" Z6 p& p7 T: }

* s- C' l; n+ C9 O( j  ]) n# l/ i                       BSTR bs = SysAllocString(wsName);
" s- r9 j7 y) K/ V/ T                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
* c! _' L& H# z) Y- {" m$ [0 C                       SysFreeString(bs);
5 u# U" B+ m  K( h0 M! d6 I1 `! t9 X, h% T1 a$ N
                      if(hRes == S_OK)7 i5 c5 n4 d% c% O5 ~- C
                       {
1 [) v* Z8 t" \: j                          AnsiString s;. y. a4 B5 m* M) k0 V! Z" o& Y5 f
                         Variant v = *(Variant*)&vValue;
# m: K* f5 @  ?  S3 B                          if(v.IsArray())2 w+ c! |2 J* a+ r: Q
                          {
% k8 _8 w: G. Z- t4 I                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
) ~0 X$ l3 U( m- _8 [( h                              {% l, @+ B8 O. s1 k2 K
                               Variant a = v.GetElement(i);) n2 ?' m0 t) r# t7 ^6 O8 F
                               if(!s.IsEmpty())
* ?# w# l1 N& W- e7 c                                  s+=", ";
% ]% D% n2 ?& c2 S' _$ \, o                                s+=VarToStr(a);
, K. C8 A  |; q" {# I                              }: R& O' u& V8 |- E5 ?
                          }3 E# n# c, J. n/ w1 j6 k% |3 A
                         else
! X: s& }. [) X# p                           {5 C* z! k, Q5 @: k) A7 M2 o& r
                            s = VarToStr(v);) Y! T! O6 n3 p& A7 z" P# [
                          }
( |- |$ K( I- H                          lpList->Add(AnsiString(wsName)+"="+s);+ N, X7 z  S; O+ C
                       }
, r; B9 M7 N, U5 `8 Z  P1 f
0 o" N; n: f- {                       VariantClear(&vValue);; k/ s: \( J7 u7 o- W; t' |" A9 w3 K9 ]
                      SysFreeString(wsName);- r- M) c# A, R' ^! N" H
                    }
! S3 L. K# |+ Y9 ^# O, f                  }
) |6 I7 W' y6 ^" I) R                 if(pvNames)SafeArrayDestroy(pvNames);1 a7 `2 F; e8 l5 C0 x  H
                iEnumIdx++;  f" G. A- v& C- k5 n! {. ]
              }
3 ]. O; h& _0 b. A# m4 w6 K            }
8 }% Z/ ]* y; O9 J           if(pClassObject)pClassObject->Release();
4 [+ E3 B# U' l$ P5 K         }
. T* k# ]. v2 L! u+ l        if(pEnumClassObject)pEnumClassObject->Release();
5 m" F; }" _" @- N, j      }
/ h5 x9 T" B6 R' W     if(pWbemServices)pWbemServices->Release();
- L+ G3 y7 z! F) B   }$ `' i# W! w, D: z! H8 D3 z5 z
  if(pWbemLocator)pWbemLocator->Release();3 @2 h6 |9 u: N1 ]% ^( _/ Z( `% K8 N
}" c& r! F  s0 \( v  s1 G
//---------------------------------------------------------------------------
2 T% a8 \4 v/ W0 v" y) {
& K5 P. `. K' e6 x+ x& o// 通过 WIN32_bios 获取 BIOS 信息:
# e; ]! j( d/ g. svoid __fastcall TForm1::Button1Click(TObject *Sender)
& q  |* F/ ?0 Y/ z9 p' x- L0 E{* S4 Q8 J3 D% ]
   Memo1->Lines->Add("================== [WIN32_bios] =================");1 ]7 x- |5 o0 ]1 u
   GetWmiInfo(Memo1->Lines, "WIN32_bios");9 }! k" I1 r, H1 }0 p' }
   Memo1->Lines->Add("");, r, A/ V5 k+ Q  k& C
}
/ {4 z- \) s6 {: H5 s8 Y$ l& @+ M/ @: g
--------------------------------------------------------------------------------& X5 J9 c, ^! Y2 I' F4 G( O
% B2 R5 b/ W  k( }
WMI 可以访问的信息类型有:2 F$ O. x9 A8 ^
  Win32_1394Controller: G2 q' b( k6 M: W/ @( b" |
  Win32_BaseBoard
9 \. U: R" p9 ?( I   Win32_Battery
/ G/ H2 @" d( o. V   Win32_BIOS
& N$ c3 a2 q" a/ o( `& _   Win32_Bus
3 y! o: w" p. t  L3 C: t/ u- I# d% A" K3 n   Win32_CacheMemory: ?% @! {( @; Y' c9 Q* ]& X
  Win32_CDROMDrive
) d$ g: X, J* S8 v* t   Win32_CurrentProbe
2 s0 Y' F0 R# |! }9 ~* I5 b/ |   Win32_DesktopMonitor
1 U, m; l6 W* |" m3 `5 a  q2 {  d' G   Win32_DeviceMemoryAddress. A" a+ x. w+ l( m) D* |
  Win32_DiskDrive
8 J; K9 E" O9 p0 ]% j5 O% x2 H   Win32_DisplayConfiguration8 P. F) G& M) K& _* N! o
  Win32_DisplayControllerConfiguration9 l  x; k, ]  W, t7 {( m! K( j+ W
  Win32_DMAChannel
) e1 V/ i- @$ a7 `# ^# d   Win32_Fan
+ {9 p8 U+ w; w4 [4 ~/ Q   Win32_FloppyController# R: N9 a% a  L3 q, w. L$ E0 A
  Win32_FloppyDrive
+ W) h6 _0 a( m   Win32_HeatPipe8 Z0 C8 }% H7 @, v4 u1 P; r% q
  Win32_IDEController( n' A& p8 x# M- S  U
  Win32_InfraredDevice( r6 i* J& J# f) O+ g
  Win32_IRQResource, G8 }8 J; n4 c8 Z
  Win32_Keyboard
; S8 g5 w- b$ E: k3 ?+ X   Win32_MemoryArray* v5 N( v. V+ w. a0 F4 `
  Win32_MemoryDevice( J% E, o1 E* z9 h9 x
  Win32_MotherboardDevice( a* D& \( d3 K1 p
  Win32_NetworkAdapter
/ a& F) E, E& P9 H5 T- Y   Win32_NetworkAdapterConfiguration5 \: a' u1 |) z: A3 @
  Win32_OnBoardDevice- s# }4 c) e/ P. F& V7 ~) {. A
  Win32_ParallelPort
: I" @6 v4 b0 r   Win32_PCMCIAController
) Z3 p- Y, p) e& b$ l   Win32_PhysicalMemory+ [7 j, ]8 x4 f# V" Y
  Win32_PhysicalMemoryArray
  j8 A, g9 g! G# e& G   Win32_PnPEntity6 v# m2 R5 ^3 Y) ~' t
  Win32_PointingDevice* F% a  X+ B, `# B% z3 X
  Win32_PortableBattery$ `% d; [) ~4 p
  Win32_PortConnector
, m  Q7 b" P( s) b. X& N   Win32_PortResource# C/ J* L, X: X% F, B2 U$ M
  Win32_POTSModem
" m- O* \7 m' b* f   Win32_PowerManagementEvent, p, _- Z5 y7 G( O8 F3 h9 w
  Win32_Printer
! X2 j# Y2 E- X: I" U1 G+ |   Win32_PrinterConfiguration
1 a' D+ R0 P4 w" m6 D' ^$ N   Win32_PrintJob( d  b) j: f5 [/ c( T. N
  Win32_Processor
- P4 F7 x1 z; \/ p( L9 c4 E   Win32_Refrigeration
5 K7 [% d  T: Q3 Q) a) ~- W/ s2 U0 [   Win32_SerialPort
3 ~; [# t4 L# P   Win32_SerialPortConfiguration+ x, F0 ~9 u8 t
  Win32_SMBIOSMemory
! [. P+ z8 ]$ X5 k  Q2 z& z   Win32_SoundDevice
  B% S. |4 b2 S& m* \% ]% `   Win32_SystemEnclosure( g* v2 W6 Q. o4 Q; L1 i
  Win32_SystemMemoryResource
) l' v' I9 e1 J- |/ n   Win32_SystemSlot
  v0 X# a" [5 |; |! G2 M   Win32_TapeDrive
0 j: x7 z% y" J  j   Win32_TemperatureProbe$ B" q) T3 Y( O# q) v6 ^) z) u; r% w( t
  Win32_UninterruptiblePowerSupply
9 K/ E- `4 u% Y% |- @8 F7 E) A   Win32_USBController
! t4 j9 o' ^; F0 M) q   Win32_VideoConfiguration9 K: Y7 ~3 f$ S1 r
  Win32_VideoController
- I: y' ]% s6 m3 b- z   Win32_VoltageProbe
( x0 B. h  a8 V  G6 B& b) x9 \- u$ C; C5 m( I- p
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-5 09:41 , Processed in 0.017902 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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