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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
) U: @: U9 h6 d$ P6 K
* i. n* V% j9 M+ ^; F2 H- F2 T
/ w3 J% j- R" }) T/ j7 i! f  N--------------------------------------------------------------------------------! c1 z6 c3 X1 u. u6 ?
WMI: Windows Management Instrumentation (Windows 管理工具)0 ]2 P, i. S$ o, H; ~
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
8 C; a6 }1 @! u" P' ~8 e; {9 r6 ]   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
/ U5 O: e8 x6 P5 y   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 . u1 N' M) |& p2 h; \6 Y3 d4 I+ c

# f; @9 u4 k$ K--------------------------------------------------------------------------------
8 d4 Z  j" k# ^/ M4 q' GBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
3 ~8 {& {9 Q; Q  f2 l) U% k- k/ `+ z) {+ V+ U3 f6 ?
--------------------------------------------------------------------------------7 g$ D9 j; }& l( _; A, m0 A
① 初始化 COM 接口:8 }7 O& q& \& Z4 f5 o' ^* b
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
0 y5 o6 L% M6 b- v6 W3 G4 d. C   这两个函数在 #include <comdef.h> 里面定义。
/ y, r* m; ~- G. w8 A* B% O! ]' h1 p0 n. A, Q* X8 G8 K" p  l8 e# b
② 获取访问 WMI 权限:/ d! K" r' k5 a* ?
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);6 b: H2 k3 G6 i' H7 D7 M# m
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。" [% e( U  A2 _' [
! W. A. J+ Y3 j7 _  E  p
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:. L$ k) w6 v1 j' u  A" Q' \& `
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
: J8 F+ Q9 b* v$ ^$ C: \: P: Z6 g0 l# O, G, z9 O2 ^
void GetWmiInfo(TStrings *lpList, WideString wsClass)
1 j0 J0 a; Q4 q% Z{
' c) F/ ?5 T$ I! `3 ]) ^' j  IWbemLocator *pWbemLocator = NULL;. W! r# Z' R) [8 j
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
% k* O: a' l& h! U   {
  a; _/ X$ J. o     IWbemServices *pWbemServices = NULL;
( c: h% r* k4 ]8 l     WideString wsNamespace = (L"root\\cimv2");
3 J! h& N- G- e, R& t! I& |; `1 d     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)  A' b3 p0 n2 k
     {
/ Y9 K2 n8 c6 _( x! W& u        IEnumWbemClassObject *pEnumClassObject = NULL;: _0 u" k6 ^0 z( @' p/ K
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;5 j8 e# E0 B$ O" w1 \
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)2 _' W5 j4 G' D. u7 X- _
        {
4 c: U* k0 Y& P5 a, i( _           IWbemClassObject *pClassObject = NULL;( w, }1 f4 m8 l* Z8 i
          ULONG uCount = 1, uReturned;
$ F+ |( O# I/ @; J, Z           if(pEnumClassObject->Reset() == S_OK)% O! }3 B) p" `5 ^" p6 {- V/ v  O
           {. F# R% q8 l/ v( B& ^. V6 a+ h
             int iEnumIdx = 0;
/ d+ p0 r! Q; c. V6 j: U  T1 {; |              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
6 {. J. ?( x. y- f' c# `               {
, P, v2 m$ V1 N' ?4 M                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
9 z! g( ^% M# l( ]5 f. u9 k$ G" j$ l
: Z3 O  K7 n& c7 b; V                 SAFEARRAY *pvNames = NULL;4 O) C& k4 r  B, ], \) ~  u
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
* ]. S- T8 E, N+ b2 i- [0 b                  {
: k4 k7 t! ^$ e2 S3 y9 e8 V( [                    long vbl, vbu;+ B) G5 W) S: q
                   SafeArrayGetLBound(pvNames, 1, &vbl);
, G; V$ A9 _, a( U; N                    SafeArrayGetUBound(pvNames, 1, &vbu);
* C, F* P/ X9 D  X                    for(long idx=vbl; idx<=vbu; idx++)
) f; z2 h! B' Y  l7 R                     {
! y4 m, n9 T9 O3 e                       long aidx = idx;
2 A* \1 L8 M- o9 Z                       wchar_t *wsName = 0;
" _" ^1 o: `; |$ }3 d3 }                       VARIANT vValue;8 {5 n) T1 l! @: D& X. C
                      VariantInit(&vValue);
' @) x- Z2 w# ]( Q0 M% Y                       SafeArrayGetElement(pvNames, &aidx, &wsName);
& m0 j, i+ f, A' u- [5 d) u  z! D1 Q* N
                      BSTR bs = SysAllocString(wsName);7 p( A4 \& W* ^; w0 d3 W9 H! L
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
  `8 C' H) G( X: a" }8 Z7 b                       SysFreeString(bs);
4 u) i; n. ~9 o2 B! p1 r% ^  {2 }5 h2 t7 G" |- Y; B3 t2 K8 x
                      if(hRes == S_OK)
0 H1 X0 e4 Y+ p9 y4 s, x, w                        {9 N1 ?$ o8 W4 d2 @
                         AnsiString s;$ j/ }8 j" B* @! b
                         Variant v = *(Variant*)&vValue;6 l! L# X( `/ u
                         if(v.IsArray())( K% `9 ]/ L5 B# ]+ H9 Y- k# f
                          {7 z/ t- E" g7 }) @  a
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
# n  H. |, `' N( X- t                              {
5 K5 r/ X2 e" T' u* W: M                                Variant a = v.GetElement(i);/ {  L; a. l. X1 I* h# N) w
                               if(!s.IsEmpty())+ T" C# h5 g4 v8 V
                                 s+=", ";
2 g( w/ n( W2 k# A                                s+=VarToStr(a);
: u% c' P) c. M3 D, U5 G, e8 Q6 z                              }  C# c7 }! V5 M0 m/ L3 t5 k- \, O8 t
                          }
" v8 [0 Q3 m0 e) U4 C9 u+ N                          else
% }- {/ O! F; U4 z: K# b% Z/ k                           {
$ S; A4 O6 ~, F3 W                             s = VarToStr(v);
/ K" I( F* A! n9 J# `5 b                           }; T% a5 A2 U# A0 k
                         lpList->Add(AnsiString(wsName)+"="+s);3 I# b/ a" K. {; f* T# E- k* l
                       }
8 ^8 G, x# l3 I) x% R
* ]- N4 e# D& r. |! T                       VariantClear(&vValue);" U# ~1 g3 p) f$ ?, A$ c
                      SysFreeString(wsName);
7 P& E. }; r  t- |3 C                     }( N4 N( t5 Q9 L" j5 n% `7 x
                 }0 T" ^; R) T( k
                if(pvNames)SafeArrayDestroy(pvNames);; d, Z. V6 G' [0 z+ U- b% i. J9 {
                iEnumIdx++;1 M( H- z; I2 x; j
              }
7 x/ z; Q: }& f+ I7 B            }- |; Q  m) w! M3 P+ Y+ j8 S: A
          if(pClassObject)pClassObject->Release();, A3 H) y  I; }" b& {7 v. }
        }
