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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
; z9 W" _9 B1 }( W' P
! Z# d: O. r6 r5 i- g4 e# e4 Q* [7 q' k" Z
--------------------------------------------------------------------------------
6 A: v9 A% O/ L/ }5 ]WMI: Windows Management Instrumentation (Windows 管理工具)
8 f. M/ B+ H% x# n& l0 J   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
3 |7 B( R2 Y6 r( I8 |   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
; q5 ]. W% g! K. ~   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
" @: `! {! g# q2 i
3 w" x2 F/ W9 k0 t--------------------------------------------------------------------------------
( b$ I# W6 H8 [3 B2 ]) E  A# o- LBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面( W5 e! E% x4 r# o$ x& w
9 Z1 H7 X9 m* }% i
--------------------------------------------------------------------------------
9 G6 J- ]% T3 h+ P* K① 初始化 COM 接口:
0 M8 T- b; r/ q; P" B) K7 K   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。, O1 ]1 G6 h6 {9 F# ?4 j6 F
  这两个函数在 #include <comdef.h> 里面定义。
  I* U7 p+ Z0 C: i7 V  C
4 c$ f# {4 ^% l' m$ C② 获取访问 WMI 权限:
4 w, U! b1 L) t' l   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
, J0 P( s; k9 E0 j   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
% g. M. e5 G3 C- t. i/ T
. N/ u1 D& C, g$ L4 ]/ z③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
9 C9 C/ u$ W3 }. ~8 W* X3 D   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
, p( ]" |. r1 t0 T& A. g- O% Y0 u8 u/ ]
void GetWmiInfo(TStrings *lpList, WideString wsClass)  n- g( j' a5 m) `$ B& z
{- |/ V. f; C6 @3 J* X
  IWbemLocator *pWbemLocator = NULL;. z0 b) n) ]! J+ v. K3 r9 n+ c  \9 l
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
" ^1 U( Z( Z2 e( k  v6 o) Z* e2 `0 S) O   {
: U  z; L2 I) N2 q3 @* b- Q     IWbemServices *pWbemServices = NULL;
. ^% N  _$ e! E; R; a$ q2 G     WideString wsNamespace = (L"root\\cimv2");" j5 h. J; ?6 ^! Y8 K( b9 D( \, m
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
3 B& E, t9 k8 C      {/ u, s" `# Q. X; k2 ?0 P
       IEnumWbemClassObject *pEnumClassObject = NULL;
  j) u- y9 {/ O* y* r) @* Q        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
! K. r3 r1 @6 Z, A- a        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
$ C8 ~; f( v1 c+ w         {! d: {# K$ ^5 ?8 a: Q- a
          IWbemClassObject *pClassObject = NULL;
8 ~# Z0 e" h; }0 Z           ULONG uCount = 1, uReturned;( O  \+ [3 n& H7 O/ P
          if(pEnumClassObject->Reset() == S_OK), r; C; j$ `$ ~3 r% M1 L, d+ p% C
           {
6 I/ }3 b' H0 Z, ^8 e2 g              int iEnumIdx = 0;& o) Q! S2 K$ B, g% T2 D+ N
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)% ?4 @3 M- s% f& T& N8 T
              {
* I( V/ F: r5 d  u3 e' ?                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
5 q7 W$ s7 e& i8 _9 W! Y& H. \5 r) v: g
                SAFEARRAY *pvNames = NULL;
  Z/ n+ }; b+ \8 n9 M# i7 i/ Q$ \: e                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK), \/ {9 S' Y! K; P: p. b
                 {: A/ R1 C6 k3 U8 \  Y
                   long vbl, vbu;" G! |5 p4 h3 e5 H: W  d' A" G1 @5 R7 U
                   SafeArrayGetLBound(pvNames, 1, &vbl);
+ l$ \7 j7 U! D5 Z( E2 X4 I                    SafeArrayGetUBound(pvNames, 1, &vbu);
2 }2 W& g" U9 o5 S5 v* }; Y! E6 H* Q                    for(long idx=vbl; idx<=vbu; idx++)
* a* O) Z+ ^# l$ B  {5 F                     {
* O$ j' ]" h. F" ?+ x# r" H1 K                       long aidx = idx;
, f! \4 P- m- b: n9 v                       wchar_t *wsName = 0;# O1 s3 ^9 ?, H! g" G
                      VARIANT vValue;
- t( c. U- q4 y/ f                       VariantInit(&vValue);" x' o' y- L0 m
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
0 K8 s, ?+ h2 w0 n3 X, y. Z5 h5 t- N4 G: |+ _2 _
                      BSTR bs = SysAllocString(wsName);
6 X( U) q% b0 S  |6 r# e                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
- }3 p8 B1 s% b/ _                       SysFreeString(bs);
2 D4 Y* ~0 J% K, M$ u6 N
  b6 A" {6 R# l5 T# t: e                       if(hRes == S_OK)
8 a9 V* R7 A% Q8 ~# B                        {# J, r( L- r8 f
                         AnsiString s;* ]* |' h1 f, [  d% y8 p: `% I3 S
                         Variant v = *(Variant*)&vValue;. E+ f$ R( T4 v) i) H
                         if(v.IsArray())
9 a* i3 d' S( W3 t* r# F" y                           {
: I- @5 {. R& E$ E3 t. @                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++); X$ J# Y7 r# ]0 Q/ e* J6 E
                             {( G4 L' Q/ M7 C; R9 \3 q  H
                               Variant a = v.GetElement(i);
' r) q8 R1 w& }* r5 y: B5 l                                if(!s.IsEmpty())
, m7 O7 m. v7 v) j" c* G# X                                  s+=", ";
5 b. v0 l3 r3 j' g5 g3 P% V7 e                                s+=VarToStr(a);9 H" e8 ?$ }8 @, E, c: D  a7 G
                             }) `( H( s$ G8 u4 H$ _& V
                          }
0 ]% U! ^  Q  H8 J' J                          else  }2 i9 S( {1 w% B
                          {
; B, H1 r; C+ M" T" P: f7 }                             s = VarToStr(v);) m' w$ p+ f7 i
                          }
8 \+ F* R0 w$ q7 ]: L. x                          lpList->Add(AnsiString(wsName)+"="+s);+ N: G, p3 W0 Q( b; x" w
                       }
1 D2 _& A' A( q: m# H# r- H& Y+ Q  Q& G" j! h4 P
                      VariantClear(&vValue);9 a$ Z; A0 Y5 m. Z2 `3 [
                      SysFreeString(wsName);
. {9 c1 a  a  t, v+ @5 R                     }5 i; @4 b. w) L5 U- L- E$ K9 Z
                 }
