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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
. M# R6 e$ A! A% i3 @8 K
. v( T! I' D+ W7 k& O4 h* G* Q7 l, N' F
--------------------------------------------------------------------------------
1 p, m  b9 U, l& i# d& tWMI: Windows Management Instrumentation (Windows 管理工具)
: n. y9 {: J( u: a   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
" ?0 q0 X& E& H, |. A: d   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
: v  V7 ?* L1 v   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 7 u+ U& c) u( l; g$ J

0 N& V, j+ X% h) f--------------------------------------------------------------------------------
  p- S* ]) m5 |BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面' t2 V  X/ p, k; [, q; [! V9 ?
2 ~1 X% Q- O9 H# h
--------------------------------------------------------------------------------
+ b0 V" N4 C+ w3 |8 [3 @6 y5 d① 初始化 COM 接口:# s$ K% u  @' I2 t4 b5 e
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。  i  ~, X& U* Q6 `
  这两个函数在 #include <comdef.h> 里面定义。1 ?8 O; k* V+ ^8 N! {
' o& p) |4 {; u5 W( s
② 获取访问 WMI 权限:
4 B' s% B0 j3 d% |   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);  }; Z( M6 x4 y9 E. k* T9 J4 [
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。8 G  c; X2 _  ^% ~& K" F: ]
  ?1 C; G$ N- E2 I8 z9 ?. A  i9 _
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:( m2 v5 R0 z. j' x
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
+ {5 E* ^; J! @; ?7 c  P' t
4 b8 K4 _, x  v# p8 o3 ^3 wvoid GetWmiInfo(TStrings *lpList, WideString wsClass)) q% J/ q' @" N( P6 `
{  e7 [0 t' v4 J2 ~; N% I$ ?; ~
  IWbemLocator *pWbemLocator = NULL;  I/ U' \6 `4 _% G3 `
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)1 g2 U; W& m- d' r6 J& V! r
  {6 M$ V! U# m1 c* h  y
    IWbemServices *pWbemServices = NULL;
6 M( o! M% z8 D2 g: u" @     WideString wsNamespace = (L"root\\cimv2");* k) {8 {, p5 Z
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
, h1 b/ b) O! m      {- |% Y, \0 K% p: a1 u0 K0 V% G6 B
       IEnumWbemClassObject *pEnumClassObject = NULL;
- \( y3 R2 M) x        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
1 ^. ?) O& J3 Z( e        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
2 z2 V6 X; n& O+ a  k0 z2 V         {  n! I" C) C" W1 p
          IWbemClassObject *pClassObject = NULL;0 E" W* B' b; c, `) k, T6 s
          ULONG uCount = 1, uReturned;
* F- J$ _0 {* I+ d7 ?$ g           if(pEnumClassObject->Reset() == S_OK)
2 c- _8 Z" m: w5 [7 ]! p            {
$ p) E3 b$ c, `% _3 v6 h. g/ Y              int iEnumIdx = 0;0 u. o  P# h! w1 q
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)% ]! J% ]. b" i$ e* o
              {7 S9 v$ {1 l3 \1 [
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
# i% N; m* D8 M8 V+ y/ m! k  q/ T  F% J
                SAFEARRAY *pvNames = NULL;7 G5 P; v- h  b6 B
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
6 f$ s5 b5 x: ?( L1 J                  {/ T$ k3 Q# g. W! x3 [* a
                   long vbl, vbu;
# }$ u: i' P, p- [  {                    SafeArrayGetLBound(pvNames, 1, &vbl);( J! M. S4 l0 |( H
                   SafeArrayGetUBound(pvNames, 1, &vbu);
8 S9 j4 H8 l7 A4 z                    for(long idx=vbl; idx<=vbu; idx++)
2 o* e6 m( J- B. F                     {
  E; W7 o; P! M7 ]! j                       long aidx = idx;2 g3 e/ z8 V' s; z1 W6 m
                      wchar_t *wsName = 0;
+ D8 _4 j- ]! A0 b; H2 c                       VARIANT vValue;
4 y6 O6 K; B2 \; s1 n                       VariantInit(&vValue);
% D* P3 v+ z; J) u5 x                       SafeArrayGetElement(pvNames, &aidx, &wsName);
* \/ I+ U% @( o/ x/ ^
' N) A# |( X6 t                       BSTR bs = SysAllocString(wsName);
& e6 ^/ _/ L+ \- Z/ ]6 K% y( p                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
6 T6 M8 i. R# r                       SysFreeString(bs);) Y8 N! x# r. C) r4 n

7 s, [& C5 |7 A                       if(hRes == S_OK)
1 G2 m2 R& b+ A5 Y+ P/ T6 c                        {, Z+ @& ~5 n9 {& R1 m
                         AnsiString s;
, t4 x1 e0 R6 Z/ S* X) I                          Variant v = *(Variant*)&vValue;* P0 n& @( a- g: [& ?$ l# j
                         if(v.IsArray())3 m9 {, o$ X4 @) n. _
                          {; x& a/ s5 K. s" e# q
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++); |4 y2 P0 e5 S+ g& S7 I) E
                             {
5 M$ h- P9 W6 Z: H7 X                                Variant a = v.GetElement(i);/ l4 ^4 \  H0 s2 V( \
                               if(!s.IsEmpty())
. S6 G4 r0 m5 Y- @# g. F" z# z                                  s+=", ";) n0 @& [0 C. p) j- |. @
                               s+=VarToStr(a);
, b7 H6 y8 G3 K/ C                              }
7 Y$ ^% L7 T) K" A) a; N                           }
: i) Q& }' l! ]5 o                          else7 T& x  w/ g+ D6 u  z
                          {
! \9 K2 W, T8 t6 T# J' @% `! m                             s = VarToStr(v);
1 Z* V7 B$ o2 E                           }
4 q2 g2 r; n5 F- P9 V8 O: F" i                          lpList->Add(AnsiString(wsName)+"="+s);# `" B# l' T5 M. ^: x6 [
                       }2 r/ |  o+ f. l, n, [( f9 f7 `

! U- K$ l% y9 k/ h7 @- u                       VariantClear(&vValue);
. S7 h! t! @. n0 {$ q- Z9 y                       SysFreeString(wsName);+ G# g1 s; O; p, I. b" z7 y
                    }0 j* g' p  |7 e
                 }2 T# Q+ S$ [. _
                if(pvNames)SafeArrayDestroy(pvNames);
3 X0 U5 q$ p5 n: Q                 iEnumIdx++;/ V" j1 d# _' \! C
              }. w6 w  d; T3 t# C; }8 y
           }* I+ R" u& k6 c9 B7 L: H( Q" B; _
          if(pClassObject)pClassObject->Release();: C/ T6 Q: Y( {
        }
. s( L" ]+ ~! ^        if(pEnumClassObject)pEnumClassObject->Release();2 K6 D) S4 y; _" i) l2 G
     }7 I3 I* b; f- }, E) W
    if(pWbemServices)pWbemServices->Release();
: X. d0 K: |  j4 `* N. w0 M, K   }/ D/ @$ t  J: `. R5 O8 k
  if(pWbemLocator)pWbemLocator->Release();
& M" V+ p5 D$ Z' f) u7 e}
  m" I. ]5 f6 y. Z. u8 p//---------------------------------------------------------------------------
- B( S9 _3 d; i& L: d& Z" u3 }+ t' x: I7 L# H5 d
// 通过 WIN32_bios 获取 BIOS 信息:, q6 r: n/ q! D" _, z
void __fastcall TForm1::Button1Click(TObject *Sender)
' p, _) M( @2 j( I  ]; j; f6 n{
' k/ q0 `  Z7 O3 Y    Memo1->Lines->Add("================== [WIN32_bios] =================");
2 j( B6 H  o' x5 j6 g5 D    GetWmiInfo(Memo1->Lines, "WIN32_bios");. t* m; ]6 x2 L# B( u( ]. ?3 v
   Memo1->Lines->Add("");- U( V' y; c7 p  v5 \: ]
}" K/ j) q5 Q  `$ i2 b

) s( r0 W& Y1 O! y/ L( x--------------------------------------------------------------------------------
2 w9 m# T( t0 T* [  F8 T
$ n) w6 R; ]+ ?WMI 可以访问的信息类型有:8 d* R- M. a/ n9 Q5 F6 i
  Win32_1394Controller
. r! z! J! L$ R9 z/ n6 i   Win32_BaseBoard8 G" p" O0 n$ {+ e3 P+ p2 Y
  Win32_Battery, |' p0 A, w, q2 ]. ~& G( M9 Y5 p
  Win32_BIOS& w) E+ U' l7 v4 T: ^' c
  Win32_Bus) {3 g" C' f8 ]
  Win32_CacheMemory
/ Q2 q, X9 p  @. ^   Win32_CDROMDrive
+ d, b; D( n9 r+ `   Win32_CurrentProbe
& P; ~' [$ a( f3 ?" G( u* ~% p7 C   Win32_DesktopMonitor
8 v0 ?8 u+ t( w) i$ U& D   Win32_DeviceMemoryAddress
$ W/ P2 {: q6 R. `) A! u   Win32_DiskDrive
' H' I3 g: V! g- Z   Win32_DisplayConfiguration
1 |. u3 c' y6 a& A- X) `2 K' t   Win32_DisplayControllerConfiguration- Z) \8 y! L8 t
  Win32_DMAChannel8 ^4 u3 j7 O0 ?0 O: |7 r& _7 I
  Win32_Fan
* a$ G: x4 i% F; k. l   Win32_FloppyController
* |5 J; n1 z5 ]   Win32_FloppyDrive4 K6 l$ q9 I1 V; E8 K
  Win32_HeatPipe
) r% u! O* f, f8 w9 k   Win32_IDEController
; {7 l  y5 n- F' [   Win32_InfraredDevice1 L+ `$ e/ _/ A( I
  Win32_IRQResource- O8 x0 [- r# i% i
  Win32_Keyboard
' }* A% A% R) `& u  S" R   Win32_MemoryArray
8 u, ~* z; f& k, a* o   Win32_MemoryDevice. K2 O; g. |9 e& m
  Win32_MotherboardDevice
5 S, P1 g4 g3 A7 `: F, T   Win32_NetworkAdapter
) D! @7 p$ n; Q" u: a# ~   Win32_NetworkAdapterConfiguration+ V9 n+ v* G: ]) J! l7 t
  Win32_OnBoardDevice
; k  p/ A$ K* G   Win32_ParallelPort
& y1 N: F. a3 N) \3 `5 r$ y, }   Win32_PCMCIAController& }$ G( o& j( a5 a$ h
  Win32_PhysicalMemory
4 c# K6 t! w* o   Win32_PhysicalMemoryArray3 V& M: N. E6 l; z- y" O8 _* C7 N
  Win32_PnPEntity4 e* h  j% |1 e& f
  Win32_PointingDevice9 Q' t( h& B4 G/ [) I
  Win32_PortableBattery. c4 |$ Z7 x! x6 c
  Win32_PortConnector
; i5 K" I& L& H& `   Win32_PortResource! u% ]9 q5 v( f3 Y1 p6 M2 M( c
  Win32_POTSModem
% p' d9 m" m3 G; T; `) O( x   Win32_PowerManagementEvent3 I4 @- p3 {9 S$ q
  Win32_Printer! B; E+ N# B$ m+ k
  Win32_PrinterConfiguration! B. m9 E5 x2 O7 f
  Win32_PrintJob
5 A6 e" f! e9 y   Win32_Processor
1 y$ V2 {, L' B0 K. a2 N   Win32_Refrigeration
! @2 ]0 F% x( G: W1 E6 h   Win32_SerialPort
* [& G5 |1 n; O6 e  i1 w   Win32_SerialPortConfiguration
8 @# n) Q. E4 M   Win32_SMBIOSMemory& l1 q( u" F, I9 _( P* f
  Win32_SoundDevice3 a. J% e+ x) e: f8 E' `
  Win32_SystemEnclosure
6 |* ?% q' V. D) y5 A9 N6 m" M  _+ @   Win32_SystemMemoryResource
6 ^" H0 d& C  E& c2 j3 y& n   Win32_SystemSlot  z- B: M* b7 t: Y% q# @
  Win32_TapeDrive
  y0 e  C. h! k# s/ {   Win32_TemperatureProbe, F9 \. U1 ]3 p5 f8 V9 f
  Win32_UninterruptiblePowerSupply
- h4 Q; Y2 |& `9 G6 ^6 s" f, ^3 F   Win32_USBController
& `: _' q1 P  w+ A& l: @   Win32_VideoConfiguration1 B* p; ^0 K& O" ^& Z
  Win32_VideoController
7 n* ]  j, j, z5 g/ K5 g0 m   Win32_VoltageProbe
) R6 ~1 {2 H# C
2 `( P6 Q2 S' S/ W, `3 I: d6 ]# x3 F以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-8 02:08 , Processed in 0.018083 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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