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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)& `/ `$ p- h! [/ P6 U
; e3 L6 [& k3 q; q1 f) n7 b/ ]% |% E
' [8 ~4 _( h! a
--------------------------------------------------------------------------------
1 A" X! M( Y) ?0 F9 ^2 eWMI: Windows Management Instrumentation (Windows 管理工具)' i3 K4 P& ~& v8 r1 Y! C& G$ R1 I6 r
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 - N* i4 M4 k' M. z, o! q9 [( o
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
, h4 a* v& I; N2 X: Q, q5 R) E. M   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
, S, _1 ~4 x/ K
" v: j( G/ |( d+ h0 Y--------------------------------------------------------------------------------
: Y! O  s* R0 c- T8 PBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
8 n; J9 p# a$ w6 n: y% \
% n. G: ^$ A$ u  z/ C6 t--------------------------------------------------------------------------------. Z1 X1 A/ p9 W' B3 L8 L1 V  U) a
① 初始化 COM 接口:
3 I4 p% |8 V8 O   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。+ o+ e& V5 }" G) R( I6 y' k) x
  这两个函数在 #include <comdef.h> 里面定义。# o' M% Z2 S1 P: T% B

- k( y' i/ c3 p② 获取访问 WMI 权限:
: b. B& t: ~& u; W2 _/ t# L) P   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
9 ]5 _6 v: k3 B; S; V   如果这个函数返回 S_OK 获取权限成功, 否则为失败。% T; L! ]3 _: @# {. J
1 _4 C, q. r2 ~1 G# l# Y7 T0 X
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:" a; k; D; x0 a
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。1 |% f5 |6 C" M1 B3 i! H
/ s- D6 q  Q/ v; C/ A; V  Y8 `
void GetWmiInfo(TStrings *lpList, WideString wsClass)) e. v  j2 E5 @  Y2 ^
{
1 f) P' C# W$ r7 Q$ Y  IWbemLocator *pWbemLocator = NULL;
4 v! m- n3 N: l! a  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
3 }# |) q& y$ n* D   {
+ {1 b: L( w' C# V8 |/ x/ u     IWbemServices *pWbemServices = NULL;
) X- z' q: G5 k$ g" ]+ O: _5 J     WideString wsNamespace = (L"root\\cimv2");3 \% `, d5 E/ }( V+ C
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)! E* y) b. u2 @/ R( e2 x
     {7 w; K9 l. r! p# f+ x' {
       IEnumWbemClassObject *pEnumClassObject = NULL;
( W- Q" N$ P$ D; |- `        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
/ R) ^) k# e" v) I        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
/ }$ r, S5 V. P6 v7 I2 L         {
3 ]6 `4 v& M. z  d( I8 z' i           IWbemClassObject *pClassObject = NULL;
1 j+ m) M) G) W% m" y. A# Z! I           ULONG uCount = 1, uReturned;
8 N3 R) R' l$ h$ T0 h) s& \4 j           if(pEnumClassObject->Reset() == S_OK)
# i5 s# E! s1 m& @: y( [& Z1 {            {
& T7 l+ E5 `9 n- {; U              int iEnumIdx = 0;
  q7 z9 V& [* N# W0 S. M              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)7 v6 H8 _  X8 O* r7 ?* W
              {) h; ]% k2 B) B4 y5 P: p: X, `
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
/ T6 j! S3 h1 _8 Y
% \: x% u/ v$ k  M$ \) L7 j                 SAFEARRAY *pvNames = NULL;
3 v% H5 G- T4 _8 m$ e$ E  D                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)! @  ^1 J- Y4 a4 |4 S
                 {
& [+ q$ \' e3 b+ t! Q0 P                    long vbl, vbu;/ A4 m8 Y. `6 `* B7 J
                   SafeArrayGetLBound(pvNames, 1, &vbl);
1 C" g. Q/ v# W" y7 O# w                    SafeArrayGetUBound(pvNames, 1, &vbu);
0 l* B3 k/ z4 u8 s/ T" l$ e% m. r                    for(long idx=vbl; idx<=vbu; idx++)
( q/ Z' c; \8 f7 B9 m2 ^& P1 l- e                     {
6 |. U3 r2 r, b1 t                       long aidx = idx;
8 [  K! A4 t/ M( [7 k                       wchar_t *wsName = 0;
! w  G# n4 S* y/ J* Z, _7 j                       VARIANT vValue;  j3 f8 q3 A. t" K* B+ t0 C7 U
                      VariantInit(&vValue);/ {2 v1 c, o. y, x7 l
                      SafeArrayGetElement(pvNames, &aidx, &wsName);' E+ i3 X: ]" g- }# h6 N

& b6 C7 m7 O1 U                       BSTR bs = SysAllocString(wsName);; i3 i: T. S' w
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
% f+ S, y8 r$ X3 I0 ]                       SysFreeString(bs);1 ^, D! `  K! |

