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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)( W7 J6 \" E/ [. I; }

" E8 e+ P4 T% `, H6 Q( k7 z# q$ E- W
3 m  P8 v+ P  K--------------------------------------------------------------------------------
7 r8 K0 n6 S" V$ J8 c$ J* I7 AWMI: Windows Management Instrumentation (Windows 管理工具); f% _/ N. S* k' A: W
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
0 ?1 D  s3 Q' `  k6 T   利用这个工具可以管理本地或客户端系统中几乎所有的信息。% ]" T3 ?% c8 x: D& `5 w
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 4 f% g' g- i3 n( n
' U: r2 Q: j8 X$ c# u! e
--------------------------------------------------------------------------------
' ?, W' W6 x: V6 @1 `$ U! ~2 yBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面2 I6 F+ j8 L: n2 x( A
6 J5 u+ X" f; o2 h) h' m# D
--------------------------------------------------------------------------------7 |8 Q& c2 \2 Q  p( N8 U, r  C
① 初始化 COM 接口:# l8 w* q2 Z+ i( M7 C
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。( _! X( q! r! P) ]
  这两个函数在 #include <comdef.h> 里面定义。% W2 O; P. I) K9 U  w" `4 a7 o# J2 e

9 w( I, c) n7 k( H/ C② 获取访问 WMI 权限:
4 E, o6 Q1 ~2 X- ~# W   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
0 D6 o+ f2 `4 v$ Z3 h   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
1 T/ t7 s' S. U" u5 J& G5 w$ l% P8 d+ ~6 S
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
. z* K, a5 y" D% i   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
& a# O4 n- T2 o/ ~8 _+ @5 f, O; e/ r% I
void GetWmiInfo(TStrings *lpList, WideString wsClass)
- t) a+ G1 {* ^8 H' S, q6 o{
; J) ]$ N: {4 u- U1 W! m+ ]  IWbemLocator *pWbemLocator = NULL;7 \5 h- O0 X3 p' g' N: a
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
* {) v3 c+ z- _9 _$ R   {
' i* @, L. s2 P0 Q6 @     IWbemServices *pWbemServices = NULL;
" [5 z, b5 w4 `. r- G( V     WideString wsNamespace = (L"root\\cimv2");
& V5 M2 R# T1 _, u3 R     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
% M: S9 x" k8 b2 H      {
( c5 n3 B5 y1 I9 T: z/ k5 ]7 U' J        IEnumWbemClassObject *pEnumClassObject = NULL;
1 c) X2 U" l/ a1 [, M( [+ r  @1 Q' I        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;  O! n' v. O, q& p( ?
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
; c2 O- x3 R  Z+ s: i/ y# B         {  V7 ^+ D# s! Q# a
          IWbemClassObject *pClassObject = NULL;
) Q( m- [  s3 M9 `           ULONG uCount = 1, uReturned;: |/ M5 K4 C8 I) U& P7 I  `
          if(pEnumClassObject->Reset() == S_OK)
4 }# L$ [8 p3 i  J            {& j- a$ o& h) ^) z# K
             int iEnumIdx = 0;; B7 l; Z3 C6 C- O; ]* u. J9 \
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)" C- O; u: K, @) t, x
              {
. \6 [+ k! {' T  V6 s                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");6 q: ^9 a2 a( J  o+ @( D
6 T+ |! B. q4 ]1 @2 Z
                SAFEARRAY *pvNames = NULL;3 \+ d+ L# I3 g- h1 A& o
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)7 \5 ?5 u( {& ]
                 {
- D) G- n8 Q  x( @$ v; z                    long vbl, vbu;4 b- ^8 m4 T: h9 y5 p9 G, h
                   SafeArrayGetLBound(pvNames, 1, &vbl);6 B) |% w/ `- x5 N/ F
                   SafeArrayGetUBound(pvNames, 1, &vbu);1 m+ X' K+ X; |/ q% {1 L
                   for(long idx=vbl; idx<=vbu; idx++)
4 u( a3 ~  e+ O/ |' ?; f2 L9 \+ l$ C( d                     {4 L' T0 H. @5 p& V, A) s
                      long aidx = idx;
6 f7 r$ e  Y1 r- D! s. j, t% a, ~                       wchar_t *wsName = 0;
% i3 [& v4 f5 f/ K                       VARIANT vValue;/ y2 p9 @& v* c) f" b
                      VariantInit(&vValue);
" f! ~9 Y7 d) D4 z7 \" O                       SafeArrayGetElement(pvNames, &aidx, &wsName);
$ P% V- a; V! }( u: L
" V) r7 l: n* c+ Z* y+ H                       BSTR bs = SysAllocString(wsName);
+ o0 j1 I! g" K3 _2 I: x- N6 l                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
0 K- p, S/ n7 V$ F- c                       SysFreeString(bs);
* r" q  D3 @6 K& T  o) e/ z9 {6 u# K6 I$ M2 I8 ]/ o
                      if(hRes == S_OK)2 H/ k& u  D: j$ g
                       {
" b7 g8 _1 a! z4 u/ i                          AnsiString s;
- y# T4 c. J% y  e                          Variant v = *(Variant*)&vValue;) k' ~4 A! w; [# p, x9 Y
                         if(v.IsArray())9 P6 V) g* E1 L! q
                          {7 T0 Y3 H1 u* a. f: p5 L
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)$ c  Q7 D1 F, I% F% g# C, g+ U6 [. `
                             {
3 Z0 G3 |5 o; h# m* |                                Variant a = v.GetElement(i);" B- e5 I5 m" l+ }# L
                               if(!s.IsEmpty()): H* Z  ?! s$ z" j, ~
                                 s+=", ";
1 g7 |' I2 s2 @% U6 a                                s+=VarToStr(a);1 i; M/ ]/ E4 H+ A
                             }' I  d: d* Q5 ^# L9 ]- y3 h
                          }" X0 B! K' v2 t3 ?6 Q: @
                         else  U2 U1 E2 v5 S+ n" U' M- C
                          {% E) ~: Q+ x# G: n% _
                            s = VarToStr(v);
. ^9 r' W- [4 \# u4 b                           }$ F) f! V+ u4 I8 ~; \) r3 S5 G
                         lpList->Add(AnsiString(wsName)+"="+s);
* I+ Z! N# M# o% _4 ^( _                        }* j+ Q9 x4 b  p  |( W1 R

. q  L2 B+ D& s5 e0 @  W8 z                       VariantClear(&vValue);5 [1 |& D# {. J+ J/ ^
                      SysFreeString(wsName);
; g  }4 U8 n+ n                     }
: T( G) a3 Q& @2 m                  }
+ X9 i: `# Q: h4 @1 z                 if(pvNames)SafeArrayDestroy(pvNames);
% q# g0 n- w+ d* Y5 K                 iEnumIdx++;
! i" D+ g7 F8 z; _5 C8 }& G               }
4 P8 X' D! j/ q! v- k$ j6 k' [            }
3 c) J% ~- e0 N( P$ t& L! V2 W           if(pClassObject)pClassObject->Release();6 l% ?) A1 ^. R. j6 ]* x( V
        }# J$ E) s3 c; |8 {3 x9 K
       if(pEnumClassObject)pEnumClassObject->Release();
; z$ x0 q" h5 L& z: {      }. p2 ?, M; O$ h9 M, M- n
    if(pWbemServices)pWbemServices->Release();- v7 l& r; A6 d1 _9 t
  }
: t& N! V9 w* A3 ^1 n2 N  if(pWbemLocator)pWbemLocator->Release();' O0 ]* W0 h. M8 z0 P' r" V
}
$ Z# ^3 v, c0 ]" h9 m0 L//---------------------------------------------------------------------------& h4 m% {7 X  U9 z! Y5 _3 l

0 P3 G# ?* f$ M0 C) K// 通过 WIN32_bios 获取 BIOS 信息:
8 S7 D8 k' d6 r- [$ r: Z4 n* pvoid __fastcall TForm1::Button1Click(TObject *Sender)
9 e8 k0 b- R+ ?4 r{
9 e$ x& G" D- c: t) S0 x5 c    Memo1->Lines->Add("================== [WIN32_bios] =================");. f; U% I& p& {; F/ `
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
) r- o0 [! [1 G! x+ i    Memo1->Lines->Add("");
$ T/ t7 ~6 j  x+ A- b% Y}
/ D5 A" k* q. `7 e
0 w( ]8 z. V$ [7 r--------------------------------------------------------------------------------5 P) Y. Q" L5 k2 D* a; _9 B
& E0 k0 p4 H6 }
WMI 可以访问的信息类型有:, C" }. o! p% E- m
  Win32_1394Controller4 a! ~: a. {: R1 W- \3 _& n& u
  Win32_BaseBoard
2 `1 a4 ^9 i- U. r/ z7 j4 g   Win32_Battery4 s) |- s: L6 Y: v6 ?7 ?/ r8 U: \
  Win32_BIOS
) Y0 t, ^: H. B9 p  e- S0 W: J   Win32_Bus) K6 D' O" W& b' t# ^8 _: H
  Win32_CacheMemory( \- v3 `3 u6 y
  Win32_CDROMDrive0 k0 d/ M- z$ }: z6 y( i
  Win32_CurrentProbe
0 g- D; J, L$ ?! m( H   Win32_DesktopMonitor( W! c1 j7 h+ C9 A
  Win32_DeviceMemoryAddress  _* w2 y* K4 @- E" I+ b3 j
  Win32_DiskDrive
# Z5 r: x" A5 G4 m0 z( f# R/ b   Win32_DisplayConfiguration0 U+ b" o; V6 k, G( g9 h! h5 x
  Win32_DisplayControllerConfiguration& G7 _/ d! k9 c4 l
  Win32_DMAChannel2 }4 G. E8 V! E( d; _' O
  Win32_Fan5 s7 U  G. b0 A$ K, P4 d1 w* ^9 r
  Win32_FloppyController
) p2 m$ M- e3 w1 }   Win32_FloppyDrive
. p& j' w* C7 C" ]) N) f   Win32_HeatPipe( P0 T( C* Q1 [" o9 N* q* A
  Win32_IDEController1 v2 b% Q2 n8 ^
  Win32_InfraredDevice" j1 a$ ?5 V$ J, n5 s" i  t
  Win32_IRQResource
: _# T8 x# `, Z* }   Win32_Keyboard  v8 W& V7 W3 }) C+ Z7 {- [7 g
  Win32_MemoryArray
7 h6 C4 B( z6 D0 W; s   Win32_MemoryDevice! U) M( t; X! a2 p8 H* M' y
  Win32_MotherboardDevice+ V- a6 q$ |+ w0 i: U& z$ q% T
  Win32_NetworkAdapter
0 G& S! B9 s& w8 @4 v' g' Z   Win32_NetworkAdapterConfiguration
: h7 J3 G- x$ n* d   Win32_OnBoardDevice
/ i9 a6 ]& }; x- o  i1 t6 Z, W   Win32_ParallelPort" U5 D5 `3 z) K
  Win32_PCMCIAController3 E' R# c: A$ I* f. W
  Win32_PhysicalMemory
