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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)& y$ g: `* P2 u6 I
7 u2 Z1 A8 Z% P5 @' u/ H
7 ~. G6 f( A( ~4 w: E
--------------------------------------------------------------------------------
" f8 V* _/ ?) D3 q& xWMI: Windows Management Instrumentation (Windows 管理工具)4 j' N& m" @: {
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
, B) v) Y* A8 K   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
/ b8 }3 @  Y' {- G0 \& f* I   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
# D7 q/ u$ Z9 g1 d0 o, Y: T) X, B/ _; W+ S# C# t# b7 q% T
--------------------------------------------------------------------------------1 x8 [# x# Q9 ^* S4 ^- ?7 u
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面, q' p2 @  ~$ K0 |" q+ D
; s. \& f& b% O
--------------------------------------------------------------------------------, i' P; B' l% t+ o+ O8 g- ]
① 初始化 COM 接口:& F3 W& P: E' f8 \1 y9 O: ^! f
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。- |8 c7 Q# Y" C# v% O+ u  b2 V
  这两个函数在 #include <comdef.h> 里面定义。
4 N! ]  {& p) x+ `% x3 d
  y# m  x+ @( P: x* A. v( }3 q* h② 获取访问 WMI 权限:
: h5 g9 h0 Q1 [/ S( L   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);- o" G" F6 _2 N8 ]5 a  P- o
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。, r# s2 l' w: u

, c! i1 i! @! s8 {3 w③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:6 ~" L9 G; }9 c) @
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
- `& `6 Y' B1 X* n& B5 E
6 I; v- m0 y  T8 u, tvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
/ f1 {% Y) Y4 _9 _( U{/ h& D3 @" ~# @3 Q
  IWbemLocator *pWbemLocator = NULL;
7 d: ]1 s: x* p6 s! G0 n  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
+ g+ u% \8 x' n3 h- ]( a   {
+ B' F  _  ]2 L+ X     IWbemServices *pWbemServices = NULL;# ?* ~7 \, a9 Q1 e
    WideString wsNamespace = (L"root\\cimv2");1 u7 K( o3 s5 I: d3 ?* _& F
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
2 H8 i8 E3 j% q6 y- ~+ b4 J( N      {
% K) A# r' U. z% o) }$ b6 h        IEnumWbemClassObject *pEnumClassObject = NULL;) L/ f( ^& {2 S" i1 \" ?
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;# Y7 J2 V$ u9 n3 Y3 S
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
% l9 |/ K) d3 @1 ~7 f& Y0 B7 t2 T) `         {
2 R/ Q0 l6 B. R( V. J           IWbemClassObject *pClassObject = NULL;
* G4 F6 ?1 O# j: v9 p           ULONG uCount = 1, uReturned;
( P" B  J8 P) ?3 k* T. X           if(pEnumClassObject->Reset() == S_OK)# K$ |" A/ ]; S( `8 t
           {' r3 j4 T, C' t
             int iEnumIdx = 0;! e( x; i! P# B8 T  Z- R; e, h. b
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)& L7 L/ g7 y% ]6 j! O
              {
4 t# F0 W, C/ d$ f                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");! O, H  n8 z# z+ b- n

0 o, J* U  F; T! [$ n/ h$ c8 ?+ I                 SAFEARRAY *pvNames = NULL;, ?: M1 l$ ^$ C/ e8 ~; }' O
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)' l5 J) S4 Z; |# T
                 {+ W: I) t" X/ g0 D& }& G; G0 O
                   long vbl, vbu;
9 L$ n! Z2 [( c: }7 @6 n: X                    SafeArrayGetLBound(pvNames, 1, &vbl);
# a' n+ }6 d7 y8 o                    SafeArrayGetUBound(pvNames, 1, &vbu);/ ~4 p/ d- K7 h2 V2 _
                   for(long idx=vbl; idx<=vbu; idx++)
2 R5 G) j$ s7 D) O0 V$ q. M7 X                     {
/ z4 v. ^+ y" _; P                       long aidx = idx;8 l: q, n4 H: q4 d2 C
                      wchar_t *wsName = 0;
9 m& p% `% u$ \7 y5 W                       VARIANT vValue;% ]4 X( N* z: m- M  L
                      VariantInit(&vValue);
/ Y0 P5 q" f2 q( M                       SafeArrayGetElement(pvNames, &aidx, &wsName);$ `4 Q& [" N. `1 _! Q( F9 V. r

" h6 d3 y' _/ e3 o; u5 s5 E                       BSTR bs = SysAllocString(wsName);
3 ?  `$ X* f8 V                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
- _& l5 E& J4 h7 g9 {1 T+ ^                       SysFreeString(bs);
$ b1 J% _+ J! w' q" r9 T" m
, U& d  ?6 o8 t" X                       if(hRes == S_OK)
! n! V2 w! [- F6 N% ~                        {
2 _$ A3 r" K3 h' x2 B                          AnsiString s;
! X# [6 n$ K0 \1 O" C; U                          Variant v = *(Variant*)&vValue;6 l. S  D- B, w6 n$ k
                         if(v.IsArray())
, {* K2 f) J" |8 u+ c" G, [                           {1 H! ~/ H, D9 {4 D6 D' U1 z* {' |3 `: y
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)8 F9 m/ O% y8 F, D2 C  @: ?
                             {# ]5 ~: u$ J' m
                               Variant a = v.GetElement(i);
& m: O- L) ^5 D0 R6 p8 ~- ~                                if(!s.IsEmpty())
2 P# K/ j( [1 k) j& H+ L. \                                  s+=", ";
# A, k/ c8 ~4 x( |/ }                                s+=VarToStr(a);$ d' [0 C, D* }7 J0 c4 D. O+ K# d
                             }+ N# R: N$ G% |+ C9 n5 H
                          }) X: y! m* m& z! {
                         else
6 w" D' A# S/ Z8 L3 W! D. m                           {+ ~9 {$ ]; Z5 e- Z' E! x
                            s = VarToStr(v);
# Y8 C9 s) Z4 Y$ |- u) V                           }
1 s; i4 ^0 A6 L) y# q" [" a                          lpList->Add(AnsiString(wsName)+"="+s);  \$ ?  u' Z& ~0 a' n
                       }( x$ P; @" g6 g& ]2 G# S$ C6 Q. f
7 l; _& S7 ?" C* R& l8 B4 P6 \
                      VariantClear(&vValue);/ W( e" @/ u4 e3 W) |2 f- Q- M/ j* M
                      SysFreeString(wsName);1 s$ N8 w; G0 A: |; t9 B4 K& @. t
                    }
