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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
6 p. Y5 K  K! j( n  W! u5 C
  Q9 t; u. o, Q0 Y7 }! V1 u  j9 y8 D1 L) ?' m
--------------------------------------------------------------------------------- O) V3 R' r. e% u0 L8 q( g* G* ?
WMI: Windows Management Instrumentation (Windows 管理工具)
, v; ]- p# Z% X% K/ z$ z   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
$ h. q0 W. w  M   利用这个工具可以管理本地或客户端系统中几乎所有的信息。! x$ E4 J+ L0 m5 O, x/ s: `7 f2 F
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
2 F! Y- c3 K! G- S) D; _2 z+ H/ X9 b* }- Z
--------------------------------------------------------------------------------
8 F, F, D) }0 n# M: GBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
( \  y  `* _: O9 R) B8 T7 W
9 u9 T7 L: O1 z1 U: s7 f--------------------------------------------------------------------------------
% m( B) Q. m: t9 _① 初始化 COM 接口:
' b9 V( p6 i* t( h0 b9 c5 c   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。* E4 Q5 u9 r4 K' E1 d
  这两个函数在 #include <comdef.h> 里面定义。* c; y3 U8 \/ G6 C1 v! g
; i( x, M8 o6 B1 j
② 获取访问 WMI 权限:1 b3 C" R# H" o  v, k1 t& A
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);; ]6 R( t9 o. F. J# U! Z
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。, ]0 Y" u, U2 j4 u4 X" g; z: k

5 {! i9 g) ~' z5 P% P' D③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
' d8 A4 J; T( ~) X+ o5 O( b   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。* V7 V" m4 ?' V9 G

