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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)0 ~2 _& d* E$ k

9 j( u4 C7 i) w' i% C* ?( ^+ B; a4 p5 m" o& S/ J
--------------------------------------------------------------------------------
1 v" z% ]* h2 D7 l5 _- o' b9 nWMI: Windows Management Instrumentation (Windows 管理工具)2 ~9 h9 E; J; }  @# `" u. B
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
6 ]9 B1 c* q4 l/ n2 G0 W$ q8 U) d9 f   利用这个工具可以管理本地或客户端系统中几乎所有的信息。% D0 l1 `( Q. X, i. @3 B6 Y
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
) [9 a7 R* J# S) p
9 `2 y1 B1 C1 `0 y( U' b--------------------------------------------------------------------------------
. f. v$ {/ d9 qBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面1 a  |) Y* P3 ?. }" N

7 F8 w, |2 q" {& H! q--------------------------------------------------------------------------------. W( }0 _$ @8 ~. p5 }
① 初始化 COM 接口:
( `% h8 ~! c! w   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。0 g8 y- g1 ?3 Y
  这两个函数在 #include <comdef.h> 里面定义。# |# X7 M: R7 a' o" x; d# M1 [
/ m5 S- f8 {  W% ~3 A% I+ B( m
② 获取访问 WMI 权限:1 l' |( V" p8 m* w2 y& H
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);4 w/ K, a8 }' J+ N3 T# m
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
# l( n# h3 T+ \5 M9 M! ]" G) h' B( [8 h; S% E
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
* `1 A0 E2 x+ r$ ]   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
: P) C2 N: }4 f' p
6 f- z3 C( \2 x6 q8 Uvoid GetWmiInfo(TStrings *lpList, WideString wsClass)2 P8 L( M  J* n
{
8 B. }; j* c) Y6 ^  IWbemLocator *pWbemLocator = NULL;: U( D0 e1 y  f' t
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)8 x. o" Q' H) P% w! A% t/ u; A
  {
  f5 H/ t( C2 ?' O     IWbemServices *pWbemServices = NULL;& ?% B7 c- D8 m
    WideString wsNamespace = (L"root\\cimv2");3 v, M& Y9 ^! s/ v% n/ S
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
3 g0 A: S( j2 q4 Y9 T: f+ ~      {- K6 W1 r: S& @- d
       IEnumWbemClassObject *pEnumClassObject = NULL;
% d! {1 ]" |  |+ O: a        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
' q* h3 Q' Z) u        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)" z/ X, @7 t0 ^. j" M" N: ^7 E
        {
$ p  e1 v% f& J! ]) b           IWbemClassObject *pClassObject = NULL;
, k( L; |  R$ f6 ^           ULONG uCount = 1, uReturned;- F% C( j, f5 i
          if(pEnumClassObject->Reset() == S_OK)
: z9 M! m: \9 e" }7 j            {0 c9 I: d7 L% J" }$ p, P, ?4 q
             int iEnumIdx = 0;
2 o' [* |$ O% }% W6 }4 n              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)2 m* r; C; b/ b' j- B* @: G2 E
              {
5 \9 ]4 s1 f. ~0 T. h% T' i                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
7 |. K- u$ z' m7 t
* w1 h! i; g, v; M' f                 SAFEARRAY *pvNames = NULL;
# P5 X3 L  y: B$ N3 I: p                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)& c9 N5 \0 V9 A
                 {# ~0 e2 s( E  z& x) D( S- u7 x
                   long vbl, vbu;
3 t) z# p% r# d# E  y                    SafeArrayGetLBound(pvNames, 1, &vbl);0 @9 f+ I8 {; l+ I& a  C; h8 g
                   SafeArrayGetUBound(pvNames, 1, &vbu);
0 y: z2 n! O; M- o8 d$ m1 O                    for(long idx=vbl; idx<=vbu; idx++)
2 N; \& b7 e, d: M" _                     {
3 ^" u7 q* x4 I% m. p: q                       long aidx = idx;  \- q- M4 F9 S9 {9 O4 I9 P6 R
                      wchar_t *wsName = 0;4 e2 Z8 Y1 E! M' t2 f
                      VARIANT vValue;9 [9 _2 }! o7 D) u5 Z# m; a
                      VariantInit(&vValue);
4 F# X. M  a) T8 E" {' V) h. b                       SafeArrayGetElement(pvNames, &aidx, &wsName);
( r) E: _1 j8 g4 r" g- L0 z# W4 F# _! @5 T+ H+ N
                      BSTR bs = SysAllocString(wsName);
* G. I; y" }/ x& h, W                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
6 i2 Z7 J. U7 I, m' Y. r. i                       SysFreeString(bs);
% w; k: }1 A- y
" e' [+ {  r" n2 Y; ~4 E4 N                       if(hRes == S_OK)
' y8 w+ Y1 D3 R! h5 |                        {
/ D6 e" T" A5 ~                          AnsiString s;- Z& ~. R0 `" c" l% |: M
                         Variant v = *(Variant*)&vValue;