% Y/ J6 W$ l8 v* _& V; }0 f6 x+ G$ M                  }
3 |+ \" V1 W  [/ Z; s                 if(pvNames)SafeArrayDestroy(pvNames);8 A# n1 ~( B* c5 |) O1 u. R5 a
                iEnumIdx++;- c  H  O, O9 `, n/ h- e
              }
0 g4 Y0 o8 r$ ]% s: i  N            }, H: s& _" ^" o! R  `! }  \
          if(pClassObject)pClassObject->Release();
5 }+ e: y: z' |9 }0 \! X         }
6 T. ^* M% [' ~# \. _5 g        if(pEnumClassObject)pEnumClassObject->Release();
6 ~, d. E$ R2 r! \; z) G: p      }# X! e) L& d# w. z8 U8 t) E
    if(pWbemServices)pWbemServices->Release();- \/ I- M$ m4 o- p7 V4 `: _
  }
2 r5 `* q. f3 {+ G) L1 q4 G/ t9 X  if(pWbemLocator)pWbemLocator->Release();) h' R6 E7 z5 c8 m! w* ^  I# |. Y
}
* V8 `+ v  v$ R//---------------------------------------------------------------------------
- |( ^' m/ u  n
$ Q8 c, m& ~/ o* [* c) `$ Y// 通过 WIN32_bios 获取 BIOS 信息:
9 E5 e+ p  M( b& I6 Vvoid __fastcall TForm1::Button1Click(TObject *Sender); ~2 H, m0 s1 G' h8 v; m9 ~! v
{- t. K+ _9 J4 ?/ j4 w. N% e
   Memo1->Lines->Add("================== [WIN32_bios] =================");1 S( v' i" I5 N0 s2 r
   GetWmiInfo(Memo1->Lines, "WIN32_bios");  Z, v: |" ]& O( P( J
   Memo1->Lines->Add("");
8 e4 N4 ^) `% d. D' @}) D( u9 k1 X- w7 q, p

, z8 j: o# f7 z4 N" o& A--------------------------------------------------------------------------------& N6 G! K, I3 V% _7 Y

3 ^6 i" k' L3 \8 Y" q9 qWMI 可以访问的信息类型有:
- _" C- n7 [5 s' S- i   Win32_1394Controller1 k% X7 Z* Q- v
  Win32_BaseBoard; p2 T" P8 u1 C( Y& ^' J- Z- Y. i
  Win32_Battery
( A" Z1 t) \8 U( `) L) c   Win32_BIOS6 y' b2 `' v- ?8 {
  Win32_Bus
* p5 y( C1 F# d9 ^8 U; k' b   Win32_CacheMemory
1 X( K% r  i2 y$ R+ E   Win32_CDROMDrive
) z9 N; ]1 _* O% u  i- c) G& d   Win32_CurrentProbe1 \( f; c9 K3 N& h8 }, |+ O' B
  Win32_DesktopMonitor