2 m% s/ t* Z; X% }, i" \0 E) O                 if(pvNames)SafeArrayDestroy(pvNames);
! p  h9 u4 a# b8 A# z$ P                 iEnumIdx++;; v: G5 V5 G% u% K
              }
% r- w9 E% x1 K            }
- Y! |, S- P  Q$ ]. \           if(pClassObject)pClassObject->Release();9 l% x: E. {9 p: b0 ]
        }
2 ], g& X9 H6 ~5 Q! }$ L$ y* X. k        if(pEnumClassObject)pEnumClassObject->Release();4 X. d+ ~% x; U, @$ X
     }8 e5 [* p0 N' N3 d1 j. I  P
    if(pWbemServices)pWbemServices->Release();+ n, V3 x( E! b1 z* g9 u, [  n: W
  }
! R8 ]: Q% U/ P& F- z  if(pWbemLocator)pWbemLocator->Release();
3 Z9 Y1 L# }; v; R1 S, s: P}0 i) G( x9 [1 E. G1 {' Q& w& ^4 d9 V
//---------------------------------------------------------------------------
6 d5 m# o7 {& z# v
% c9 J2 t, v1 P# P4 e* f6 ~// 通过 WIN32_bios 获取 BIOS 信息:6 C3 @% q5 F* b$ [/ W$ {' J
void __fastcall TForm1::Button1Click(TObject *Sender)3 ^5 A: I* o9 O% T. V$ W
{  L: r8 ~4 F3 F* @' @4 \; I9 q0 Q
   Memo1->Lines->Add("================== [WIN32_bios] =================");: G  T8 f0 c) N/ ]
   GetWmiInfo(Memo1->Lines, "WIN32_bios");5 L4 T# }' S- J+ l& x% J2 k
   Memo1->Lines->Add("");( Z1 Q) T" m( J( f  t( x6 [
}/ e4 r% u- u/ S  P! f% U$ }6 E

