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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
2 N/ w' J* R: _8 B! n$ y. X* H
2 H9 j9 Q; l5 N4 Y: m# t( e( Q+ ~2 }7 |; z& Z2 P
--------------------------------------------------------------------------------) v2 r* k2 h# R" x3 ]0 p1 e( I
WMI: Windows Management Instrumentation (Windows 管理工具)
& c  W" p9 q* _  X! Y/ S5 L: c   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ! Z& f$ E" y7 Z5 b9 t
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
6 f% G, ?' v: b- |: S; u   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 2 N9 O- y' {. m* T* {

. y' x7 I2 X' m% X# \--------------------------------------------------------------------------------0 ?9 |0 a0 F, f# f7 t. ^, ^  N' S
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面. y) D  ~- H8 @
8 C0 g% ]5 N4 m. u
--------------------------------------------------------------------------------
5 A4 r7 {% W. n( D① 初始化 COM 接口:5 m  M& W$ y6 `
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。& D( Z* c. R. B# n
  这两个函数在 #include <comdef.h> 里面定义。
& ]" m: C# X6 {" g8 d
) T' W3 Y; A; R4 E  e# R: T) v② 获取访问 WMI 权限:
: p* F: P4 L9 W$ \   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
7 r/ N$ e% B2 u   如果这个函数返回 S_OK 获取权限成功, 否则为失败。% ?3 ?: ?3 p3 i* P3 a- g5 L* V
' P! i) ^' a( O1 u2 H$ _
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
. E9 L* U% M1 i   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。2 r9 v1 q2 z" `6 G2 o- Z9 C
1 _% Z6 Q% s# U
void GetWmiInfo(TStrings *lpList, WideString wsClass)& k% X  }' H- E# i' E3 p
{
2 w) N5 O3 Z7 n  ?, Z  IWbemLocator *pWbemLocator = NULL;
7 x% v+ _% x2 c4 y; `# M9 _  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)9 P% q3 O( W& }. B: u+ @9 |: i
  {
& z$ U1 z& L4 ~7 N; E  k     IWbemServices *pWbemServices = NULL;
$ M0 a) N6 }  x+ C  ?, B     WideString wsNamespace = (L"root\\cimv2");. J2 z. y- ]+ A: S5 q8 p) y& V
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)! J4 x% Q' h5 B
     {
( f* r8 X6 e3 ?* W        IEnumWbemClassObject *pEnumClassObject = NULL;7 J/ P! n, b  }( X1 l) {# `
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;8 w5 s5 h9 O5 i2 a: u7 [; }
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)9 j3 l- ~% r% t) E4 T
        {$ h7 i3 a7 j* [5 V2 b
          IWbemClassObject *pClassObject = NULL;6 F# c6 u3 i8 y# ]
          ULONG uCount = 1, uReturned;
; `) F9 M8 Z1 d# F' `           if(pEnumClassObject->Reset() == S_OK)
1 J! P7 }- K: ]5 q! J: q            {
+ }/ U' h3 {. h& N              int iEnumIdx = 0;# \! R) G& p5 B! h1 Z
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
, p1 u1 u3 `9 T               {* o# g; i% l  d% u" H
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
4 ~( W  O; u- e
, L5 Y, p+ p, g( {% B: u* C                 SAFEARRAY *pvNames = NULL;5 W6 e; y! \9 ~6 K; @  A, Y+ w
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)$ q# U* [' I9 o$ F% U
                 {
( Q: d5 c# \* J  G/ L% Y                    long vbl, vbu;( D3 D+ L" P" h' t$ G7 A& y
                   SafeArrayGetLBound(pvNames, 1, &vbl);
# e5 I8 w$ j  [; Z+ j  [& b/ r; N* E                    SafeArrayGetUBound(pvNames, 1, &vbu);
6 C0 t/ g! t7 B* C, J4 }7 K' v                    for(long idx=vbl; idx<=vbu; idx++)
  v. f- t8 A  B6 {3 c* [, r                     {
" M' F3 {5 ^# ^, ~2 \) j& l1 v0 f                       long aidx = idx;6 h( o1 O- b: _# o( B  @. V' Z5 d
                      wchar_t *wsName = 0;
6 W! l( j2 {# ^2 K2 i                       VARIANT vValue;+ N* m# r4 y% I) R- @
                      VariantInit(&vValue);
- J7 D  H( D* {9 ?                       SafeArrayGetElement(pvNames, &aidx, &wsName);3 C; S! g  L! R* A2 E  }
; c/ L  l$ }: `+ l
                      BSTR bs = SysAllocString(wsName);4 a3 v/ k5 Z: e3 R5 C
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
4 |3 ?# k. ]% X% P4 r9 T5 D                       SysFreeString(bs);
& \: }8 Z& w4 _" [/ J3 E7 n" Z
                      if(hRes == S_OK)  s1 f3 V6 E/ [/ D% ^
                       {
" \4 @& N% s0 r                          AnsiString s;
/ k$ Q% G" s- O1 `1 H                          Variant v = *(Variant*)&vValue;
$ B" M; @/ c. x                          if(v.IsArray())+ N  u: n' g! o9 L' i
                          {+ ^: g! q0 E. H" b0 @
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)/ H4 |  p9 |% B/ y, D
                             {
7 f( {4 Y) z* W* C  \( A3 E                                Variant a = v.GetElement(i);
& s% Q: e: a6 l! ^* U1 `1 }                                if(!s.IsEmpty())2 ]- ?, R& ?+ a) q: D
                                 s+=", ";
- D+ o6 q2 W9 q2 J/ E; ]% N                                s+=VarToStr(a);
5 m$ n2 D; v/ L- f/ O- L- G1 f                              }
$ m# Q# b# T6 T- C* L  z                           }
9 P& s1 O4 D* N- x* G6 T7 x                          else
- a4 `; y5 k- z! U                           {
( n+ B3 H. R  T3 |- _! L8 X/ w3 l2 w                             s = VarToStr(v);( O( u0 W$ ]# ~) z; ?' v; Z. x
                          }
# p  N3 L& W3 s; Q5 p& w                          lpList->Add(AnsiString(wsName)+"="+s);
# W( n4 A1 @  Z6 e/ o                        }3 Y" p/ A/ i4 ]
  z; J7 S0 P6 {% Z( o
                      VariantClear(&vValue);( z1 \3 p3 ]/ ]. r' s9 X
                      SysFreeString(wsName);
! N+ s0 _* P5 |6 @1 L                     }. P% P8 A+ _. ?2 T
                 }
- H; H7 c0 y4 f# w                 if(pvNames)SafeArrayDestroy(pvNames);
! u  z% |, V( s$ r  w! n/ p                 iEnumIdx++;2 p/ @& A% Q! D5 M
              }
) i: q6 M2 F9 ?$ A9 o            }
1 V+ J" l' W$ Q           if(pClassObject)pClassObject->Release();9 E, t6 ?. p4 X3 t& t
        }
  }0 q% R% D2 W        if(pEnumClassObject)pEnumClassObject->Release();
; v4 H" i# P/ N1 k' x      }
. a! E1 h- ]4 \1 x     if(pWbemServices)pWbemServices->Release();
$ [( l! M0 ^2 K( f* F" l" X: ^   }
' v$ ^5 ?& F# R7 H* g# q  if(pWbemLocator)pWbemLocator->Release();
9 l: z, V5 z$ t4 Y}
+ L: C. ^8 S( c//---------------------------------------------------------------------------* S8 y* k; ^6 L
7 p' x3 l2 G, [  ]5 x# m2 s
// 通过 WIN32_bios 获取 BIOS 信息:
) ~0 D# T. ^# n2 N8 R- kvoid __fastcall TForm1::Button1Click(TObject *Sender)5 n+ K4 v' ]& `7 {
{$ c0 x2 |( X6 X2 P1 @2 ^4 k
   Memo1->Lines->Add("================== [WIN32_bios] =================");
3 Y" ?6 X7 N7 y5 m  E. R$ i9 k    GetWmiInfo(Memo1->Lines, "WIN32_bios");$ J! T! k: w8 r# |
   Memo1->Lines->Add("");
6 i! I& a1 Z8 x1 G# n: B6 f" g}1 ~9 v' i. T5 l* Q6 x7 P
& t, D2 c% B. I7 W! D
--------------------------------------------------------------------------------' l/ w2 P) R3 Z2 S" c# c- d
: `5 k9 n7 R  ~6 ^
WMI 可以访问的信息类型有:' T* \  Q/ h: Z9 t
  Win32_1394Controller( d0 V$ f) g# m/ c( u; V/ j1 H0 }
  Win32_BaseBoard/ O& Y8 q. v6 L5 Z
  Win32_Battery
6 X/ i/ G) I2 P. K* o. [* }3 U1 J   Win32_BIOS
8 n) m2 h0 r$ P   Win32_Bus
* b; f! Y4 M: A" L8 ~; a5 F9 e! i   Win32_CacheMemory
+ u8 i7 _5 S3 L3 F0 {4 E   Win32_CDROMDrive/ Z; i7 e9 o7 [6 D
  Win32_CurrentProbe
8 W. c: t. L1 o; V   Win32_DesktopMonitor! O' _- c' O, E, K3 W9 J) r. M
  Win32_DeviceMemoryAddress: M% t3 H3 A, G6 h; e
  Win32_DiskDrive
. t4 R, X* C  ^1 y7 l0 c! E   Win32_DisplayConfiguration+ D' T4 T( g, ~; H- y* N+ C
  Win32_DisplayControllerConfiguration
3 F0 j/ }. ^* h- g/ K0 [   Win32_DMAChannel
/ n2 {: v) U: a8 z) p9 p5 x1 e   Win32_Fan
0 g$ A$ Q* c4 R2 g( d" U* E   Win32_FloppyController/ U+ A/ @8 @- n, o3 M* i
  Win32_FloppyDrive
# I, n4 g+ C* N# T/ n0 R- y& v   Win32_HeatPipe
3 M6 C4 X. k* ?& y6 M, g   Win32_IDEController8 l# y# O+ m4 y) P/ F7 E2 Y" P
  Win32_InfraredDevice$ Q9 q. }0 C: k2 j8 Z- k5 }5 z
  Win32_IRQResource
/ P! q+ r) n, \  @* E   Win32_Keyboard
8 e) ?' Q+ y. ?; M5 ~8 A8 |2 S   Win32_MemoryArray
. p! O2 x/ l4 @) X   Win32_MemoryDevice
4 u  m+ Q' Q# \+ f- I   Win32_MotherboardDevice4 w, Y- F% g- v8 [# a
  Win32_NetworkAdapter& V+ ?) Q5 y2 u9 P$ C' ~0 W
  Win32_NetworkAdapterConfiguration
2 L) _* F+ Z, q& d   Win32_OnBoardDevice
2 ^- f4 g7 }. t- @/ S# B* M   Win32_ParallelPort# q" @6 X' v& |' u0 l" N. S+ j1 h2 b" f! Y
  Win32_PCMCIAController3 |7 g7 d9 A$ `: D, b8 Y
  Win32_PhysicalMemory6 V- A2 O  X' W
  Win32_PhysicalMemoryArray; y2 N' y& o; H4 \- r
  Win32_PnPEntity
- m$ I1 s- n8 h4 S2 e   Win32_PointingDevice
% `/ [; E3 x$ _  s- ~   Win32_PortableBattery3 E5 Q, z0 V" a' d! g2 C
  Win32_PortConnector9 e1 G5 W3 j" \$ z' z) T
  Win32_PortResource4 [8 {, T3 l- E5 ]2 t$ I2 R
  Win32_POTSModem5 t7 _/ V& S! o' r0 K7 ]  W# G
  Win32_PowerManagementEvent; Q* o, |" H: U. s" E3 z6 Y: b' _
  Win32_Printer
# q( c( ^& g4 u0 f9 D8 M   Win32_PrinterConfiguration6 c' K  T, B* x/ |
  Win32_PrintJob* ~+ P+ C& }5 b8 j0 q
  Win32_Processor% O* h: h3 E: s* G
  Win32_Refrigeration5 ]" z- B3 w2 H) h0 k* T% G) Q
  Win32_SerialPort
6 I. q: N( x9 E0 L2 B   Win32_SerialPortConfiguration
& h" c  C$ w9 h3 `# ]   Win32_SMBIOSMemory
. ~% q$ ~- U; ]* o8 }   Win32_SoundDevice' X/ ~7 ~/ U7 r$ _8 ?# L, S5 |7 R8 m5 I  ~& }
  Win32_SystemEnclosure
* c" o) j) L, a   Win32_SystemMemoryResource$ U: Z. Y' `$ H) e  ^' s4 Q
  Win32_SystemSlot$ _; Z" X, o: m5 e# Q5 b; W1 {
  Win32_TapeDrive
) f$ Z% u( r$ l   Win32_TemperatureProbe
& I5 \1 B) n7 n) K$ w. A0 Z   Win32_UninterruptiblePowerSupply+ m: {0 l3 i9 K, r+ O( b' L
  Win32_USBController
$ H' m6 U5 J' z9 H5 G. A   Win32_VideoConfiguration" i. _1 L& L) e3 T2 q6 N3 \$ W8 w( u
  Win32_VideoController) J7 C& X2 Z0 b
  Win32_VoltageProbe
, {4 T* Y+ C9 {* ?
$ n/ X- |, s" @* ]- ~. H' d. ?以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-25 23:57 , Processed in 0.018078 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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