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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
( _4 {/ I- W2 k$ h7 q) d$ M+ k
$ O; I0 y; i3 S3 m! `4 b7 d/ p" _% n) r/ ~& [
--------------------------------------------------------------------------------
! a+ G9 b* y( xWMI: Windows Management Instrumentation (Windows 管理工具)
& T! U- j% S: V& |+ X: p   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
9 G% T+ G7 B  G   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
8 _9 k( o$ Z5 r" `/ w   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 , A( h/ t. |  M5 s7 J; c+ M
$ b6 A# H4 K& \2 X* R9 e
--------------------------------------------------------------------------------
4 N- {+ f( f9 {: O5 BBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
8 S" k0 ^( g2 W3 p
) ?3 z) o$ M% z2 S7 i--------------------------------------------------------------------------------
! |  y% Z- D8 q7 P, T① 初始化 COM 接口:7 [* _& h+ c3 _+ Q% i4 {* ^  O
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。$ m$ O. L- c  `/ s+ k+ J; ?
  这两个函数在 #include <comdef.h> 里面定义。) @6 @6 d$ q5 |$ G

3 z: O( h- g# [1 d② 获取访问 WMI 权限:/ [, N! D4 @" j4 y3 H& w2 m
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
0 z2 O6 l: P/ B8 Y. _   如果这个函数返回 S_OK 获取权限成功, 否则为失败。  x' h9 n' |. U' Y% X2 y

5 M/ n: I4 b4 L& s0 |③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
9 ^! U9 b8 u% c2 E6 p$ _) T   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。' d, p+ Z/ o" |& _3 y* y' j
6 g* Q' e6 n8 R7 t  C4 T% z
void GetWmiInfo(TStrings *lpList, WideString wsClass)  }- k4 Z& M0 x) q2 r$ s% T
{, M4 @; ]$ y' B; z
  IWbemLocator *pWbemLocator = NULL;
& V5 B: l; {  C9 k& p# M5 i8 a- ~  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)) B  e% V4 s! |* u/ Q& R
  {
- {# }: V( x* v. x     IWbemServices *pWbemServices = NULL;8 b" {5 r% P* z
    WideString wsNamespace = (L"root\\cimv2");
( d- E8 Y8 [! Y9 d" K7 u; n& D     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)5 P  A) ?  _; u* [; C
     {
* q: N6 G7 n3 y6 B$ g        IEnumWbemClassObject *pEnumClassObject = NULL;0 I: H& P1 r1 N! U+ O# e7 B
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
' _7 q  V" o$ {* k2 m        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
* m" r. B; \, U3 l, l$ Z: p4 \         {
3 w2 A' @4 B# J% R1 C1 Z           IWbemClassObject *pClassObject = NULL;0 H* C2 k, }4 J- v4 Q2 V0 m2 a6 s0 N
          ULONG uCount = 1, uReturned;
, O2 m; ~$ n0 x/ W$ U+ y           if(pEnumClassObject->Reset() == S_OK)5 i# h* f- t8 F( l! Y7 h
           {+ k0 B2 e1 c7 s- `' V
             int iEnumIdx = 0;% B$ t; k3 m$ y
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
: G  d% j- ^: T3 J9 a5 c               {
* E( k$ J" C$ g0 E/ P) D                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
# T$ M2 N8 d8 L1 B  @; s9 Z$ D- t; V4 h
                SAFEARRAY *pvNames = NULL;; n4 Y6 Y0 j) b% H
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
, E6 E1 [& K1 }! s                  {
9 ?3 T% p9 }+ L& s                    long vbl, vbu;: F8 W. E! s4 x( m
                   SafeArrayGetLBound(pvNames, 1, &vbl);
: O% N& T- C2 W) u1 d4 e: {- a7 x8 x                    SafeArrayGetUBound(pvNames, 1, &vbu);5 ]0 Q8 \! a, I1 a' G
                   for(long idx=vbl; idx<=vbu; idx++)- v$ {# E! K5 J5 O; t. Z" |
                    {
( n% m. r- a# N& g+ \! L& v                       long aidx = idx;8 R, r$ R# _7 ^4 V: G4 n
                      wchar_t *wsName = 0;
8 ?$ U, a8 K0 s$ z% o                       VARIANT vValue;9 H+ W) i) P2 S$ J& K5 f4 {
                      VariantInit(&vValue);
9 b  L; B2 b6 e8 Z4 M. V8 j                       SafeArrayGetElement(pvNames, &aidx, &wsName);- ~3 }0 g! p. [4 G8 o1 J+ i' z. V% Z

+ k* v1 ~/ \$ \( x                       BSTR bs = SysAllocString(wsName);* W, }$ E, @) V, h
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
% o2 @; U8 o7 H0 s( C5 R) d                       SysFreeString(bs);
* I3 q) m8 o  [* H3 j& L! u  h5 r4 c4 ~: }" Y2 V' g
                      if(hRes == S_OK)
' g2 R5 S' c9 a) p) z1 B2 D, y4 \, S6 w                        {
0 K# T! ?- l  ]7 J                          AnsiString s;: ?! f3 }5 y3 i  H. m5 m
                         Variant v = *(Variant*)&vValue;9 C8 I  O2 Z7 U) Z
                         if(v.IsArray())
3 o2 @' V' [$ C* _) k                           {
9 d$ j/ z' v% R5 l( a( G: ^" E4 ~                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
; C4 [( H7 g) R7 N4 O                              {/ Q* N* M: l) U, _  I
                               Variant a = v.GetElement(i);6 ^% G2 p0 C1 c" s' p
                               if(!s.IsEmpty())0 C0 w  m! I# o: H" v
                                 s+=", ";
, a! c2 j$ H! l                                s+=VarToStr(a);
9 M3 A( Z- u9 e9 W9 z                              }
) U4 g4 }+ P2 N                           }
  p6 N$ n9 P: @3 k* {3 f. ~                          else0 [5 P0 v: L" r: ^, w: B
                          {0 A5 \7 X- P- q
                            s = VarToStr(v);; g  x1 W! k- s6 }" w
                          }
* F/ @% X, k0 \                          lpList->Add(AnsiString(wsName)+"="+s);
& T& t" ]5 k0 ?! ]3 Y% K6 l                        }! T! m5 Z/ v" ]5 U5 [

5 c$ O- e/ t/ w                       VariantClear(&vValue);  {. E1 B" a$ |8 ^
                      SysFreeString(wsName);
& [1 B# k: `+ Y" I& W                     }
" c7 V  L( N& V2 M2 I                  }9 y/ Y' N0 s8 m8 Z' N- D
                if(pvNames)SafeArrayDestroy(pvNames);& K" n# t; i3 Z
                iEnumIdx++;
. x8 f; k  e2 l1 `               }
8 z8 \$ c5 w8 L; s/ K8 s1 f% v            }2 ~1 T9 ]3 W, Q4 i* o$ @
          if(pClassObject)pClassObject->Release();/ Y4 W& z6 r. P
        }
( V; N+ E0 I7 S/ @. }0 r- M" t        if(pEnumClassObject)pEnumClassObject->Release();) d8 U3 l5 V$ s0 Q8 x
     }
9 k- D8 d2 ~: q     if(pWbemServices)pWbemServices->Release();
1 ^8 W7 R( v& I! {2 _4 a; _8 h   }
" B4 n! w* V) |( K+ Z0 O  if(pWbemLocator)pWbemLocator->Release();; W' t( B) C2 v9 m, i. A1 o7 ^
}
# }+ u( a" s' ?//---------------------------------------------------------------------------
6 }# J! l$ O% C3 I0 i- z' Y
( s! v) H0 k& F9 a! p' ~// 通过 WIN32_bios 获取 BIOS 信息:
/ N2 K4 }9 E/ L; k2 cvoid __fastcall TForm1::Button1Click(TObject *Sender)
8 h$ l' F, W! h  j/ J3 n: q{
' S: f) M. `9 F8 b$ \( M    Memo1->Lines->Add("================== [WIN32_bios] =================");
, `( o2 z) E6 k" ]1 u    GetWmiInfo(Memo1->Lines, "WIN32_bios");1 w. o0 l* i  u5 d0 K
   Memo1->Lines->Add("");' V# r6 p4 [0 U+ c
}
7 s8 @: J9 L  a$ d$ D5 m8 b- }! D/ G. T7 ?  U8 N9 K$ J- j/ [
--------------------------------------------------------------------------------
4 I5 [( s2 c( X% G( C: m( r0 |; x* F' D
WMI 可以访问的信息类型有:3 N! V( m5 W. |; d1 s& c
  Win32_1394Controller
& l7 l9 s" T8 U& h   Win32_BaseBoard: q5 f: ~6 K) U( C
  Win32_Battery
& `* t" S8 a4 X; y9 G   Win32_BIOS
) B3 m! Y% R0 g% e- Z% O/ @   Win32_Bus1 l6 {. o  r/ ^' |, ]
  Win32_CacheMemory; y1 d: v8 V! P: S( m& ~
  Win32_CDROMDrive$ t2 U6 ^4 \! q
  Win32_CurrentProbe; _; q9 l4 W& h9 K& {; E' }
  Win32_DesktopMonitor
8 l$ u& i5 ]1 l# e   Win32_DeviceMemoryAddress
# U2 A$ {' i; |( B2 E7 x9 W' _   Win32_DiskDrive
% b( W# E$ n7 B& c9 m   Win32_DisplayConfiguration
4 f! s6 j0 r0 X) z   Win32_DisplayControllerConfiguration$ J8 ?+ r% e3 C
  Win32_DMAChannel
5 K6 N$ h  h6 o   Win32_Fan1 n' g9 @5 k6 {$ c7 h6 J
  Win32_FloppyController
$ S4 W5 U* x; V; `) Q   Win32_FloppyDrive
% |. z" b$ |. v" ^0 k   Win32_HeatPipe9 B+ E3 R3 Y) m
  Win32_IDEController' M- h1 j, }- o  I! u7 D" }2 z
  Win32_InfraredDevice
" W. G( _4 Q; K& Z& \% m6 b   Win32_IRQResource
7 x( E6 v: T6 Q( e/ ~   Win32_Keyboard  g& }! G' u# z! A) t0 a! w  c
  Win32_MemoryArray, C2 ~* X/ H9 t) \' X1 _
  Win32_MemoryDevice
) n* E  S/ O7 H2 F   Win32_MotherboardDevice
% M3 W( U; A$ s8 u: o   Win32_NetworkAdapter- j+ S  {1 n- g* {/ ~. r
  Win32_NetworkAdapterConfiguration) x2 E1 b- `: h- I
  Win32_OnBoardDevice
& l- `- G5 ^& b7 ]+ ?5 l   Win32_ParallelPort" A) e" ~( j1 ?( u3 y
  Win32_PCMCIAController
& E7 j- t+ I/ g$ N+ M# |   Win32_PhysicalMemory
/ j* U/ _4 {% c( |+ G  E( y- r/ N   Win32_PhysicalMemoryArray; Z6 D0 S/ I7 n( L
  Win32_PnPEntity7 |) h" X0 f- l. }/ l
  Win32_PointingDevice
# ]; R+ L& A' E' T) q+ B9 `   Win32_PortableBattery
; s  C: s% r& W0 ^' A   Win32_PortConnector
# \# n* t, |4 |2 E   Win32_PortResource
. ^9 x# ]/ a" B/ \* |2 {9 @) g* k   Win32_POTSModem
. Z5 e/ Z3 p1 B' b   Win32_PowerManagementEvent
/ Q* H2 U- m/ E% d' I, x' ?   Win32_Printer
# X1 _# f4 j; H   Win32_PrinterConfiguration+ p! S# N) Q: P5 S5 D0 b
  Win32_PrintJob( r& S$ i; o3 m; r4 Q& b
  Win32_Processor
$ R5 s+ C) w3 ]7 ~3 o/ T- c   Win32_Refrigeration
6 U! k# F1 T- i* U. L+ g' k/ G   Win32_SerialPort' a1 n2 l6 S0 V& P- B8 C' E3 P
  Win32_SerialPortConfiguration
) y, \' q7 I3 e+ `- T   Win32_SMBIOSMemory
' c' h7 W. h) k' d2 `% F   Win32_SoundDevice7 r4 D. U- S1 ]2 Y+ L( w/ D
  Win32_SystemEnclosure: M+ ?4 k8 a9 U2 N0 r5 s1 D
  Win32_SystemMemoryResource# J# E( u2 F; A7 k. R
  Win32_SystemSlot) I5 R2 I, P7 w& N
  Win32_TapeDrive. o; a, y  ?- ]9 t8 U
  Win32_TemperatureProbe/ R0 b! ~1 [  _& Z" L2 t2 ?. U% m+ h- x# c
  Win32_UninterruptiblePowerSupply
3 w# r0 q2 k( ~  n   Win32_USBController
) _' Q$ O7 F7 S" W   Win32_VideoConfiguration& u! e# E$ r- v/ e0 |1 D9 A
  Win32_VideoController
6 M" K% M) ~% ?" f   Win32_VoltageProbe7 t3 g9 _+ Z9 e7 J
( y) r" O% I0 ~, r' X& n- c' X
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-24 21:08 , Processed in 0.018338 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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