, A& m3 @7 s3 z: h$ D) }0 s$ q                          if(v.IsArray())
8 Q1 v& Q! C( b0 o" @                           {
- J" w4 r, F! _/ U8 s1 N                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
) Z  W- e5 u6 U" d! a                              {2 _# A9 |5 Y% K) f* M
                               Variant a = v.GetElement(i);  Z* k1 Y/ @/ r2 n
                               if(!s.IsEmpty())
+ k+ u2 |: N' P2 M% J                                  s+=", ";
, g- D- C; Q' Q2 r: R3 U( @' g                                s+=VarToStr(a);# f, s7 @3 V% K7 Q
                             }2 H3 T/ l4 p4 d4 [- J  A
                          }
& F" ~$ _1 V( A/ d                          else
1 s' Y" o2 G. _2 ^1 {3 W1 `                           {( V& i& P& \* Y; _6 }" L
                            s = VarToStr(v);
: c3 B- }2 u1 k  d$ W5 W                           }* k, m. `* l. g) i* t8 R4 q
                         lpList->Add(AnsiString(wsName)+"="+s);
! p" \' m, x" \0 m" ?: w0 x* A3 J) u3 a. S                        }
( U( g2 T- E( m; n8 i& C6 w, p' Q& l
                      VariantClear(&vValue);, ]3 [2 g( l+ x7 V6 q* l. [
                      SysFreeString(wsName);
2 S2 ~: @0 J. P3 B  t* q                     }
2 a. ~5 Z$ @5 F                  }, i* G$ w) u7 }7 @' h: A% J3 a4 W
                if(pvNames)SafeArrayDestroy(pvNames);% a% c% F$ [- ?! Q7 A- j+ d
                iEnumIdx++;; @+ Z+ b5 a" u5 P. a
              }1 Y0 y9 `4 M2 G* B, q
           }
# W1 @! Q3 O6 Z' k           if(pClassObject)pClassObject->Release();0 V/ A) G0 \7 s3 [' S8 O2 J
        }
6 `! l; X6 B3 }' l        if(pEnumClassObject)pEnumClassObject->Release();5 a' K3 ~( c5 L! J  G- n4 o
     }
( T& F8 d+ Y' X5 C' N5 `     if(pWbemServices)pWbemServices->Release();# w. J  a* y8 W" r
  }* M8 B  w# L7 b( _
  if(pWbemLocator)pWbemLocator->Release();+ t4 J% w2 z) N. s
}3 ]! i5 \/ @7 x; }5 H' F5 n
//---------------------------------------------------------------------------! W4 e' P) |! e% F1 V% @
, Q; ~  P0 f, x1 X0 S- K
// 通过 WIN32_bios 获取 BIOS 信息:
: d8 T8 P0 c* [. l) m2 g) dvoid __fastcall TForm1::Button1Click(TObject *Sender)
- u- ]1 b* I$ I$ o" g{. u3 r' f! [5 A' d
   Memo1->Lines->Add("================== [WIN32_bios] =================");
