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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)5 J" Z5 p7 d- U! e$ `  ]2 B0 e, @- r
8 [% ~  t) D% a: C8 q

3 H( ?- d% R" N# ]4 P8 r  O# ?--------------------------------------------------------------------------------
* Z4 K8 M" b5 j0 N( `WMI: Windows Management Instrumentation (Windows 管理工具)" I/ \  M0 ^& ~+ S
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 # F6 q1 s7 ~2 M. i- j
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
2 }7 C. O3 R3 b5 e8 W( r+ w, i   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 , u/ Z+ q" z* M6 f
  m6 O3 h8 n& @; n6 ]' X% I; Q
--------------------------------------------------------------------------------
/ }9 m$ P/ ]/ o0 T) IBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面* h& V" O' z$ J2 B. H1 `
% C! h$ _' `( d5 w$ n0 @: \
--------------------------------------------------------------------------------% w& ]1 \" l* U. C
① 初始化 COM 接口:
" K2 @  ]; A9 p' A3 Z4 k   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
; y2 f$ ]. n) d# u   这两个函数在 #include <comdef.h> 里面定义。/ k- U2 K' N9 ]' @( L2 D" L
' ~  J5 p' d) j$ f% e
② 获取访问 WMI 权限:: R& T+ ]' u- K% x
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
% N. [2 B; k" Z- L' Y- k" h1 b$ B   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
* H8 p! y; w& u& Q& n' [
( d' H3 t8 b4 C) |. Y9 }; |  H③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
; T7 e; J: g* w) A2 o$ R  L9 c   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。+ d5 m+ i2 q5 [! `5 R! r, [
/ h8 h" O& t: y6 }3 h  W; W
void GetWmiInfo(TStrings *lpList, WideString wsClass)
- `1 I% s0 V: c8 o{- Y" d7 Z/ b1 B: R0 W: w, L
  IWbemLocator *pWbemLocator = NULL;
  ~" g! H5 \: i# g6 m3 H+ s  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK): G# q2 W. Z- v/ ?/ w6 X
  {. R3 [) g5 t- x) Z
    IWbemServices *pWbemServices = NULL;
# ?( {% B9 s6 k( {3 q1 J5 d+ X     WideString wsNamespace = (L"root\\cimv2");
! A: q6 ?) `$ M  [  ~     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
7 \# L- _9 ?9 d8 X" ~' n( X- Y4 e      {
" b6 q4 d) q- n* R( X- V$ u5 x        IEnumWbemClassObject *pEnumClassObject = NULL;$ X2 ?/ ?3 j  w. u' n
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
; v# y* Q. f) u5 A& ]        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
1 A7 H) `9 G9 Q* ~         {9 v5 c; o; a1 j1 [4 n8 n5 K
          IWbemClassObject *pClassObject = NULL;9 n0 [, p; V5 x# ]
          ULONG uCount = 1, uReturned;
9 T& r7 D( ~. G4 O           if(pEnumClassObject->Reset() == S_OK)
, G, d+ C1 S8 q2 ^) f            {* m9 Y/ M" V2 y
             int iEnumIdx = 0;
% j. R; e, w& d8 [0 [2 {              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
3 t  D2 [+ |0 l; w) y               {
* n! X( z+ f5 k( I2 v4 o* c8 i                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");8 }5 s( Z+ B- i1 w" K
% w8 R% M1 j3 H4 N' i
                SAFEARRAY *pvNames = NULL;
* n5 ]: |/ m, V/ _9 ?1 C                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)& r4 |8 g5 \( f, j/ l
                 {4 Z/ F/ k7 Z$ O, d
                   long vbl, vbu;* Y. r; }% S# e" R% T2 r
                   SafeArrayGetLBound(pvNames, 1, &vbl);
7 B! m- l0 q4 @# l3 Q$ D4 ^* n  P, t                    SafeArrayGetUBound(pvNames, 1, &vbu);8 I/ X0 E8 u; A$ x. |  h
                   for(long idx=vbl; idx<=vbu; idx++)7 M& ?1 ~& X0 N1 ]
                    {
# S, A" o+ s9 h- S+ \7 N                       long aidx = idx;' }+ m, y6 O6 N! u3 [. c* a# ?1 l
                      wchar_t *wsName = 0;% r. e: P4 e: k- p  l' m* \
                      VARIANT vValue;8 E) M/ Y' K: `1 U% y) V: b
                      VariantInit(&vValue);
. E6 s5 ^1 Y$ w( S9 }                       SafeArrayGetElement(pvNames, &aidx, &wsName);
. Q+ w& q! x" q- o3 u" [7 R5 @7 Q  ]) Z8 v8 R( _- l5 x6 Y. I
                      BSTR bs = SysAllocString(wsName);
! Z% Q& g6 G8 ?, a                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
) A+ i- O1 z+ H' s2 I) }& A1 u, W2 Q                       SysFreeString(bs);; L( p+ h" L4 P% y" ]& H" m% d  a5 ~2 e
  A! U3 b' d9 _. R: t4 ]' L2 D
                      if(hRes == S_OK)) F: N6 r0 I2 U7 Q0 |& U
                       {
/ j- ~+ b9 d6 Y5 M$ F5 q                          AnsiString s;
/ {. I% {3 R8 g+ |. U6 s  z" E) n                          Variant v = *(Variant*)&vValue;% |8 @4 C/ ~) Z  v/ L% \( e
                         if(v.IsArray())4 f7 P2 ?0 L. @
                          {
- A8 n( T  f4 a: O& o                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
1 A. K; `+ p6 p8 {                              {& D: `4 k# n0 `. [1 l
                               Variant a = v.GetElement(i);) Z; Y2 H: v- n7 i! l
                               if(!s.IsEmpty())
3 H! H$ J$ H! D3 n/ K0 z                                  s+=", ";
' }- u8 x% p+ c2 D1 s3 F( C                                s+=VarToStr(a);( B7 _$ c9 M: e/ w7 C9 x6 c
                             }5 E% Q% O  ^8 Y4 S6 U
                          }0 I! {! B) O- ?, W
                         else
" z% p- J8 [2 U; F! K" f3 k  |/ g                           {1 ?2 t% |0 p4 A0 N, K  B
                            s = VarToStr(v);
( ~1 D* a8 h; ^/ \) z& n                           }& u" m0 a! d( \8 Z- k
                         lpList->Add(AnsiString(wsName)+"="+s);* O# L3 I0 t0 z% x
                       }
2 ~/ l. K! O3 I. j; v
$ P5 J6 b! _! A                       VariantClear(&vValue);
5 V5 L& E: a& U                       SysFreeString(wsName);
  z: E! P* m( v# z1 h( i                     }
* {6 c( X% m9 {4 L                  }, S, u- b+ }% q, J2 c  {% y  ^
                if(pvNames)SafeArrayDestroy(pvNames);
0 K3 u8 S6 x0 B$ c8 Y6 Q% X* Z                 iEnumIdx++;
/ Q5 N+ g1 d3 j9 V9 P/ `, ?               }
+ x1 D5 Z, J' m6 |! Y$ c            }6 K$ \" \7 c+ j( B  v% z
          if(pClassObject)pClassObject->Release();
/ O. c, }5 L( a' v# C% ^/ h         }" T4 y7 j5 z" X
       if(pEnumClassObject)pEnumClassObject->Release();
- y# l: N9 d$ T% X1 O2 W4 D5 k+ c: V      }
8 I3 o# j5 {3 r. b! K2 C1 g( M     if(pWbemServices)pWbemServices->Release();
9 g* d4 e0 z% m; B   }
% r8 F/ `1 T5 d/ k% A1 X  if(pWbemLocator)pWbemLocator->Release();
+ M. N  ]+ ]  G4 X}0 W$ Y% F7 ?9 `# P3 Z4 r
//---------------------------------------------------------------------------3 A, a( e* m' F+ ^( S+ U
1 [$ H: U% [* t. X3 C* g  q$ j
// 通过 WIN32_bios 获取 BIOS 信息:) P; |" z6 ~, x% _9 Y0 \
void __fastcall TForm1::Button1Click(TObject *Sender)) L6 j! G; V6 w
{' Y5 M3 K" c) {/ J8 |, V1 h
   Memo1->Lines->Add("================== [WIN32_bios] =================");
# j5 o1 [+ p% F% @" _  t3 D' z* \    GetWmiInfo(Memo1->Lines, "WIN32_bios");  ~  _' U9 |+ U; b
   Memo1->Lines->Add("");
: Q0 y: C6 v' |( U; L+ f9 B$ S}& h5 g% _3 T1 z" F/ ^

' Z/ b2 L+ M. q; R& w& _3 u--------------------------------------------------------------------------------, \, r# e, V/ o$ B' U
$ E5 S: K3 d( K3 G, V: G
WMI 可以访问的信息类型有:# e) h  G2 e7 \1 E& m% N0 ]
  Win32_1394Controller
; ~" p6 c- x0 ]7 [6 p8 W   Win32_BaseBoard
  ?5 y! ?2 j% W9 [, {: o& V   Win32_Battery
* m' ~1 H! o1 x9 @   Win32_BIOS# q2 s" d8 z6 W" A% ]
  Win32_Bus7 F" H; G; W+ ]7 x' R
  Win32_CacheMemory
5 r6 _# P% g8 T! ~& h5 W1 @   Win32_CDROMDrive
' b  N  d; E+ r5 e4 a% x   Win32_CurrentProbe/ E: X6 `5 k0 Z- w$ q2 d
  Win32_DesktopMonitor
9 r- c; G7 w( B. C6 V8 f1 L   Win32_DeviceMemoryAddress4 w! i& e" X1 _5 U5 w. d" V; X. t
  Win32_DiskDrive( f3 w' \! v; B  O2 v1 ^8 ^
  Win32_DisplayConfiguration
! P+ E9 V& B0 P# a6 r   Win32_DisplayControllerConfiguration
) b2 k& B- W4 @* s   Win32_DMAChannel
. P- {  @( Y& y/ ^2 {- r5 @  }   Win32_Fan# M1 w5 z3 b! v
  Win32_FloppyController
3 Z7 V" H8 [) ?1 H8 a$ s8 y" H   Win32_FloppyDrive2 _0 _- {! R( _0 F7 T+ a
  Win32_HeatPipe
% e6 H  G$ a0 F   Win32_IDEController) x! ~4 A1 e4 R, B# V2 w- H; ]4 A) g
  Win32_InfraredDevice
3 _# \" H, D" G% Y   Win32_IRQResource
3 \+ A. x' l& {3 }6 M& L   Win32_Keyboard
8 ~7 T  U5 \: H, v. T* ~# |   Win32_MemoryArray5 X$ u7 E" F7 p4 [4 J$ x" N
  Win32_MemoryDevice) U6 `& F) e$ ?4 j
  Win32_MotherboardDevice
$ B$ Q/ @. W2 h* _   Win32_NetworkAdapter
- e: p" J" L3 T# g+ X! p  q7 z   Win32_NetworkAdapterConfiguration) w- r. e# F9 _7 Q* G
  Win32_OnBoardDevice' J1 }& b2 J& j' g0 F
  Win32_ParallelPort
& _) B* U! E. W* Y   Win32_PCMCIAController
, e9 A3 D7 S* t8 r8 m  j   Win32_PhysicalMemory( N4 C& l( K/ h# {0 h! f9 j
  Win32_PhysicalMemoryArray+ c; T8 g9 r  h9 i$ w9 q, Y
  Win32_PnPEntity# [7 _- U" @3 Y
  Win32_PointingDevice
% Y6 j2 v' m6 ~- |! u' h   Win32_PortableBattery: J# ]' q7 c+ G# R: N3 E4 s0 Q5 \' w
  Win32_PortConnector/ o+ u; L% g. m2 x
  Win32_PortResource
7 o% n) v8 _% k! H8 W   Win32_POTSModem  d5 u! j; C( m1 ?
  Win32_PowerManagementEvent
' ]2 `. O1 W9 \8 P2 Z' g* P   Win32_Printer& k. b$ t; s$ z4 y5 I
  Win32_PrinterConfiguration
! j. _0 q6 T9 n0 k   Win32_PrintJob
& Y/ ~$ Y( ~! b- _  m7 }# a; u   Win32_Processor
3 j6 B1 P% J# d" Y* S( U   Win32_Refrigeration- Z' e, N* {" |2 q4 \, @7 G5 I6 h
  Win32_SerialPort
- G) ^3 Y4 t& \, ?   Win32_SerialPortConfiguration: A' l5 R/ Z& C
  Win32_SMBIOSMemory2 }: u) E! @  G( V  p
  Win32_SoundDevice$ b$ t# k, i: Y# J3 B: P) B5 j7 Q
  Win32_SystemEnclosure
, H: Q1 ~# T* B( C   Win32_SystemMemoryResource
2 N/ T) S" S* V5 A( _6 D2 i   Win32_SystemSlot
3 Z5 u' M; Y& A' a$ }& c- h3 s   Win32_TapeDrive8 H4 x4 Q* W4 w3 B
  Win32_TemperatureProbe' K4 S# H$ W4 f, @8 i: i1 i
  Win32_UninterruptiblePowerSupply
# g% S  S' Z  s5 C+ U& {   Win32_USBController6 h& o2 L* H) I) W! s) n
  Win32_VideoConfiguration
2 M- }  Y) B+ W; V* D   Win32_VideoController
7 Z8 I( y. K3 @1 G, d( d   Win32_VoltageProbe8 f8 F# A2 K" X" V- v1 A$ Y2 N

: E7 k' T/ i. V5 p以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-2 14:12 , Processed in 0.019293 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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