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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者), k9 Z) t( O( Z+ E- m, x/ S/ X* U# V
* R5 M9 g: a. O8 p$ {6 I$ S1 o

5 o" u5 ~9 G, Y- H) b3 c7 C6 m--------------------------------------------------------------------------------
! V+ P9 W* \  s) }WMI: Windows Management Instrumentation (Windows 管理工具)2 L/ q- n( [, `; L$ a% L& r
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 9 M4 `+ t  k5 ]6 u  P
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。0 E7 v7 o7 p' ~3 m, F9 ~
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ! Z2 @5 _( {2 ]% T; c5 G$ s( X2 ]
* M8 e0 I2 [+ ~" Z1 @& G) q
--------------------------------------------------------------------------------4 q' H2 Y( I; h- s9 Y7 e
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
$ p$ ?+ O2 `) o8 x& O; M7 T
. s6 A9 l% A# [" Y$ s--------------------------------------------------------------------------------4 [2 C# |8 B. b' s  l; z
① 初始化 COM 接口:
) d' C+ t  Z) |2 p3 X   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。7 u: S8 \- u# l& x3 Y1 q0 S) D; r
  这两个函数在 #include <comdef.h> 里面定义。
7 g5 T; |' D1 Q$ ^: b- v1 Q3 G3 U1 G0 U
② 获取访问 WMI 权限:
( K7 F- o# y$ e% [* L  a) s   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);& L; y( }. l+ b" [
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
7 Q/ [& @( c+ b5 d1 ?% H8 j: L! f
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
5 }1 K2 a* m& r' u   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
1 ?. }% I3 A* w9 T8 Q" x) Q
: C7 J2 K6 P7 N& Zvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
. b& X2 j% d+ v( e: B) {{
( g; D$ D- P. J# ^; W9 {( w  IWbemLocator *pWbemLocator = NULL;
6 X) ?1 @2 l- X" r; I  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK): ]/ n; r5 D/ z# W0 a2 m* f
  {
- f; ~- S' n4 ^     IWbemServices *pWbemServices = NULL;
& o" s$ J$ P' K0 M1 b5 O4 B8 m4 \     WideString wsNamespace = (L"root\\cimv2");: D, N2 H- R( s8 o# N
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)# ]1 V! f0 T; ~! _0 U! m
     {
& }! m- _$ z' ~, V% A        IEnumWbemClassObject *pEnumClassObject = NULL;. f8 r" w3 E5 F3 t: _: ?
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;+ F6 Z0 t$ B3 A. Q$ M3 z
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)/ q) c1 |9 c: g. U6 e4 ?0 F
        {
5 R  ~$ P# T: ~2 }& s2 l6 A) n           IWbemClassObject *pClassObject = NULL;* I3 V8 w; q: |5 b0 y, c& R+ K
          ULONG uCount = 1, uReturned;% M( ]8 a( C- q/ Z
          if(pEnumClassObject->Reset() == S_OK)
6 d7 ?5 b* Z0 k            {
( l( K! j! E/ ~' W( e7 `: a$ J              int iEnumIdx = 0;6 V7 ?) I- j* X% d' z, a5 h& r
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)6 O8 ~% v9 `: ~2 C, ]
              {
( G! s- K% K. s7 e                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");6 ~- ?* K  j, P% B

  _/ ^; C2 Q! u( i1 C6 N# c; [% {                 SAFEARRAY *pvNames = NULL;" k6 Y* q2 C0 L. u  U
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)0 c; O7 \4 X- o8 I  g
                 {/ g0 h* F" I- z' G( J0 ~
                   long vbl, vbu;3 `; Z* n2 ^1 b
                   SafeArrayGetLBound(pvNames, 1, &vbl);6 I3 |" x4 {! W8 Q" n' ]$ w9 I+ j
                   SafeArrayGetUBound(pvNames, 1, &vbu);1 V: d- o6 e2 `& ~3 {; i! }
                   for(long idx=vbl; idx<=vbu; idx++)
" x2 x1 C$ s  Z1 s2 F* {                     {
/ @4 k/ b5 l+ u# A9 T7 L0 S; |% z+ v                       long aidx = idx;7 A) K. c& E8 ~& O# X- V
                      wchar_t *wsName = 0;5 L' K( S* X* R) o, P% E. r% ^
                      VARIANT vValue;
  t' `' P& M" |( D, r" I                       VariantInit(&vValue);3 _# T  Z' @7 I
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
7 o# V. H, h1 y& {. r: p: }
& w' Q2 r! h& K# p, l                       BSTR bs = SysAllocString(wsName);; j3 g# [( I9 a, r9 \' l: G4 M
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);4 I7 e1 L% V, `) |, K
                      SysFreeString(bs);" \# {8 W1 U: ?2 Q' G$ G  A$ U
: X. {6 k0 y' V; M4 R
                      if(hRes == S_OK)
9 A: M; q2 M& B5 z# \: m                        {, ^' {1 O2 \  E) X: T- p
                         AnsiString s;
7 ]8 |( S. z( e& }& f8 }  h3 S9 u                          Variant v = *(Variant*)&vValue;
, M4 |( {  L& H( U                          if(v.IsArray())" V4 g$ J+ A$ F2 M
                          {& f3 B$ j6 S0 ?. C: o% p7 G9 U
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)2 G( y" Z5 }. b; U! G
                             {
0 a" f5 [2 |% X$ `9 K                                Variant a = v.GetElement(i);
9 }/ h$ ^9 _, B1 A$ o                                if(!s.IsEmpty())
/ L2 N, i) a& [, g" a                                  s+=", ";9 s& }) T6 i) ?% j! g0 l
                               s+=VarToStr(a);8 @  e0 H2 z! N* A$ n% u1 g
                             }