; R6 v3 j- N, V, E9 }6 _0 P- {* yvoid GetWmiInfo(TStrings *lpList, WideString wsClass); I  w! C8 x" a! \5 e: i
{) G; G. t9 {- s0 @
  IWbemLocator *pWbemLocator = NULL;# w+ y  q# y* x8 K2 z$ l' g
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
2 `0 K6 _9 N3 z3 ~   {
* v) m& {" [* y# v3 ^: p     IWbemServices *pWbemServices = NULL;
. a' D$ ?' B, V     WideString wsNamespace = (L"root\\cimv2");
0 A  `! ~7 Y9 a: h0 K% ?4 d     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
  S, P9 r7 a' y$ b1 e" n8 x' z      {
+ B: Q4 u6 y# b3 r. l6 V" l* N' J+ `        IEnumWbemClassObject *pEnumClassObject = NULL;8 g* ~7 H0 ~' f" m
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;: J0 L5 [3 `  F. k$ J) o) Z% K, i0 X
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
7 J* v/ L  f" w/ l         {
6 L! T( v3 _3 \           IWbemClassObject *pClassObject = NULL;
- l% t4 o. v9 ^+ t! f* a& y/ d           ULONG uCount = 1, uReturned;
6 _5 k+ r5 n) {- z" u0 S' N           if(pEnumClassObject->Reset() == S_OK)
: p- X' @: ~2 S/ g) _; v+ p( V0 d3 J2 e( n            {
3 }5 g6 \/ }  }% {8 W  l' L# r# ~  Z              int iEnumIdx = 0;
8 `% r2 h& F+ t" O! k5 Y- ]0 \( R              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
& `. d" t( h  i6 F+ k               {1 c( l, U" E0 |
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");4 [& J' F& B' j, ?7 f7 i& \4 K
2 d+ }+ t  W+ x. W
                SAFEARRAY *pvNames = NULL;
4 X: S# [: ^& ]" n5 y( |                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
; U/ b  c" {7 ]7 g                  {1 T/ a! _' ~7 p) v
                   long vbl, vbu;$ l' I, c; T  C  N: I" o4 B
                   SafeArrayGetLBound(pvNames, 1, &vbl);
+ t2 C9 E0 }6 a7 @                    SafeArrayGetUBound(pvNames, 1, &vbu);9 L$ K1 H$ g. E9 E) l' |
                   for(long idx=vbl; idx<=vbu; idx++)  ?2 ^% a6 L$ W
                    {
$ o- A" w6 ]) j9 ?. \' _9 ^                       long aidx = idx;$ j! t7 Y  Q3 c% H& `$ ~$ A
                      wchar_t *wsName = 0;6 I# B5 A1 D8 [2 e$ `( F# w7 `
                      VARIANT vValue;
; ~9 }. c7 i; P3 z& y                       VariantInit(&vValue);
9 j  u' s+ ?7 b' r1 j                       SafeArrayGetElement(pvNames, &aidx, &wsName);
  j3 X8 D( Q# Y" a6 L9 D: S% c: w9 Q
                      BSTR bs = SysAllocString(wsName);7 M7 Y$ Y! w2 G
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);. f( C" G. c& b
                      SysFreeString(bs);% b! \; [# M0 o4 R% e
9 z) n5 @# `! h, A% b% |4 V
                      if(hRes == S_OK)
( _# ?% t' i0 A1 P% e( B                        {' S4 Y# J7 w2 ?4 ~; f0 _
                         AnsiString s;2 }$ C. n' t8 a2 t$ @: C# h
                         Variant v = *(Variant*)&vValue;8 \# F, h% g* E% U4 |& E- t; }
                         if(v.IsArray())' o. H7 t' Q' i, `: G+ s
                          {
# z7 J! `; D; c" U$ V                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)& b0 {6 @( Y5 E+ ]4 V2 R6 R
                             {6 J! t4 _0 v! y. D# U- q1 a
                               Variant a = v.GetElement(i);% V. L- k  H1 F+ L0 D8 n1 X
                               if(!s.IsEmpty()). b" P9 r6 x0 q; P- `% Q; F
                                 s+=", ";6 n- r6 l, |: L& Y( U" W, n5 `) E( r
                               s+=VarToStr(a);
  x+ W( U2 }& z' [3 m5 G1 y- e( W2 H                              }8 \! B  _+ p: M/ U
                          }
7 r2 i" B  V- h# e2 A0 ^( q, m                          else
+ v7 M  a* G) Q/ U! w: E                           {
2 e) Y( K# @1 c- I. Q6 w                             s = VarToStr(v);3 a. p9 q' j% g0 l5 j# N
                          }
, s- c( d2 K0 F8 E5 E. I- B                          lpList->Add(AnsiString(wsName)+"="+s);
5 o' ^' @7 o+ W8 l- W& k                        }& m0 ^, F* @9 r
6 b& J3 e1 L0 O8 S
                      VariantClear(&vValue);2 {; e* g* l' c2 x9 R
                      SysFreeString(wsName);& l  a4 H3 \' P
                    }3 a/ L; O3 _6 T" [. X& [" H2 J3 R
                 }: J% _" m& {1 Y
                if(pvNames)SafeArrayDestroy(pvNames);5 s- d) f: g9 V4 M  i
                iEnumIdx++;3 p, p- e' I) R; `2 ~! {7 Y/ H7 u. v
              }
8 i% v) k, N& b* h5 R            }
: p! v' X' p9 n9 v' f9 X1 V           if(pClassObject)pClassObject->Release();
0 d7 g- G) C1 {9 c* T6 W         }  a. T5 f* U% k! \; D- Y
       if(pEnumClassObject)pEnumClassObject->Release();( p7 ^0 X- ~* f/ [
     }
0 O2 s# S0 N/ a4 h9 j8 ~     if(pWbemServices)pWbemServices->Release();
9 j9 k& y- v/ g. L$ j, s# Q! N   }
1 ?1 L& m0 T: Q# v, |6 S! w  if(pWbemLocator)pWbemLocator->Release();* K; N8 c1 a$ d& N& ~
}. w6 A6 N# Z" ]4 r0 ]) _
//---------------------------------------------------------------------------
# i$ N" X: v! l% E
& C# J6 v! t# P4 E+ w; [3 ~// 通过 WIN32_bios 获取 BIOS 信息:
2 h( p) y" S2 E# o) s1 @void __fastcall TForm1::Button1Click(TObject *Sender)/ K$ h. P& \, o  ]" _3 P
{; j6 L0 E5 T+ O! A1 c
   Memo1->Lines->Add("================== [WIN32_bios] =================");( n0 a4 e" k! l: r. R
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
: @$ A. G3 w7 {& H6 I    Memo1->Lines->Add("");
" |6 E" y# |' y" m  w% @# Z}4 k' D; e" @, Q9 o# L) K0 J6 }
  g7 w/ Z3 a' w0 q; c
--------------------------------------------------------------------------------. D# a, G1 q! t! ^9 l$ r1 y
1 I4 I& F3 Z& c, a; M$ j
WMI 可以访问的信息类型有:0 s0 w" o4 ]) q+ ^4 A, ?( [
  Win32_1394Controller
+ x% T) s# p" E; P% Y7 U   Win32_BaseBoard
" F! t. f8 v/ y% |  R( V# Y   Win32_Battery
& u: u. u: x5 C4 z/ H/ E& K   Win32_BIOS/ O4 g4 W. }3 ~! |6 C
  Win32_Bus
5 _! q1 X6 v. X3 W7 J1 V2 g   Win32_CacheMemory1 ^* r# s6 r4 I, q
  Win32_CDROMDrive
+ @# ~- t% v9 w9 P   Win32_CurrentProbe: s8 P( v& t9 Y; t) ]
  Win32_DesktopMonitor, k1 o9 e+ }2 _+ q4 i1 Z& T6 q+ T
  Win32_DeviceMemoryAddress' r. T$ S2 _! o$ D: h5 g- E: v" q
  Win32_DiskDrive1 d+ I% z3 B; ^( d1 r5 W
  Win32_DisplayConfiguration
' @0 T( y# |' b4 R# ?& W* I   Win32_DisplayControllerConfiguration3 V) S. I) j  h! m& Y2 \. n: L
  Win32_DMAChannel" w% D$ i: i$ V: l% r
  Win32_Fan8 r. }, O$ P6 o; o! b2 F
  Win32_FloppyController
) J8 i/ s4 a/ S: W8 R   Win32_FloppyDrive
, l$ E% l% K; R9 e* a- [3 m7 X; E$ ?   Win32_HeatPipe( q4 \" b2 }' ^8 e
  Win32_IDEController! u" L/ j: v: b+ C& N% U2 z
  Win32_InfraredDevice
6 @2 |. j" ]4 M. y4 n% `   Win32_IRQResource
: z/ u! [) y3 |& X) z   Win32_Keyboard
1 H. v' V3 k: C# r1 P9 a; Q   Win32_MemoryArray9 P- m# a, ^  W5 _
  Win32_MemoryDevice8 e7 N% C9 j! L! U/ k$ M8 k
  Win32_MotherboardDevice
& o$ T( P- S' w: j( I5 N4 z# G   Win32_NetworkAdapter5 s+ t) \0 d5 d0 [+ L1 M+ F
  Win32_NetworkAdapterConfiguration* l; Q, a" U9 S4 i* r3 Y  ?  Z
  Win32_OnBoardDevice
8 [" v+ o/ h# `+ D/ s& ]6 |  x2 G1 m! g   Win32_ParallelPort
' R* k$ _0 @6 U0 V   Win32_PCMCIAController
+ C& L6 |6 E, s! Q6 f9 N   Win32_PhysicalMemory( E) o$ ?6 _0 @3 N
  Win32_PhysicalMemoryArray
, ^3 H* o8 r- ?( y) L, ?6 V   Win32_PnPEntity* ^- n8 Z5 h9 V% I
  Win32_PointingDevice! @! J/ k* o, U" z2 S8 P
  Win32_PortableBattery
9 K* D( ]! b/ u: L) E   Win32_PortConnector
' B* G" g1 K9 z, Z; F   Win32_PortResource
! h. P; E5 n3 F- Q   Win32_POTSModem
, z7 t. x: S; B# o   Win32_PowerManagementEvent
1 r0 \& l4 |# w- H( I8 K   Win32_Printer2 p) I/ a) n3 ]& W0 C( l
  Win32_PrinterConfiguration0 S0 Z+ w( u2 _3 i/ M; P
  Win32_PrintJob0 C6 E5 B8 }& ^/ E
  Win32_Processor
& ~% J9 V+ c" j" C' @   Win32_Refrigeration
, P, ~$ b: G  U& i$ ~. w   Win32_SerialPort
7 |4 D1 a/ S0 C( q  P   Win32_SerialPortConfiguration4 E, {) i6 G% ~' F9 H% W+ ~
  Win32_SMBIOSMemory  Y, }( o1 V- u+ i0 l& ]
  Win32_SoundDevice
' S' b: k: M3 L, W) A   Win32_SystemEnclosure1 \: {+ _$ @8 K# Q0 u
  Win32_SystemMemoryResource/ A% A; [* r' }: Q1 s0 w, A
  Win32_SystemSlot' G3 _* i' q, g' S: P, _
  Win32_TapeDrive1 R: e0 [$ z/ d  S% h
  Win32_TemperatureProbe
9 t, o% m, H6 o1 o$ I   Win32_UninterruptiblePowerSupply3 P: {: X  z- x8 U
  Win32_USBController  I, o) N5 Q- N3 q2 w) u" E
  Win32_VideoConfiguration
1 O0 x7 M; n# Q" g; w+ x   Win32_VideoController  E0 d' Y9 d! v- G: w) T
  Win32_VoltageProbe& E! i" H8 K% D) H$ Z$ K9 a
' O' A$ U1 b$ d/ t0 D7 [
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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