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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
7 C) d$ C" p5 E9 ~/ d% A% N0 G# `1 G. I1 d7 ~
2 n+ U! @4 M' U3 P
--------------------------------------------------------------------------------" d) f' u* q0 k
WMI: Windows Management Instrumentation (Windows 管理工具)
3 ~/ F: {  |& Y4 J   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 0 D7 ~# X. n% S8 n
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
7 P" K. I2 {' Q1 ^9 l   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
/ e7 g9 Z& L5 D. E, Y0 X6 g! s- w$ A0 I3 ~  w6 z
--------------------------------------------------------------------------------; S& ]2 Z" p8 R2 Z
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
2 c  K" H: H# V, D8 d4 n0 a  x* k# b* x  s: |0 X
--------------------------------------------------------------------------------
0 m0 c  M- G% t9 G7 l; G) S① 初始化 COM 接口:* v9 ?5 }: a: J' C4 r
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
" u2 B0 t1 D( S- F   这两个函数在 #include <comdef.h> 里面定义。
& Y% K8 k5 y5 s3 y( W7 K
* h1 O5 `9 A: s2 m② 获取访问 WMI 权限:. S; A  \. t, N5 E) L& r: `
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);5 S6 u) K6 m+ E# D3 r+ P" w8 k
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
/ B+ S" L$ N( C" ]# [8 V. Q
4 U+ N) f5 W8 N' j③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
1 |8 \3 L4 o( l6 A4 W- X$ \7 y   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。+ V. o+ e& B2 K- E6 L
' e- u0 Z0 ^" b3 L% m$ E
void GetWmiInfo(TStrings *lpList, WideString wsClass)8 A( f* \: z  _
{  W+ a7 p3 G0 s* P/ s7 i: c& h
  IWbemLocator *pWbemLocator = NULL;) D. p& K/ g! J/ x" i; F8 d
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)+ Q: x& B8 g% O4 X( o/ I
  {) a8 Y) A+ d9 W8 R/ V
    IWbemServices *pWbemServices = NULL;
0 y) U$ G* `0 Q5 ~9 `     WideString wsNamespace = (L"root\\cimv2");
) v6 V; |3 S& [& N/ ?     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)+ u# w  C) H( ~; [2 r5 e0 e
     {
( a5 u9 O( d: O# ?, p- S5 t        IEnumWbemClassObject *pEnumClassObject = NULL;
% q4 I% w% S, m        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
$ C0 O, H1 p; n% s  V# C        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
1 Q0 n. s0 z! v) k7 ^4 K3 x, d$ v         {
7 g8 C2 ?5 q2 V9 t7 G1 K           IWbemClassObject *pClassObject = NULL;; e( o- H' H6 R
          ULONG uCount = 1, uReturned;! p, h+ d- \" z8 H; |: S- k! j! `
          if(pEnumClassObject->Reset() == S_OK)6 E* r. _* {- F5 H( y
           {
" B; O& ^5 m  k4 ]              int iEnumIdx = 0;
  U3 s6 J! R% U: m              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)$ b+ r7 o2 {# o
              {
( o! u# l) x9 [" e$ W% D( K                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
$ T4 e/ K9 R3 s7 F" w
" [4 K3 F0 U1 n! O, Z) G7 @' J                 SAFEARRAY *pvNames = NULL;
- ?/ ~( V' D1 r5 B/ Y8 M                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
6 z" u* n9 ^2 e3 a2 x                  {
! P1 l4 K; w0 R$ T9 v% g! a                    long vbl, vbu;( z" F; v2 v. \. @
                   SafeArrayGetLBound(pvNames, 1, &vbl);
: l4 [' R5 S" b, C& b                    SafeArrayGetUBound(pvNames, 1, &vbu);# B% e& T3 M, y3 i$ m: R' a
                   for(long idx=vbl; idx<=vbu; idx++)
( P0 L% `* |6 b$ u% H1 T, j                     {4 i/ R6 @. |4 O5 n) h
                      long aidx = idx;
+ m0 v6 G0 x' `/ [& f. d                       wchar_t *wsName = 0;5 G4 z1 T) c3 u2 d" h1 }; w
                      VARIANT vValue;2 G/ B$ W+ l7 k- |
                      VariantInit(&vValue);
+ k5 `1 O6 E6 b1 o5 U" y' L. O                       SafeArrayGetElement(pvNames, &aidx, &wsName);, X# [9 a6 @6 H4 y6 e

5 y$ P* f) E- p2 c  \/ c1 M' c                       BSTR bs = SysAllocString(wsName);9 X# J# P/ N6 ]6 A: K( @5 i
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
6 e6 U4 ]0 }5 `4 G1 y4 A0 m9 S- ~+ w& S                       SysFreeString(bs);. J# Z' V  {% i0 Q  Y

/ ~) g) T5 ~. r1 Z( h                       if(hRes == S_OK)3 a, I1 O2 H5 F9 A6 Y3 \' F
                       {2 y( K" i: @) P0 N& |1 ^( ^
                         AnsiString s;( r& ?2 {; m! @. y; X, \- \
                         Variant v = *(Variant*)&vValue;, E7 r/ _3 ~* [6 p3 k7 B, h
                         if(v.IsArray())
7 L! {* J0 r: G. Y) `% c. y                           {
$ B# S$ k. R! i8 ]                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
2 e- o3 k  H  I* N# F6 ]                              {
4 \9 Y' w; h! }2 b  s                                Variant a = v.GetElement(i);. C8 o! v+ A; a/ F1 a
                               if(!s.IsEmpty())
; C4 |; J" t0 p" x; G) X                                  s+=", ";# `$ y6 ?) O' ~% b% [  s  _
                               s+=VarToStr(a);
2 d/ |  F3 V9 E, R7 h! |                              }5 w6 M1 M5 H  q- ]) c  l
                          }* b* I# i5 r' R0 V3 b
                         else
1 P8 ~0 U4 _  g  m( z  E                           {0 c' _% P; z! u; \9 X
                            s = VarToStr(v);2 s& _) Z$ B# I& o' \$ Z- S" p
                          }
2 W3 u6 B! O/ {/ ]                          lpList->Add(AnsiString(wsName)+"="+s);
/ ^! j7 x! @: V$ n                        }: E% }; E9 C& T8 f3 r
; j* B! `8 U  n0 _! ~
                      VariantClear(&vValue);7 |& _& n: ]- J" i
                      SysFreeString(wsName);, x5 x1 p" N9 h/ [4 T
                    }
. B1 `5 a4 O3 |. T2 ~# D                  }
6 M, n% V' ?  h6 m& y                 if(pvNames)SafeArrayDestroy(pvNames);
+ ?6 n& T8 z3 c2 d( o$ A6 @- Q8 b7 F                 iEnumIdx++;0 d2 e3 x  ?" |. F% H' x, J. }3 N1 R
              }
$ ]/ B! s9 M" Q+ S4 F            }6 l# Q* i* K- @. A* Y
          if(pClassObject)pClassObject->Release();% z3 w1 g0 o" J4 ]
        }
9 }& T1 o: F6 g  }" w4 r+ O        if(pEnumClassObject)pEnumClassObject->Release();
* A3 j4 d- X3 b9 t8 [  P5 O      }+ B' l' R, x9 h  `* R+ @: ^
    if(pWbemServices)pWbemServices->Release();0 \4 i: r. h( R+ A7 s9 c( o7 o" ^
  }( S+ r  R& U% f
  if(pWbemLocator)pWbemLocator->Release();2 N2 T; `" d! }! W
}& B+ Q, ?6 c8 I, c3 k
//---------------------------------------------------------------------------
2 h8 Q+ e' t" U1 s) A  f
  _; C9 w, ]# R// 通过 WIN32_bios 获取 BIOS 信息:7 B, k; ^( [0 r0 P' S
void __fastcall TForm1::Button1Click(TObject *Sender); V: \: ^  ^$ \1 ^: S5 L
{% i; N1 H% ?8 m" i! w4 v" ]) w- h* T
   Memo1->Lines->Add("================== [WIN32_bios] =================");
9 u0 C, X# b0 ?. j& m  {' V1 M    GetWmiInfo(Memo1->Lines, "WIN32_bios");
' E+ P# y+ r9 T7 }3 X    Memo1->Lines->Add("");
3 x7 P4 D5 E8 I( v' U7 {. M+ r" |}7 i8 Y, \2 Q7 D* w
8 u6 w8 Y* H0 C) B( a7 L3 r
--------------------------------------------------------------------------------& W/ |' a* S- {) ]# i

4 I8 u9 U' S; {  tWMI 可以访问的信息类型有:
- m; ]. S: ^: ~( F8 Y* d   Win32_1394Controller
# r0 Q. L' Y* K) Y   Win32_BaseBoard
8 z$ c! N1 b: I# F" b+ n" q   Win32_Battery
+ A5 L* C  c3 j+ ]' }( X   Win32_BIOS
2 Q0 ]0 f$ @- f! K3 s* B4 ?   Win32_Bus
. S6 i& X1 ^6 {( t9 m9 a3 @7 H  r   Win32_CacheMemory; _$ f8 w' M3 e+ S5 D) F% M
  Win32_CDROMDrive
; M6 K! g+ s; P+ w; I% X   Win32_CurrentProbe3 u1 K3 P. X1 w. ]
  Win32_DesktopMonitor. n; C" n- I) v2 u
  Win32_DeviceMemoryAddress
2 p$ S! _7 Q1 ~& L9 Z# o   Win32_DiskDrive
* }5 r# f; S; u+ ]/ Y   Win32_DisplayConfiguration
7 Y9 p$ A) t0 t& _   Win32_DisplayControllerConfiguration
7 |4 E! B& T" D% Y2 M1 ]7 x2 [8 f   Win32_DMAChannel
: [6 I' P6 x+ V5 h! |   Win32_Fan
- E. Q  w8 m( h% U   Win32_FloppyController/ R3 x8 ?) y6 G* r  N; P$ w
  Win32_FloppyDrive
' K8 ^1 ?2 B( B) r, x2 L3 Z6 |   Win32_HeatPipe# g; }4 e- n9 z
  Win32_IDEController' V8 q: Y  M5 j1 C4 P2 ?
  Win32_InfraredDevice
- Y0 ?+ P2 B( R( W  X6 B   Win32_IRQResource
$ [5 N0 ~6 O6 x0 B+ J5 ^8 ]; t   Win32_Keyboard
3 l" n& |" n! a) _   Win32_MemoryArray4 E  x: F$ j# v1 b; d4 g
  Win32_MemoryDevice
  t/ b* M# V7 h, W3 T+ s5 y" n   Win32_MotherboardDevice
  [# E& s1 E0 D  M5 H   Win32_NetworkAdapter3 W0 a( O) K. h' n, t" v+ _* P
  Win32_NetworkAdapterConfiguration
( A1 ]1 O, K5 J6 U   Win32_OnBoardDevice
: k9 \& z# L! ?: E! ^   Win32_ParallelPort- {" T' G* ?% p# v# V
  Win32_PCMCIAController/ E/ p( ]& ~) b$ Q& O8 W/ Q" S) l: _4 D
  Win32_PhysicalMemory
  R# P1 i$ D5 @' R$ T- Z   Win32_PhysicalMemoryArray
6 k( |; d; B% X8 R5 p1 F1 E- K2 v   Win32_PnPEntity
" x/ e0 k: }5 h6 U+ k2 ]3 a   Win32_PointingDevice$ P/ t* v* t- j& j5 c' Y
  Win32_PortableBattery" H% c2 B% S( X3 h& }
  Win32_PortConnector
# m( W" ?1 y" V, @6 S( M8 L% |   Win32_PortResource. ~& i/ y' N( ]0 O
  Win32_POTSModem
! ?, ]: h' t) s8 Q+ H. I7 R   Win32_PowerManagementEvent4 w( s+ i$ X* p1 ]6 Z8 U
  Win32_Printer
" T! x; F, ]* f; ]# Y- m   Win32_PrinterConfiguration4 b6 w8 H! T/ j3 \
  Win32_PrintJob9 Y3 D* F7 N, H& B
  Win32_Processor! E* ?7 `, N0 _  F3 ^2 s. n
  Win32_Refrigeration
4 `5 ~" n8 Y" e1 k: h. o* v   Win32_SerialPort: B. h9 [$ \8 d5 B3 ?2 J" _
  Win32_SerialPortConfiguration) g. i$ S" r' a0 e
  Win32_SMBIOSMemory! S) c! ]1 D2 E' z7 [0 O% Y
  Win32_SoundDevice$ n& ^0 h6 f3 C
  Win32_SystemEnclosure
8 X- _/ o' u& X6 l2 F   Win32_SystemMemoryResource* i, B4 i4 o$ V
  Win32_SystemSlot
; P+ |& E7 e, }" j! O   Win32_TapeDrive
8 b+ ], j' T# M) q   Win32_TemperatureProbe
5 D' M1 O* f( w5 s, w, |6 g# N   Win32_UninterruptiblePowerSupply
: ?( M. K* t! n: X( {( N- N   Win32_USBController0 J% o, j; M8 s, Z, x( I3 S2 J
  Win32_VideoConfiguration
8 U: q& Y& p1 Y+ P# h( u0 C   Win32_VideoController: d: x+ k! m5 G
  Win32_VoltageProbe
) @2 C6 p2 M; p' b2 a) K2 ?$ P5 d. ^7 Q% J
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-4 16:42 , Processed in 0.020452 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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