" E) b9 s  s! p                           }! z2 p) M* K/ I4 s% J7 L
                         else7 o6 {6 s. |5 f5 ]/ e- d1 B  y
                          {# O( A6 z' P% n4 W9 I7 z4 s
                            s = VarToStr(v);4 f. X! T2 v* L. t6 P- R  x( o
                          }7 Q; Y! _! K( B8 T
                         lpList->Add(AnsiString(wsName)+"="+s);
+ w) @+ D  Y/ _( C- o% h) j+ W                        }
  D6 x' |( r3 m, ~, S3 C- ]1 [2 M; J
                      VariantClear(&vValue);
0 `$ g. [4 T$ |$ [                       SysFreeString(wsName);
, V  E8 V5 O2 c0 v( T- j' j                     }
  [- n& a& ?+ q% L8 b                  }9 Q6 J  u2 j2 ?; `
                if(pvNames)SafeArrayDestroy(pvNames);/ D. ^: K" n6 L0 ^$ E
                iEnumIdx++;( g  S6 ~$ L9 b3 q' Y! j5 f
              }& B6 c# @7 H. o0 L7 g
           }! m& {5 L8 O3 {$ r* E
          if(pClassObject)pClassObject->Release();
* c7 k, C$ F8 ]& ~7 S2 v         }: ~7 P) \2 |0 L+ @+ y9 F+ N
       if(pEnumClassObject)pEnumClassObject->Release();4 t) E7 ]' C2 s4 O. t7 n8 D6 u1 q) A* F
     }
: n: F/ S: {2 \; }& I: F     if(pWbemServices)pWbemServices->Release();9 n$ A& R! s+ N" W* p" {2 k; T
  }- ^3 d, T. d. K8 s: _
  if(pWbemLocator)pWbemLocator->Release();
