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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
4 P; Q4 o" F! Z* t8 Q9 P& G( x( a+ r( L5 K

$ \0 V4 k& \5 F4 O) h--------------------------------------------------------------------------------( ^$ e  ~5 T7 {
WMI: Windows Management Instrumentation (Windows 管理工具): n; p) g; J; K( a6 f6 ?
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 2 q/ M8 T( @8 l6 g- H6 x1 P; l$ J
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。; S+ G4 I# x& A; x  \
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 : h; `5 ?. J; y* C( v; E# V

5 L3 K% Q& M3 A) @( E--------------------------------------------------------------------------------! J" e/ m. W* \6 q$ ^; N# Z
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面7 x& Y7 ?4 g' ^2 J& {- Q, F4 j

! O' k+ N- l! _1 P) S8 N8 \) I--------------------------------------------------------------------------------3 n$ z  |2 W: k/ i- E
① 初始化 COM 接口:( O$ i$ _1 w; k7 Q3 ^( N8 j0 ~# U
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
+ _; m) H) g) [: F   这两个函数在 #include <comdef.h> 里面定义。8 r0 ?6 y& T: j( F  B/ f6 b9 X

; E1 b' @; }; u, a. x② 获取访问 WMI 权限:2 g+ u) x9 }/ [
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
3 a/ h( ]8 T5 Q* [6 V/ n3 e6 G6 i   如果这个函数返回 S_OK 获取权限成功, 否则为失败。6 P1 ]4 l- q( z/ _, M8 g

4 e$ p3 y* w+ U/ {; w6 r③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:. v2 G4 }3 l) y+ x* T
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
7 X5 r2 g: Z) n5 F: q
6 S2 g/ z5 ^: p7 y; @3 ]void GetWmiInfo(TStrings *lpList, WideString wsClass)
  c# B- m& r% c3 v; c6 B{; T. ]: K1 e( Y* y2 l* |2 c2 \
  IWbemLocator *pWbemLocator = NULL;! s; a& y: a+ P! E
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
" ^" C/ w+ M, k) T$ V   {! b- O4 B' k0 {
    IWbemServices *pWbemServices = NULL;
1 M& d( R0 E. x1 r# S  a7 W/ B     WideString wsNamespace = (L"root\\cimv2");
4 B4 J' F7 `$ b2 ?' }$ c, u& t     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)$ \/ ^: J" l5 U6 l  q
     {6 C/ w( Z" z% O8 s( _0 _9 K. a
       IEnumWbemClassObject *pEnumClassObject = NULL;: Q& B! S% r% i; O4 q
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;' {) D" ~% n2 U# T
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
. p7 I% f3 i# s8 C% E: T         {
6 m- Y- ?. l/ n           IWbemClassObject *pClassObject = NULL;
$ N; w5 L% c* B/ R7 ~3 W           ULONG uCount = 1, uReturned;: m) M+ B. e& F& r& g
          if(pEnumClassObject->Reset() == S_OK)
$ p, c- |8 H' T* y* z( E2 Y( q            {
* a1 P) M* p5 x              int iEnumIdx = 0;, o: a# l! s  g+ k+ [  J
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)" Z( }+ g1 Q$ ~! E+ {
              {
: n; [3 e  v- ~6 Y% f2 A& g                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
8 R) h$ X+ y+ [4 i4 t. u, X2 L9 q9 |4 T6 n. R1 z7 s1 X* T
                SAFEARRAY *pvNames = NULL;' u# j- O/ G) k7 `$ _6 |$ K! m
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
7 g7 w6 Z! |9 ]9 O- z2 q& r4 d                  {
1 f) S% D, `% }1 x9 r+ s                    long vbl, vbu;
6 u& ^9 M) F/ `& M; D( _! h                    SafeArrayGetLBound(pvNames, 1, &vbl);
* x0 f' K% D) j6 z                    SafeArrayGetUBound(pvNames, 1, &vbu);; P' E& b* f# M- b# t
                   for(long idx=vbl; idx<=vbu; idx++)
: q$ {$ c+ h7 O2 Y                     {3 z$ y+ V! k  J3 A  ~( X* G1 x
                      long aidx = idx;% h' y( E, V  k% c  W8 p
                      wchar_t *wsName = 0;4 W# f9 t# m, u( f& ?, H/ y
                      VARIANT vValue;
% \2 _7 u6 L: J: o                       VariantInit(&vValue);
; g" n' v* \- Q; U& ]: n                       SafeArrayGetElement(pvNames, &aidx, &wsName);
, c& C% }. X3 n: ^% Z7 t9 \/ ]' Z6 o2 v$ j& z6 Y8 D
                      BSTR bs = SysAllocString(wsName);
* {9 a3 i' Z+ T                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
" _+ B6 |% Z' g                       SysFreeString(bs);
& ]; ~9 O, }9 W& r, {# ?; u: {2 G( P7 y& @# b
                      if(hRes == S_OK)# p  P% O' [/ T. D% ?7 }* E
                       {
- ~, i+ L1 h6 L" D                          AnsiString s;" H: X# c2 p, E; z3 s2 r: v
                         Variant v = *(Variant*)&vValue;: ]. D2 w* ^, J' T  n
                         if(v.IsArray())
9 z0 p, `+ Q/ b& s& t( J! ^                           {
- T# {/ m9 z5 Q' I* v                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)0 z7 W( r  J/ L8 g
                             {
3 j/ u% b, O5 n  t                                Variant a = v.GetElement(i);
2 k! F6 L% Z& c7 R+ ^) d                                if(!s.IsEmpty())# B0 V. R, ?4 |  ~
                                 s+=", ";! w' S) u* M( i7 _' G
                               s+=VarToStr(a);
- e' b4 B6 l, v* r6 S                              }
1 ~- T" a; A; F9 |3 G, L- p* h$ R                           }7 O0 m5 D# k2 |' v  g
                         else' E3 ]' B2 w$ Z- p
                          {
, e8 r* f+ C0 d. E, w: h4 ?% s, A                             s = VarToStr(v);
, f: ]5 _" O' F/ P                           }: L: g# J! c) b4 g$ x  |1 c$ w& a, T9 d6 Z
                         lpList->Add(AnsiString(wsName)+"="+s);
! o; C! x  F6 X8 ^! M- b& E                        }6 i' v! s. b9 Z- _+ ^5 @8 }

# g! {4 W9 K, H. H- _  X                       VariantClear(&vValue);* t9 q; u) r. L( N) a3 d
                      SysFreeString(wsName);+ u9 U7 e5 m- n! Y+ {' W5 P
                    }
! V2 {4 `4 [" b2 O$ R                  }
. h/ g" L0 W  W, r$ H0 [                 if(pvNames)SafeArrayDestroy(pvNames);( T! R' K; z- w1 s, [) a, q8 g
                iEnumIdx++;
, {& A( [6 Z2 b- }               }
/ z6 m) J8 b8 T4 }            }
+ R  H+ w& W( @0 k5 `: c           if(pClassObject)pClassObject->Release();$ z& w# x* O$ F, b- r* w8 d& p
        }. e9 m/ R' ?$ c: q
       if(pEnumClassObject)pEnumClassObject->Release();
* J1 Y# j9 Z  B) G; M2 y      }! w" l5 Z: l5 a. t
    if(pWbemServices)pWbemServices->Release();
; j  R5 _' |! F. h1 J$ v3 ~8 b, _9 i( h   }) {4 q! y" E& N9 ?. ?3 w
  if(pWbemLocator)pWbemLocator->Release();
, I, X  z7 K- ^+ d: \- X}
0 m, @& y; F9 {" d- d//---------------------------------------------------------------------------
+ x% H7 ]; |6 O: w4 O9 L& c" B+ s7 F
2 s- b* i5 y# \& f// 通过 WIN32_bios 获取 BIOS 信息:
& Z0 r3 c! P- j- F' evoid __fastcall TForm1::Button1Click(TObject *Sender)
: r3 l# `: ^% K: U$ b{
0 F6 R) Y6 d3 A* L0 K7 W0 a    Memo1->Lines->Add("================== [WIN32_bios] =================");, B* F! a! `  t( O
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
% D5 X/ H* z, d0 F    Memo1->Lines->Add("");
5 v1 _- H: G: J  u. N3 ?}: K9 Q3 e+ C+ |* _: H

% \% y2 ]  X, P( r--------------------------------------------------------------------------------
4 _/ S& s) y' y' K0 F3 z, ?& G" E# \2 n# D
WMI 可以访问的信息类型有:" G: Z/ [0 p. g0 h
  Win32_1394Controller
$ w$ K; }& P' L   Win32_BaseBoard$ B; ]/ T/ _3 D# V& X
  Win32_Battery
: W' C0 O5 \" f) D  }" Q   Win32_BIOS
3 F6 e5 p: t( J, v$ v9 E   Win32_Bus- x5 B* r0 x$ k( b- H  K
  Win32_CacheMemory
$ ~# M5 V: }! `( D  e   Win32_CDROMDrive
+ Q1 q8 S: t/ ^' c$ P0 J1 @   Win32_CurrentProbe
4 F/ G( e# J. P/ W   Win32_DesktopMonitor! b+ ^4 k* {/ l  P1 X: a( C- S4 M' k
  Win32_DeviceMemoryAddress
2 y/ H+ V, d1 X/ p   Win32_DiskDrive
( H9 s, L1 z' w1 o4 ?   Win32_DisplayConfiguration
9 c; @+ `2 L2 M* Q+ a6 t4 @   Win32_DisplayControllerConfiguration# ]( E& U2 ^8 {0 V
  Win32_DMAChannel
% r8 |) @! w9 a& N3 Q* v3 @+ U: T) c4 `   Win32_Fan
* @+ m1 ~4 [* A  s1 D$ H4 X9 z   Win32_FloppyController! _( t3 G2 J  _+ S) p& ]2 G. l! U
  Win32_FloppyDrive, q8 O9 ]+ g& p2 m* E
  Win32_HeatPipe* x' T5 O" z% Z2 O/ G
  Win32_IDEController
3 G9 j1 G1 j3 B  W   Win32_InfraredDevice0 |; Q. q' L% f8 j' \% T
  Win32_IRQResource
. m4 a) y+ n) b* Z3 x' s  K   Win32_Keyboard9 J( {/ C, v" U) n1 q1 V8 n! r
  Win32_MemoryArray
7 i# W* \! q) u- j   Win32_MemoryDevice
: ~0 }$ _; T) t5 E  |' Q! A! u   Win32_MotherboardDevice
' i. @: s& e5 H9 K, n4 w   Win32_NetworkAdapter8 ]* t% r0 K; V; x; m
  Win32_NetworkAdapterConfiguration
* Y; Z2 t! g0 R- [9 t# i   Win32_OnBoardDevice5 d5 ^* c/ @. E! [+ C. ~( N' m" b
  Win32_ParallelPort
- J0 Y! s) N5 I3 H2 e   Win32_PCMCIAController1 p5 X1 Q1 g0 h, \1 r( Y
  Win32_PhysicalMemory% q7 a$ h- G" T7 Q
  Win32_PhysicalMemoryArray
/ ~- U1 Y+ G0 @# \- o   Win32_PnPEntity
7 _: f% G3 t8 t4 S4 A# C5 R( O+ Y   Win32_PointingDevice
' Q& u4 _! I- ^2 L8 A9 C   Win32_PortableBattery8 U1 ?; B" I" G; X. _
  Win32_PortConnector$ q8 _2 {* _( t! C! P. B# T
  Win32_PortResource
3 T+ r0 j' }7 o$ q   Win32_POTSModem
) [' r+ m! J( p3 [% `2 L, R* X   Win32_PowerManagementEvent" H3 s3 k# E. w
  Win32_Printer
$ {  g8 l  m3 X. Z# p   Win32_PrinterConfiguration
, e" E( a1 u, E$ L   Win32_PrintJob+ [& T: L# I# |- \
  Win32_Processor' H" d: a1 j5 E( Q: l4 f4 ?) k
  Win32_Refrigeration
  T- I: x+ f5 }# K# G   Win32_SerialPort
+ @" H3 Q  e# L. m, Z- K   Win32_SerialPortConfiguration! x5 Q( g9 j8 ~" H; T) ]5 I4 m
  Win32_SMBIOSMemory3 v6 A" w+ ?' V
  Win32_SoundDevice
7 Z- f; }$ t2 t, {  P5 A+ e   Win32_SystemEnclosure
( ]5 I% i1 z5 x5 K   Win32_SystemMemoryResource) D0 C0 b4 i$ j- d
  Win32_SystemSlot/ X( O0 X  C: z8 {) J, @5 ~: N
  Win32_TapeDrive
. y" o9 a" G+ \  [   Win32_TemperatureProbe9 ^7 N+ p8 x0 N+ F+ b
  Win32_UninterruptiblePowerSupply
" ?( }" A: Y& G1 A$ t   Win32_USBController
. t2 H. |: q8 Z6 V   Win32_VideoConfiguration8 h* I& }' @# ?4 D. _) N
  Win32_VideoController2 L5 f& R  |: c$ B2 x- u2 Y
  Win32_VoltageProbe
; E# c" x$ A' V  C' ~  h
: [) a. h! t' a' O7 F' U# V/ ~: W- v以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-19 13:08 , Processed in 0.022372 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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