' p* _, v- |8 Q9 o5 A   Win32_DeviceMemoryAddress
% ?3 B8 K( h! M, C* ^7 _7 i   Win32_DiskDrive/ B: U& Q) u- C1 M
  Win32_DisplayConfiguration
7 L+ r( t  W1 f, K5 S   Win32_DisplayControllerConfiguration
) d3 ?% G' `! R, _0 \5 L# U/ M   Win32_DMAChannel3 y0 f; M" L! a- |) j& r6 A6 \
  Win32_Fan
' Y# Z0 F; q) m7 R   Win32_FloppyController2 H/ Q5 `) b. w2 s
  Win32_FloppyDrive6 D( Y6 K2 V7 k) p3 A" {
  Win32_HeatPipe
! l7 {6 }6 W6 g" t1 i   Win32_IDEController
$ P2 l5 A6 C4 g% s. Z. P   Win32_InfraredDevice
7 x5 P* f/ y2 @7 m   Win32_IRQResource! g7 W8 [- [! O4 \+ g9 J" N
  Win32_Keyboard1 [' }7 J2 Y, v, r! v! L
  Win32_MemoryArray; ^! t" q& u- e" K
  Win32_MemoryDevice. S4 L9 R; P8 r& U* u. T8 s) p
  Win32_MotherboardDevice5 L) C& j; }1 v: X9 Q' @0 c
  Win32_NetworkAdapter
4 ]9 s. j: C! l4 r) ~5 V8 d   Win32_NetworkAdapterConfiguration- k7 X# t) M8 p- G
  Win32_OnBoardDevice
2 S1 P, W8 M3 D5 V   Win32_ParallelPort2 Z4 K' H3 U  E4 W. j
  Win32_PCMCIAController8 J8 K9 R+ x- K4 N/ l& w
  Win32_PhysicalMemory
+ g8 P- L4 B' `5 Z- L# |) `6 L7 w   Win32_PhysicalMemoryArray( ~2 U- R' @9 m% q. ^
  Win32_PnPEntity
! u( j" s! e7 p$ B8 l% z   Win32_PointingDevice9 T" m& {' |& E% v9 O0 s" G, ?8 n
  Win32_PortableBattery7 s, f0 w" `- ]1 q, W) P
  Win32_PortConnector3 ?1 @. b! R; @0 {, L1 C& w
  Win32_PortResource! P$ P7 @* a0 F
  Win32_POTSModem4 ^: c  k9 y" @' f3 m; N  L! S: Z
  Win32_PowerManagementEvent
0 \. l: x# h" v: u' v8 _   Win32_Printer
2 i9 b. R9 D" U   Win32_PrinterConfiguration$ u4 g7 Z4 L# m  |$ C( e
  Win32_PrintJob
0 t) v8 |* a0 Y6 F   Win32_Processor; E1 v8 P9 S* N
  Win32_Refrigeration& G& g* B3 \6 K9 L! _5 a5 g' X( t
  Win32_SerialPort0 k" |! a( P4 }( G" B; z
  Win32_SerialPortConfiguration
% w1 D: [  V' j8 O# H7 ?0 T/ E   Win32_SMBIOSMemory
' k2 p$ L9 R5 V7 c   Win32_SoundDevice7 |* h( Y8 ~( J) x$ r( X
  Win32_SystemEnclosure) c# o& q3 Y; h5 ~: c
  Win32_SystemMemoryResource7 E( x, Q1 |" s; w- L  _- D
  Win32_SystemSlot
. v# }6 I! }1 s$ K5 i$ x   Win32_TapeDrive
: r- S' x+ P1 Q. `! ]   Win32_TemperatureProbe! K. i4 \" _6 N' K+ g+ }
  Win32_UninterruptiblePowerSupply
! m, l; ]  L/ A2 @   Win32_USBController
/ P* F$ o4 ~: r8 l8 p4 }   Win32_VideoConfiguration
8 A5 C# a5 o  i% @* j   Win32_VideoController! R0 X7 R8 \+ w7 o! Y
  Win32_VoltageProbe
. ~' N9 `. M2 Y) d9 B6 g! f
. {( a, ^4 O0 Y/ j" ]以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-10 14:06 , Processed in 0.022853 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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