+ k$ {6 H+ H* [   Win32_PhysicalMemoryArray4 e4 x) h2 Z7 r' I
  Win32_PnPEntity
& K. w, _# C) F5 c7 I: j) i0 n   Win32_PointingDevice
1 X0 L1 B( p) _4 E; A   Win32_PortableBattery
% q2 Q& d- y% o2 \; ?   Win32_PortConnector" h" ^9 |) L9 O: q, G5 a+ y
  Win32_PortResource
: z+ a; `1 N* D. b% \1 l& ~( r   Win32_POTSModem* f5 ?9 ~9 z: F5 o7 Y" w
  Win32_PowerManagementEvent
: D  s. J' k& `   Win32_Printer3 U0 z! t/ z0 m
  Win32_PrinterConfiguration" w9 z: `+ k& N- ~
  Win32_PrintJob
- T* w" d' }( e6 Q* }! q% y$ \   Win32_Processor* _# f4 t6 g  w
  Win32_Refrigeration
1 @" g5 W# t) W2 O   Win32_SerialPort2 ]9 t4 e8 c2 P2 U8 S: e0 s
  Win32_SerialPortConfiguration3 }, I6 u8 M6 ^& q4 ^
  Win32_SMBIOSMemory
  J0 h2 M  ], y7 Q+ d" b* R. U   Win32_SoundDevice
$ g1 `; }0 h' Y; M' ]   Win32_SystemEnclosure
  K$ }2 E! `0 c+ b1 E   Win32_SystemMemoryResource
/ }9 q/ _( o2 N) x( F   Win32_SystemSlot3 z- S  y7 }- V; k; Z
  Win32_TapeDrive' t9 R' e, ?- N/ n. j' Y
  Win32_TemperatureProbe
( B/ S2 d+ P4 H% I: Y3 v   Win32_UninterruptiblePowerSupply
5 u# J$ t+ f. y   Win32_USBController
/ U0 s2 i/ j4 t/ C3 u5 r" L, l   Win32_VideoConfiguration
( [' N3 r6 ~# ~5 j0 R   Win32_VideoController
: Y, X1 H% N: e2 s& R' Y- N. H; f   Win32_VoltageProbe: k$ @6 D  X8 L# O! ]$ r  ^

  `! z! I% j! ^; R4 F) ~以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-10 08:25 , Processed in 0.017778 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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