1 R. ?7 h9 E3 g% r1 R    GetWmiInfo(Memo1->Lines, "WIN32_bios");
5 w/ o$ K* O6 p3 Z    Memo1->Lines->Add("");
; b2 k9 X* H% B% g4 C* l& L! H}2 t* N+ ~( S0 D
+ u6 l6 {$ L. s
--------------------------------------------------------------------------------
3 k5 C1 ?& Q2 Q! h' J+ i' Y
2 _1 I0 A5 |+ ^7 [3 tWMI 可以访问的信息类型有:
8 n3 c- R$ o/ }( O   Win32_1394Controller# b  g, P2 _! K* `4 t, Q. {, l
  Win32_BaseBoard
+ [1 D! N: _  G) _1 l   Win32_Battery
  T. x- e9 v2 a! J   Win32_BIOS
7 x  j1 Q! j" {+ s( v   Win32_Bus8 j9 X* q2 C& ]6 Z! h7 l0 x
  Win32_CacheMemory
# f8 X8 C' n3 H4 Q  d0 r  s3 D' ^+ Y/ c   Win32_CDROMDrive, m. Z3 e! @& z; P0 `; J  e
  Win32_CurrentProbe3 L& P; \$ z% n6 K' L
  Win32_DesktopMonitor. Z' O* v7 R9 A" A; W. m% d
  Win32_DeviceMemoryAddress, r& Z" }8 ~. ?  g1 t/ r6 E. p5 T
  Win32_DiskDrive8 ~& g1 G8 j2 P  q! v. w
  Win32_DisplayConfiguration
; b2 I6 H3 z; x4 [" r# n4 a0 z   Win32_DisplayControllerConfiguration
" V; q  f, G$ k8 A6 V   Win32_DMAChannel9 x' g! G( b/ R2 k
  Win32_Fan
! u, F# F7 n) w# e. l) ~   Win32_FloppyController5 f5 U& g. E" z$ C+ e
  Win32_FloppyDrive
- |5 B6 N, ?' g3 P: S& D; p! `   Win32_HeatPipe
' \( P/ o& a3 T9 w$ p% g9 F' v5 V" ^   Win32_IDEController, J8 D; T: U; f2 X
  Win32_InfraredDevice5 x3 H4 W: R; y1 x  R- d. l/ z! ?
  Win32_IRQResource
; ]- R" C" k# O  c- E' ]   Win32_Keyboard5 B1 Q7 K4 J) B: V" p2 }
  Win32_MemoryArray
/ J6 E7 ~& Y7 f- l& p   Win32_MemoryDevice
' z( ]; G/ v( G: E5 A6 W6 ~   Win32_MotherboardDevice$ Z; ~! B+ g( [& F, D
  Win32_NetworkAdapter
- w0 k7 g* r& V, ?   Win32_NetworkAdapterConfiguration% Y6 r. A* V8 @8 N( w# S
  Win32_OnBoardDevice
! P1 f" a$ W* j   Win32_ParallelPort
7 ~6 b; `3 f3 C, }$ v   Win32_PCMCIAController
2 J' v4 C) e4 q5 H   Win32_PhysicalMemory+ X( L/ Y9 {2 `3 a; b
  Win32_PhysicalMemoryArray
" C" x: z( \! G7 {0 |   Win32_PnPEntity
8 a, `* A* F0 @" S   Win32_PointingDevice6 S6 h+ C! x& u- k9 S5 ^. f
  Win32_PortableBattery3 E+ ]/ R: Z+ Q5 E- n# K
  Win32_PortConnector
: N$ e$ `* y  U/ N, `# N" i3 Y   Win32_PortResource
; V+ I- N+ M. T- X1 S; O   Win32_POTSModem- @2 N! i6 n/ F
  Win32_PowerManagementEvent
% q4 ]; R4 x" f! g   Win32_Printer
6 D. A5 M$ E; d3 R' D   Win32_PrinterConfiguration' M( D3 R' o- @8 S( a( Q, A
  Win32_PrintJob
9 m$ I8 c# q8 b0 _2 x5 v   Win32_Processor
3 }: r" S4 {9 t: T& o4 J   Win32_Refrigeration7 c- X+ G8 S# d( _' V
  Win32_SerialPort
# }$ h  l. @$ |5 d( A   Win32_SerialPortConfiguration
: r  G& O& V- `$ D6 _" y! i   Win32_SMBIOSMemory
% K7 N6 x# R" I+ ~2 f   Win32_SoundDevice, y$ x5 Y" A  t( J5 A1 P
  Win32_SystemEnclosure
( q# w/ e; N8 n1 a   Win32_SystemMemoryResource# k7 G3 u, [( f* V
  Win32_SystemSlot) J1 [9 H3 q* l# O
  Win32_TapeDrive
8 h) q4 V; ]! e5 A6 N* T; I5 t9 K   Win32_TemperatureProbe0 {! M  Q# |. ]9 d8 U/ p" U+ O
  Win32_UninterruptiblePowerSupply) L1 {. k% n9 z% k8 c
  Win32_USBController+ [. x0 W$ h/ O2 m* Z/ t( r' ]. u
  Win32_VideoConfiguration
6 u% r% E* u/ J! ]5 l* U   Win32_VideoController/ b6 n" e$ [- r- M% w& S3 g
  Win32_VoltageProbe6 n. d5 g  T* J- n" [. f7 _' f

+ }3 v# W0 u! ]2 B以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-18 15:13 , Processed in 0.021778 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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