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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)6 K1 ^" g! ^" E3 Y
' T, f" N* B5 V' R
5 P+ I: e' A7 M1 A, b3 U7 b
--------------------------------------------------------------------------------; {- V# x2 {% A2 N' J7 U1 }: X7 K
WMI: Windows Management Instrumentation (Windows 管理工具)
- @) v8 t/ _% s' T# |" Y   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 & @# m/ |' d5 A
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
2 w% T! a9 k, A& z5 J3 R- e   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 9 [3 ]/ U% [+ W

4 q1 V3 O$ G% r& c1 D2 N: K--------------------------------------------------------------------------------
/ J5 ^5 L' k9 V. s8 A4 n* WBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
1 ]; r+ o3 w, l
& E+ o0 H* ?8 t* `  Y3 c( W6 U" B3 ^--------------------------------------------------------------------------------
& q& d" f$ b+ @. h① 初始化 COM 接口:
1 M/ U* c6 s# r5 A   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。) c7 m0 N% E( f7 V
  这两个函数在 #include <comdef.h> 里面定义。  `. x- X' r" ^. o" Q9 }+ @8 N; ~9 n

1 p# ^! }1 ~% V5 y5 V$ O# {$ B② 获取访问 WMI 权限:( @2 W; j" _$ q) a, @
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);, x. V7 `  W. H  k0 D( N1 W
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。  B) A3 a! B! C; d" U3 l, D
: P- O- L$ b7 `4 T
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:" G8 P- _3 m' K; C7 K5 U
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 I  U; l1 r. C+ l5 S: l8 n3 w( n* O2 O3 t. F0 r
void GetWmiInfo(TStrings *lpList, WideString wsClass). v" A6 X9 K. w% F
{
( D' I! l0 L; |1 R+ ~2 ^/ n% c1 S  IWbemLocator *pWbemLocator = NULL;
3 q  I" J% ^' B5 [5 _  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)" t: y! J, S" v. I0 ]/ o9 i
  {
1 D, G8 S8 C. f1 D     IWbemServices *pWbemServices = NULL;/ ]5 H7 q) e$ {: _' Q, E: O
    WideString wsNamespace = (L"root\\cimv2");
6 i1 b5 I& f' t! y' ~     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)1 h' h/ C0 {( N! u% ?
     {8 ~. ]$ w" y! e/ f- T
       IEnumWbemClassObject *pEnumClassObject = NULL;3 y6 ^2 h3 I$ N$ p( g
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
, \4 `, G; Z3 q- O6 D2 f        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)5 }' B7 \( v8 t8 e" f
        {
! T+ M( A. y0 K- V( ?; G           IWbemClassObject *pClassObject = NULL;/ E3 ]2 w, B& |/ h/ ~
          ULONG uCount = 1, uReturned;5 Y9 j  n0 K3 _% L" B0 E; W3 S
          if(pEnumClassObject->Reset() == S_OK)% R9 M1 x3 R# r6 @& ~+ m
           {
# u/ p- a* I2 P( N& g3 a0 a              int iEnumIdx = 0;
" A$ q% V0 y1 q7 J              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
* j/ n# }6 p$ Z. J; ?& c  ^               {, v  R7 M7 K' J
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");, x* S% B1 P% J6 Q

0 }$ r5 \+ c  @* M* C: M# z. c                 SAFEARRAY *pvNames = NULL;- Z! Y) Y! O( \$ Z+ |( ]
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
+ {/ G" K: p% N8 R                  {
& o4 g- J! A) i5 k% T! F                    long vbl, vbu;
/ G- N) S$ y% g2 y' ~5 s  q. K0 P                    SafeArrayGetLBound(pvNames, 1, &vbl);/ f% D+ e: Q* E, T, @
                   SafeArrayGetUBound(pvNames, 1, &vbu);( a9 H: e4 _! `; e
                   for(long idx=vbl; idx<=vbu; idx++)
* `! p: `6 t% l3 U# i                     {
3 |: k5 I9 C$ M7 l                       long aidx = idx;6 x4 V) E/ I9 P
                      wchar_t *wsName = 0;
& p5 w- y" u, h& V                       VARIANT vValue;
  @. H+ ?0 }7 P, e! b                       VariantInit(&vValue);5 R8 G0 w9 X1 ~" r/ a; p" T! q
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
8 g& W' l/ P8 _1 \7 n& d
( g5 p, d9 e+ ^: T% ^9 c                       BSTR bs = SysAllocString(wsName);
5 P. m; o8 ?6 Z3 a) T3 c" b                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);* L3 D! |, E) g9 n4 p' C( N
                      SysFreeString(bs);
& s# _; r+ g# N" R" Y5 ]! W& _7 }9 x: p$ j% Z7 a; Q6 I
                      if(hRes == S_OK)
7 G: V1 }) Y- O" o9 C! e                        {; P# P/ K/ `" S0 e. }: s( G  T
                         AnsiString s;
( z3 Y% R1 j+ Z                          Variant v = *(Variant*)&vValue;
/ L$ Z, C1 v. k/ H6 X4 R                          if(v.IsArray())" {5 k: }1 F) A0 C3 s) ?' D
                          {
( S+ ?- N- ?, E                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)5 B4 ^. V* o. G
                             {
# Z8 a  H4 l, r4 o, s7 ?& K                                Variant a = v.GetElement(i);9 h1 M: ~8 w3 x; g( c
                               if(!s.IsEmpty())+ u( |% j' F+ b0 e  q& T
                                 s+=", ";: Z) Y2 Y- \' H9 @
                               s+=VarToStr(a);" M% i$ w- S  f6 `6 G! k2 _( f2 Y
                             }1 f: E2 k* R+ W, J+ M5 @
                          }
/ c" E3 B9 }+ E' V" e+ A3 |* W                          else! t  N; V% b7 e3 q. k- A( e
                          {
, n- a7 |1 d6 ]1 |                             s = VarToStr(v);
; y2 U) Z$ Q+ |- Y                           }0 n7 N% L  J% i! `2 K
                         lpList->Add(AnsiString(wsName)+"="+s);4 r$ I$ s2 m7 A
                       }9 X* c" o! L6 T3 ]( }/ O+ O. ?7 v

; G7 H% g( ?0 @, K                       VariantClear(&vValue);
7 ^* s& t; k, t  F                       SysFreeString(wsName);
, m: c# Q* }. P, p7 ^3 ^                     }/ ]9 ^6 }+ x; W( I- a
                 }
6 v* Z% @/ q# U+ S* W                 if(pvNames)SafeArrayDestroy(pvNames);/ a' `9 {& i/ O4 v$ a7 @6 F
                iEnumIdx++;
3 D# m  d, Z" h1 e               }9 J& D; ^" C) X2 a, E( I
           }0 _; x$ I; I8 O$ _
          if(pClassObject)pClassObject->Release();
4 F: h  Z+ I" S' O         }
- @7 o! H6 W3 N0 W1 @! c1 p        if(pEnumClassObject)pEnumClassObject->Release();
9 y, ]# ]( Q4 t, i( w      }8 {* ]& s, V! R' a1 |
    if(pWbemServices)pWbemServices->Release();