8 u4 p" \) [" |        if(pEnumClassObject)pEnumClassObject->Release();
# o) f) j9 W  T5 k5 u1 l      }
: Z  s/ k3 c- G( t& I/ m     if(pWbemServices)pWbemServices->Release();
% E: b  B8 H# \3 F1 b. O   }
1 i5 E) B% s, ~" q; p' k. Y) f3 Q  if(pWbemLocator)pWbemLocator->Release();* B  e: \, Q$ n3 E& P  [9 @
}
- H! B; \( H& z9 o9 A4 G//---------------------------------------------------------------------------
+ S) {0 S' S1 i! F+ k7 s$ }5 c
: b1 v6 p5 G0 J// 通过 WIN32_bios 获取 BIOS 信息:
+ J4 G+ ?* [5 _" A- M- Rvoid __fastcall TForm1::Button1Click(TObject *Sender): N7 ^1 L1 u# ]7 A( Y* B3 @
{$ l8 G% B' V+ ~4 Z; k( M
   Memo1->Lines->Add("================== [WIN32_bios] =================");6 B* D' x, Q7 G1 q: W/ [2 ~; J
   GetWmiInfo(Memo1->Lines, "WIN32_bios");6 h( e: U3 ^( j9 N) T
   Memo1->Lines->Add("");
, E0 V  Z" {# E. J! i& c}
: w! b4 Y3 L3 f: ~; |- N7 a" S! Y! x) f- C' [/ N- W, O: B
--------------------------------------------------------------------------------7 T' Z$ i6 V0 x; W2 a

- X- ~9 \! D  GWMI 可以访问的信息类型有:6 o( l7 ~: r: D9 K0 I
  Win32_1394Controller
& }( ~$ m# `; ^7 c   Win32_BaseBoard
( h$ W' U8 p, N   Win32_Battery
0 K3 q0 m  [" X, T( D9 z* A, ?. Y   Win32_BIOS
6 L& C% L& C8 V. a# N   Win32_Bus
& \; p; C* C7 O  }   Win32_CacheMemory, N' Q2 {8 g/ w" C  v8 m, {
  Win32_CDROMDrive
! Z) ^7 g! {4 x. r   Win32_CurrentProbe& K' g% \' v3 c+ F8 a
  Win32_DesktopMonitor) I) n: `* R, i/ ], s0 W, J$ o7 [
  Win32_DeviceMemoryAddress
4 \4 a4 Z7 c1 V( j! j9 W   Win32_DiskDrive7 |' @3 r5 Q' ^% Y# t( t0 J( s
  Win32_DisplayConfiguration, o; i; g: b0 v* o; m. ]
  Win32_DisplayControllerConfiguration; m! V+ |+ K5 L, w6 x5 e/ q. D
  Win32_DMAChannel
3 p( }6 @8 }+ o' v" G5 R3 y# D) d9 |& e   Win32_Fan6 Z$ o) n3 o! j1 G; A0 d5 K3 ~' i- B
  Win32_FloppyController6 d* ?9 J) n4 t! i% F* [0 o
  Win32_FloppyDrive0 G( w8 @  T, J! ?9 C1 L
  Win32_HeatPipe
9 A* V2 O, y8 s% J9 U. x4 V1 k   Win32_IDEController
; V# v$ L' l' P; \9 l; y8 Z' O5 y   Win32_InfraredDevice
# b- u, F: i) z5 G: d   Win32_IRQResource( M& M  A5 t9 n% `& _1 p! f
  Win32_Keyboard5 g3 G3 e9 G6 I% k
  Win32_MemoryArray
/ T$ M  m) g2 M# T4 _' `1 Z$ F% W* T' ~   Win32_MemoryDevice9 Z4 e5 C! h3 g# O6 o/ N
  Win32_MotherboardDevice4 \9 P" q  _% Y0 l5 V0 M6 W
  Win32_NetworkAdapter: ]7 Y8 h% q% }& Y
  Win32_NetworkAdapterConfiguration: m, j  ?2 H; t1 z; Y% k8 G" [
  Win32_OnBoardDevice
4 a( C1 w( E) J7 T$ y( K/ P: B   Win32_ParallelPort
2 |/ Z" M& O" ^8 h7 j, ]3 n   Win32_PCMCIAController
+ h8 e- e$ x7 Y0 D: f$ y! k   Win32_PhysicalMemory
' `) Y  Z$ i* v& R2 |6 B   Win32_PhysicalMemoryArray7 l( F9 G. X8 B; Z9 I& e! @
  Win32_PnPEntity5 s, O9 [" i8 ]
  Win32_PointingDevice% P' U; [# X% t( e8 k
  Win32_PortableBattery' j. X% r6 ?% \& I. m
  Win32_PortConnector9 g& c# h  R2 `+ a/ U* }. L
  Win32_PortResource
" L; c% t+ L  S* ~2 M. E% ~   Win32_POTSModem
7 M" C' k" ?( n' Q, W4 N   Win32_PowerManagementEvent3 s* y  k( D7 g* ]7 S; M
  Win32_Printer- s1 t% ?* J( V% t: K
  Win32_PrinterConfiguration3 t6 |0 d! v( e4 L- Q& p6 x
  Win32_PrintJob! D7 G; M0 x5 \3 C! N; q
  Win32_Processor( Y# Q+ k& N% g6 ^7 }3 C0 O9 U
  Win32_Refrigeration+ u# m  G, _8 M5 i8 C/ }; D" k
  Win32_SerialPort
7 n8 C& q2 t5 G% P: M+ y   Win32_SerialPortConfiguration
% t0 ?0 D: }) x1 v   Win32_SMBIOSMemory
) p! z& g$ M7 n. i$ N5 z) l! g6 _9 A   Win32_SoundDevice
$ G& V7 ~" d" q. o( w   Win32_SystemEnclosure
, _+ @3 U$ E: q4 F) F% [   Win32_SystemMemoryResource
0 N6 F( A7 q/ d# v+ x$ W9 Z   Win32_SystemSlot2 u0 n* O- I% T9 O4 d+ o
  Win32_TapeDrive
9 `) ^" v7 V3 m2 X4 l7 B/ u   Win32_TemperatureProbe
( J* X# q+ y7 |# n$ z4 H& D   Win32_UninterruptiblePowerSupply4 A, ^8 R  W" T
  Win32_USBController2 h6 m& C3 U5 V0 n7 ?, l
  Win32_VideoConfiguration7 `4 j4 B$ W3 y5 P: |
  Win32_VideoController
* k, ?; B# x  X0 ^. Z   Win32_VoltageProbe
. M  d4 N& A4 N' R3 G
% d4 o+ Y( V' i' p! }以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 13:52 , Processed in 0.015859 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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