$ _4 p& m1 l) _/ p                       if(hRes == S_OK)) C- j3 z- l- G0 H7 @2 X2 m6 Q
                       {) g, L8 K; d. i  {: l6 ^  m8 a
                         AnsiString s;
! t! V/ d/ F+ h# f                          Variant v = *(Variant*)&vValue;! S, p# Y3 {+ i$ z+ T& K
                         if(v.IsArray())
( v# y# O2 o- C                           {# G9 f& Z4 U/ [2 u
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
) i; R* M1 ~: B0 y' s                              {- h* z' h0 H9 ^2 g5 {4 {* T
                               Variant a = v.GetElement(i);7 r$ s$ a) u+ @  P& q" ~
                               if(!s.IsEmpty())
- P# P: `, y* X4 W  O; i                                  s+=", ";! u* B+ [$ I6 W
                               s+=VarToStr(a);
' N6 i" t$ j* I) k. C( l$ N7 ]                              }( K& S! ?+ e1 m/ i
                          }
- N: d# Q5 S0 k( {                          else1 j' J( l8 r  M* h: A2 n8 a% W
                          {
. S9 u3 u7 h+ j, j, [& J7 A; ~                             s = VarToStr(v);
& T% S: Z9 c3 ]/ t- b* c% ^+ }! m                           }2 g+ e6 f: `( N/ ~9 P. b4 q
                         lpList->Add(AnsiString(wsName)+"="+s);
) K6 o! v+ R+ f, x' f$ h                        }
  I; l9 B- X+ j( b5 b2 @5 J
# X/ ~' {4 ~  w- r. w                       VariantClear(&vValue);
6 d2 ^% a' G$ f  m                       SysFreeString(wsName);: |! ^2 T8 V2 l: L; {
                    }$ G0 U1 g. \" {- D
                 }
  V1 u7 t( t( M1 U8 {; r9 b                 if(pvNames)SafeArrayDestroy(pvNames);- ?/ N! E6 [8 E& P6 t  f
                iEnumIdx++;
* Y3 h% @4 o$ z& U               }6 S9 w. S. I+ U; W
           }
: g: V" p4 P( R, z2 n/ H+ q           if(pClassObject)pClassObject->Release();
- n5 `; @4 p5 c) s$ Z         }' T/ {, s3 g5 P7 a3 ^) S; o
       if(pEnumClassObject)pEnumClassObject->Release();7 D+ H9 ^- z6 S" U' }* D5 d
     }% l% _5 l  ?3 R! V
    if(pWbemServices)pWbemServices->Release();
' n6 _: r2 R2 D0 W+ `; q   }
9 _- m% t) o5 b# @5 W$ V+ M7 n) s  if(pWbemLocator)pWbemLocator->Release();
- E5 {/ X4 \5 w- V}! t+ G" i  p6 F0 ~1 B( b. V6 c
//---------------------------------------------------------------------------0 O+ Q, V0 m# ]
  n" ~0 R7 S* n% A" t