6 d) @4 y) b3 B3 K- n: U# Q0 }   }, Z: V  j7 `/ z6 N
  if(pWbemLocator)pWbemLocator->Release();
- o2 m- w7 ]' l  I: T}
0 X( [  s, I4 G1 K, a. Y3 [//---------------------------------------------------------------------------3 S/ N9 {' C& I2 L/ @% g
" P( l( C' h0 A; Q
// 通过 WIN32_bios 获取 BIOS 信息:$ z: n& F+ ?5 G
void __fastcall TForm1::Button1Click(TObject *Sender)
/ H4 N7 L- m$ H2 V# q{. @$ P) m' A5 z
   Memo1->Lines->Add("================== [WIN32_bios] =================");
" d0 _  }# z8 [+ |9 e9 A    GetWmiInfo(Memo1->Lines, "WIN32_bios");7 A7 M% i' @) e) N1 n& h
   Memo1->Lines->Add("");
' j9 [; a/ T2 h( U5 k, r2 O}
7 B# i! d* F% V9 b2 F9 \# x  {7 r  V$ T9 A4 Q) ?  D: `1 q  m
--------------------------------------------------------------------------------
! |8 g, c! f9 F7 n/ R! D# q
: q7 a. U* N# D  D% p2 AWMI 可以访问的信息类型有:
( Q# q" b1 _* y  E   Win32_1394Controller
+ S, W. U# V6 C4 k8 G% D6 D: H  j   Win32_BaseBoard7 [( q$ Y# J5 F% ]5 p$ x; S
  Win32_Battery% [) Z% \$ _' H3 k4 z
  Win32_BIOS
2 `( x( N$ M4 O; _' r0 W' N; z   Win32_Bus% o# V$ T0 v, e2 ^6 R8 V$ W
  Win32_CacheMemory
! _" _. h1 l+ {  J; Q   Win32_CDROMDrive: {4 [( K- e5 a* F5 T% G6 E9 e
  Win32_CurrentProbe
/ |2 p, v) ^, G2 x( ~* ?   Win32_DesktopMonitor
1 ^# ~2 d( B8 j% m  V   Win32_DeviceMemoryAddress
/ ?# E: U2 p# k! [( Y8 Y   Win32_DiskDrive7 {: t( I- a$ i; _& M$ v3 Y- N
  Win32_DisplayConfiguration
+ M% H: [4 C: O3 x3 \   Win32_DisplayControllerConfiguration# y8 K; n, X# q. v( ^
  Win32_DMAChannel
: r2 a7 f( P% V* W& I. u   Win32_Fan% q1 v+ u0 p/ d$ l7 C
  Win32_FloppyController' ~" g4 ?8 p& }9 J4 i/ m8 t, k6 d
  Win32_FloppyDrive
: q* C- y" D: `   Win32_HeatPipe
; c7 X+ j9 j; W  ~3 k' j7 D; A   Win32_IDEController
; s' c: D. _% m; V   Win32_InfraredDevice
: d0 k3 m5 I3 C% T% i0 G   Win32_IRQResource
2 a( s: i4 n$ ^/ K3 ?8 |6 \   Win32_Keyboard
+ y# Q- E9 Q1 [6 J- Q; x4 W" |   Win32_MemoryArray
4 ^, ?! f- F4 C* f; I1 o, q# T   Win32_MemoryDevice3 D( E6 j# l9 h2 X9 I- P
  Win32_MotherboardDevice
! O: c9 s0 h2 D) O   Win32_NetworkAdapter4 `$ q2 t$ y5 g- L" }0 w
  Win32_NetworkAdapterConfiguration
' q; b# k4 r: M! i   Win32_OnBoardDevice
: N) @9 g$ p* I) o  d   Win32_ParallelPort
; }- W$ v6 O8 f% \% X   Win32_PCMCIAController) G/ _6 A# o% q7 F7 ^* `
  Win32_PhysicalMemory
! U9 p1 n1 B* }. H   Win32_PhysicalMemoryArray
" a5 [1 ~8 B; [   Win32_PnPEntity
* x+ I. t3 i. C3 {3 r6 ?4 [6 r  Z/ T9 R   Win32_PointingDevice! P. C$ E- Y$ ^! R7 o9 a
  Win32_PortableBattery: v! \7 s& e. H) z4 O! B2 @
  Win32_PortConnector
' Z9 M- \; F* f/ }5 a   Win32_PortResource
/ v( J3 ]+ W/ A8 B. L( K   Win32_POTSModem
5 b. `0 M; p5 m! ^, j* ^. M   Win32_PowerManagementEvent' s( N" Q8 d8 K& |
  Win32_Printer
1 m+ @# Z# X$ |& {9 I5 _   Win32_PrinterConfiguration
1 @' S9 q9 N' r. h1 f9 t   Win32_PrintJob
) [+ C" N3 S9 a8 n( G: D  ?' B: T0 d   Win32_Processor
( q( ~+ ^4 O2 C/ I0 b' D   Win32_Refrigeration
0 f: D9 g2 W* i   Win32_SerialPort5 p  @9 }8 M3 A! \; n1 D  D
  Win32_SerialPortConfiguration
+ L6 L- z; [, G4 q- d! y& l   Win32_SMBIOSMemory9 c5 x. a, N& @4 P8 @) l. i
  Win32_SoundDevice
, S4 q, c2 C1 G, W# ]4 ]2 g   Win32_SystemEnclosure* t" c. [) n. J
  Win32_SystemMemoryResource2 Q- R2 e4 B" j
  Win32_SystemSlot8 V: _: [7 e! B: D
  Win32_TapeDrive$ ?* h( M2 C' c
  Win32_TemperatureProbe  `" y: A1 b, b( H6 B& P8 H! W9 o
  Win32_UninterruptiblePowerSupply& ^) b' C$ T1 ^4 y6 N- {" y' A! i
  Win32_USBController5 z0 B5 O' E7 q: F: S' n5 f+ G
  Win32_VideoConfiguration7 A5 m; P3 D% Y
  Win32_VideoController. S& _6 `9 K5 g, `, {
  Win32_VoltageProbe
* f! d9 N8 {- C0 Z& `2 y, d7 r" A" ^; p2 x) N+ p0 B
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-2 08:37 , Processed in 0.038608 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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