* c+ o7 ~; w, s: m7 E$ Z: J--------------------------------------------------------------------------------1 l2 k& {; k' s
/ |) `1 L  i  y( X2 h. r+ ]
WMI 可以访问的信息类型有:! |6 T8 k) U  r* a5 l3 I) N0 e: W3 C
  Win32_1394Controller
* Z+ e% l: [. O0 z, y  ~1 \   Win32_BaseBoard
* X+ H/ j5 z/ }4 h' [2 Y' T! `   Win32_Battery5 |/ `! a( m2 X, c5 j. o- J
  Win32_BIOS
) @6 r7 O6 I# p! e. J: N   Win32_Bus
: s  u: m- G1 N/ U; v$ j/ y   Win32_CacheMemory
' e: O+ M; j6 s. L% C* ]/ n   Win32_CDROMDrive
  g, a- T. G! |+ U& l8 ?   Win32_CurrentProbe
+ S3 a0 h+ r. T; A   Win32_DesktopMonitor$ C' e& v- \6 X$ O+ m
  Win32_DeviceMemoryAddress
+ i6 Z% m- U2 b. ~1 U   Win32_DiskDrive+ B( O! a& `8 }: X9 G4 _" o. o
  Win32_DisplayConfiguration: V$ o* x2 o9 C# e
  Win32_DisplayControllerConfiguration
2 q0 h! i5 W; m3 K" i+ p   Win32_DMAChannel
& ?5 }8 q3 {# u7 i5 Y2 V7 n   Win32_Fan
. l; W& `/ j( \, a7 w   Win32_FloppyController) E) P/ B& Y1 S- g
  Win32_FloppyDrive
9 k2 h7 g* j& ^; J   Win32_HeatPipe
5 n; L7 g+ p- {' x7 s   Win32_IDEController- z7 c& {: \+ H+ F8 U& ~6 N
  Win32_InfraredDevice
* s9 z8 k: `2 d8 b  X) K. f- \9 `   Win32_IRQResource# \  d6 d9 L$ j/ T8 ~* G% H
  Win32_Keyboard
2 Z: c; B1 l8 g- g9 h- P   Win32_MemoryArray
- H) A9 X& i- C! U  O7 [# [   Win32_MemoryDevice) ?$ S9 T/ ~5 J$ c. f8 {
  Win32_MotherboardDevice- ~4 S: E. V2 B- t  v
  Win32_NetworkAdapter, s% Q( X3 G0 q+ {
  Win32_NetworkAdapterConfiguration
, `# h# G" u8 T  T   Win32_OnBoardDevice
, W+ a) t5 n9 D' d   Win32_ParallelPort
  T  h! c1 e7 y7 g# ~% W   Win32_PCMCIAController
, b; u( H0 h/ v7 \4 Q) G( V+ L/ H* |   Win32_PhysicalMemory
0 Z: k, O9 ~( ?& v& s4 Y   Win32_PhysicalMemoryArray9 i" R* V' U8 m* h+ ?. i: Q! u" R
  Win32_PnPEntity
$ D& b, |6 r$ ^2 J& U' @   Win32_PointingDevice
/ B0 A5 h1 s( H5 d5 A   Win32_PortableBattery* t/ A0 v8 s7 I" s. |6 g) S
  Win32_PortConnector
/ i5 s$ H2 O$ k. p0 z3 t* w   Win32_PortResource
/ T0 L7 L& Q  k1 @  X   Win32_POTSModem
0 z8 F8 Z2 ?2 s# p7 S+ `6 a   Win32_PowerManagementEvent& u% i- A4 ?$ a! X1 q
  Win32_Printer
) v8 u: Z1 ]6 G2 @! a- ~- [4 i: K   Win32_PrinterConfiguration
+ x8 r# ~6 A2 ~9 |. S& W* ]+ E   Win32_PrintJob
$ N( C; l( r; T9 g8 S   Win32_Processor
' J+ [4 ~9 t# H0 X1 B7 j8 e2 g5 f7 r   Win32_Refrigeration
. |+ M% l+ ]  \   Win32_SerialPort
9 H' i1 p0 U3 o   Win32_SerialPortConfiguration
7 l5 M$ P" i. _) L   Win32_SMBIOSMemory$ b- X  {. d, i5 V
  Win32_SoundDevice- m0 Y3 ]$ V! m9 V" W0 k" ^) Q
  Win32_SystemEnclosure
/ i8 O: H; p6 D# |   Win32_SystemMemoryResource
1 ?. Z2 [0 A7 V7 R0 k/ s5 S& y" R   Win32_SystemSlot* q: X7 g$ r3 J7 x
  Win32_TapeDrive
( C. g- P* F+ l" L0 Y* i1 m5 L   Win32_TemperatureProbe, f3 O* B8 A, D  n7 y$ @: g" f
  Win32_UninterruptiblePowerSupply
' S8 r' I) y' S1 L' Q5 u   Win32_USBController
) B: T, @$ |9 Q, }+ u   Win32_VideoConfiguration
+ w7 F" f' A. O9 T   Win32_VideoController6 {* D8 y: K4 H+ j( @
  Win32_VoltageProbe
+ ]% e) W! z% d, u& y. R0 w
" `& i  a5 G% A, P) N以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-2 07:53 , Processed in 0.019801 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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