# W8 i& `, S, Q8 ?1 g; ^}
( z; o8 ?# y* g- p4 J//---------------------------------------------------------------------------
& }5 J5 U  d4 C$ Z( w: N" A( x; n
// 通过 WIN32_bios 获取 BIOS 信息:( r, _6 S6 V0 V' b
void __fastcall TForm1::Button1Click(TObject *Sender)
, T+ z$ `0 f3 y{- I& K" x8 M; n% t* j) @7 {$ z" D& q
   Memo1->Lines->Add("================== [WIN32_bios] =================");
9 M0 H: l9 k) }2 t    GetWmiInfo(Memo1->Lines, "WIN32_bios");
& ?5 z* \8 D3 j; e. o9 Z    Memo1->Lines->Add("");0 p1 n$ g8 {0 s6 h/ ~
}4 m7 ?; L- J) X' R

4 C0 B" ]( {2 H' C: t! r--------------------------------------------------------------------------------/ b' ~$ L! C2 |4 c) r1 S7 M
; B2 K$ v4 {7 s- t9 V
WMI 可以访问的信息类型有:
6 H6 @9 s# \$ m* H; Z   Win32_1394Controller/ r2 N+ m8 u+ A
  Win32_BaseBoard6 z2 ~1 w- M$ p2 J
  Win32_Battery/ f3 {( o6 p8 N
  Win32_BIOS
* O0 b/ _6 K0 Y: ^% L4 X; u   Win32_Bus9 [7 e9 R) _6 [+ _7 l
  Win32_CacheMemory7 T% M  `; ~# ^0 T. B9 l
  Win32_CDROMDrive$ ~! [. O. n7 C" B: u
  Win32_CurrentProbe
0 u1 \! i5 n$ R0 {# @   Win32_DesktopMonitor& ^) T2 m1 T8 B% L6 r
  Win32_DeviceMemoryAddress
7 c; Z& ?1 v, E0 d8 _" \   Win32_DiskDrive& W3 a4 j* b' k4 v1 e/ q
  Win32_DisplayConfiguration
/ y* }! Y4 S: o/ [( k   Win32_DisplayControllerConfiguration
) w4 D& c0 @9 ?  u8 j( _  k   Win32_DMAChannel
5 N$ k" `7 d. \& j( u' i& P1 Z   Win32_Fan" F+ q' a( F7 {' H& l9 I5 B
  Win32_FloppyController
( b( Q9 s5 b3 P   Win32_FloppyDrive
6 N4 l" v7 t7 I  y# y$ K2 l7 R   Win32_HeatPipe
3 B1 F) A  D" s9 c7 _5 Q8 B6 B   Win32_IDEController1 g" J' |" O" L, t3 G
  Win32_InfraredDevice1 R: D6 L/ F  i) G% }0 f$ R
  Win32_IRQResource5 f/ {" h6 |$ q7 w2 c8 P
  Win32_Keyboard# T' Z. W. j( k& d
  Win32_MemoryArray
, |& D9 k/ Z. P8 h% Z3 B( m! t, }6 l   Win32_MemoryDevice
6 F7 Q% q9 d) Q$ y6 |& q) i) o   Win32_MotherboardDevice8 E: T9 b' N1 j; y! s/ e$ k) u
  Win32_NetworkAdapter3 q  b3 d) f+ W; c: v
  Win32_NetworkAdapterConfiguration  T: L4 M; V. ~; @1 b
  Win32_OnBoardDevice
! ^1 T+ h) E! v   Win32_ParallelPort9 ~% u$ }. N; o$ `
  Win32_PCMCIAController
, t8 f9 @* r* V: o1 o3 A6 i4 t   Win32_PhysicalMemory
# X$ D( I! u; y. O   Win32_PhysicalMemoryArray
* q4 ~7 w8 m6 n; _" x   Win32_PnPEntity0 ^: \6 ?9 j2 ~4 b
  Win32_PointingDevice
, |* F2 u6 p8 L* U" v4 j5 \   Win32_PortableBattery
% v' v  z4 e( i! |4 P' _. c6 E   Win32_PortConnector
- _( t$ _9 n9 g# _   Win32_PortResource6 [" T7 T  y) E) g5 a: W% T
  Win32_POTSModem3 X! `% d& d5 y5 ^
  Win32_PowerManagementEvent
1 L' i# T' T% W# I  i; f" ~/ j   Win32_Printer
) z  @) E! X! p* @/ u0 c3 s2 n   Win32_PrinterConfiguration' E* I# A' y. g! o8 n, o
  Win32_PrintJob
7 L8 z" T7 m1 b; a2 N! I2 T1 J   Win32_Processor( k$ o0 I- V5 h; s8 ?  J( C9 _4 Q
  Win32_Refrigeration
( `0 ?  n* V1 n" E   Win32_SerialPort/ K3 i# K: R1 j6 `$ `
  Win32_SerialPortConfiguration& M" S. K5 F8 `2 q
  Win32_SMBIOSMemory
+ t5 O+ y& P. s: _   Win32_SoundDevice2 g0 K* q0 R3 K. k) [
  Win32_SystemEnclosure
- w# y- v3 z7 w6 C   Win32_SystemMemoryResource; x/ c% k, p4 h4 [& l
  Win32_SystemSlot& V! x4 Q' ~8 j
  Win32_TapeDrive
& }$ ^7 O8 u: T( h% n1 _* G, \   Win32_TemperatureProbe
. o& ^- q, j1 a7 g  [; {( P) V   Win32_UninterruptiblePowerSupply
- f8 a2 ~' d4 c5 n. a   Win32_USBController8 |& L, p2 B& n# w2 {9 Z
  Win32_VideoConfiguration
1 e3 {5 s, x9 o0 h( g6 f   Win32_VideoController& U- b% Q- ]& ^
  Win32_VoltageProbe
8 ~, o( G# I; W2 r8 i
1 Z3 R; t7 M) D1 t9 G以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-4 16:56 , Processed in 0.018901 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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