// 通过 WIN32_bios 获取 BIOS 信息:: F. t# A. J5 {6 e- b- _
void __fastcall TForm1::Button1Click(TObject *Sender)) H( X$ T& N) R, `9 g  V$ w2 @
{
  h1 A, g1 V$ k% \    Memo1->Lines->Add("================== [WIN32_bios] =================");5 }( C- ]9 n8 s* E/ K
   GetWmiInfo(Memo1->Lines, "WIN32_bios");8 O2 q8 t. O- y" r& y
   Memo1->Lines->Add("");
$ O/ X' f- N: a/ f- d0 U}9 ~8 r% A: y7 L3 M6 u5 A
, \4 Y0 ~7 b7 |6 G: F( q4 T
--------------------------------------------------------------------------------7 _& \7 ^3 i5 v( q
' `3 }6 V8 R$ j
WMI 可以访问的信息类型有:5 B2 H0 |' u) N! [3 J  m4 h
  Win32_1394Controller; ^) `  H6 |! N, t2 x* f
  Win32_BaseBoard7 o  q# g0 v2 @+ E% F7 t
  Win32_Battery
& k) G2 s$ O6 g/ B; u   Win32_BIOS4 v2 h, w2 s+ K7 V. I' o" m6 \
  Win32_Bus6 n0 T; g1 t0 P8 m( z1 c5 n
  Win32_CacheMemory& q) \) {- j8 J- z5 |, |( X
  Win32_CDROMDrive
# l. y: `0 D# o1 l" F( q2 W" i   Win32_CurrentProbe* V. \% G7 j6 i' x6 x1 w: A
  Win32_DesktopMonitor; n+ I/ d+ |9 o, a5 O( P3 Y6 {
  Win32_DeviceMemoryAddress
. M4 a- ]8 q1 S  O# }. r$ z$ L$ D0 v   Win32_DiskDrive
4 I* [* F: V; z% T- g5 W   Win32_DisplayConfiguration
$ ^  @; Y2 c, `- |* X   Win32_DisplayControllerConfiguration1 y0 i5 q$ ~1 z8 A
  Win32_DMAChannel1 l! L3 [/ W9 O+ U. x
  Win32_Fan
6 b: z  e" \4 j, ?   Win32_FloppyController0 j  r# s: F2 C
  Win32_FloppyDrive
: k' O* d) g! w/ m+ B5 Z   Win32_HeatPipe/ d5 d3 J: w. z
  Win32_IDEController
7 I' {) e. v+ ^: V2 e* V  ]   Win32_InfraredDevice' D' {& ]+ J5 Q* a- q
  Win32_IRQResource9 ]+ u' S+ r: f0 N
  Win32_Keyboard
7 I/ L1 E( s5 i" y6 Z   Win32_MemoryArray
. u# T. H- z" X' P. M   Win32_MemoryDevice+ B; z* w& h# a
  Win32_MotherboardDevice& Z1 f7 n( h! i) A
  Win32_NetworkAdapter3 m7 I( R' v. y% l" A' [
  Win32_NetworkAdapterConfiguration
! j  Y9 x' q! O: i   Win32_OnBoardDevice
6 A) ~* T/ N3 @   Win32_ParallelPort
4 f  n/ M  u' M/ P1 q   Win32_PCMCIAController3 @1 F# Z$ n4 {0 O& @$ R% e; |
  Win32_PhysicalMemory  b' C* o$ W7 j: A0 o
  Win32_PhysicalMemoryArray
% s7 ~& E/ X& i2 V8 N' e   Win32_PnPEntity
' |0 Z5 X6 p& ~) v9 ]& Q2 ]   Win32_PointingDevice$ r; X4 O- X3 ^3 ?8 ?/ x
  Win32_PortableBattery
3 f; K, r$ t6 i+ f   Win32_PortConnector# A2 e. u3 ]; H, T
  Win32_PortResource
( K" F* D% r" i6 p$ p   Win32_POTSModem1 z4 t1 z4 u& k; k% r6 C; L9 N
  Win32_PowerManagementEvent
. x. {% u2 {+ n3 W' E% b6 a* E   Win32_Printer
6 ^/ M3 e" D+ R' M% ~' V* R   Win32_PrinterConfiguration' w4 f1 P# N. U! Q8 M
  Win32_PrintJob
1 b  T/ M9 `; Y. T' G  E2 D/ X   Win32_Processor
( Y/ z! w# c5 n% a! o   Win32_Refrigeration
. P5 k& ^0 J$ o; C3 @* Q   Win32_SerialPort
' M# c, a' Q) d0 v. |   Win32_SerialPortConfiguration( `0 @) L$ w7 C
  Win32_SMBIOSMemory2 A" \/ K! F% F' A3 e
  Win32_SoundDevice9 K; C" ?+ `8 {$ b# Z
  Win32_SystemEnclosure+ F! J4 C2 |5 F+ k& S, D  K
  Win32_SystemMemoryResource
% O1 n% L4 n# N   Win32_SystemSlot
2 f1 `5 B7 @/ s% a$ x# q* o6 r2 \! j   Win32_TapeDrive
  I, F0 z4 r( ~& y) h8 O   Win32_TemperatureProbe: R  H2 R" @) \4 w
  Win32_UninterruptiblePowerSupply
) F; P. o5 h. o( d   Win32_USBController
8 g+ G1 L/ V: ^" F7 q( v   Win32_VideoConfiguration
1 R2 W  Q0 ^9 i' y* I7 x2 [9 l5 e   Win32_VideoController1 ~: H; r9 Q/ s" T. z& s' d
  Win32_VoltageProbe
/ M0 t. B1 M4 R/ P5 X" V* W& o( C3 b
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-3 18:16 , Processed in 0.018596 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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