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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
/ z* G3 g! {3 H1 O) |8 v9 V" x3 r1 ]6 o  ^) l

. @: w, D8 D0 Y) h2 G! r--------------------------------------------------------------------------------
8 q  a' a+ W) B  T; D. g  i0 ?WMI: Windows Management Instrumentation (Windows 管理工具)
* ?4 ~. t& H3 `4 h, X: N   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 + m8 X+ M3 L  J& T
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
& y0 Z' }& A; e' L9 ~2 b   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 " H) ?' f/ b2 p2 N4 q
* j4 v) H1 a+ J0 D0 m+ Y% I
--------------------------------------------------------------------------------
. X! |3 y4 A7 W" q' wBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
, \- L( P3 `$ p% A- u1 z
* I, C7 J7 P6 I% p7 S6 M--------------------------------------------------------------------------------
9 B# v5 ?6 m, [6 l. W, l, \2 h① 初始化 COM 接口:7 y, E6 k0 V3 N$ u) x3 N
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。" V+ _: v! o5 l8 L5 \, N1 \
  这两个函数在 #include <comdef.h> 里面定义。
5 b& G9 N( ]2 q/ Q$ i/ l4 b
" y# e0 [+ E3 {& G& {, M0 S) B② 获取访问 WMI 权限:$ n4 t, ~9 [; ^- J
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);/ N3 x, ^- z9 D( K2 }9 x1 Y0 e6 T, U
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。& r1 Y" Q5 [+ c' i1 q! E+ v: D
5 \: N# p; z6 j; H, o# m! U
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:- z* |1 ~1 v$ s1 K
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。( _% U" n. _& T& |
! h5 \/ F5 B: s& N1 N- v
void GetWmiInfo(TStrings *lpList, WideString wsClass)
  {  i. Y7 k% s( @# Q! Q{
- Q# ]. s% s/ }. N: u) p3 h  IWbemLocator *pWbemLocator = NULL;2 [/ {. c1 d! d$ T5 m
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)' h6 p0 M! O& {7 P6 S5 j
  {
' A! g# Z% h9 H     IWbemServices *pWbemServices = NULL;8 M7 Z6 t. i7 \: k$ D/ M
    WideString wsNamespace = (L"root\\cimv2");# A( V9 ^& W7 t/ o/ o
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
; c0 X5 T" u0 ?3 W6 _9 C: F* i* m      {
, x" g! Z) ^/ D: a& X        IEnumWbemClassObject *pEnumClassObject = NULL;
& \+ X' @: @8 T+ C2 e        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
) |& y6 B* l4 G& z8 j4 t3 U        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
' V- V4 o$ A5 i+ I( T4 h  t1 [         {
! ~5 h- q4 s: H           IWbemClassObject *pClassObject = NULL;3 q- L: T0 ^0 r6 C
          ULONG uCount = 1, uReturned;# {5 M& e7 K- Y! L+ q
          if(pEnumClassObject->Reset() == S_OK)
" `. D% t5 L. f* ^8 n            {
( ^( b1 |4 p) _: `- l& L) @              int iEnumIdx = 0;0 R  T* z8 T5 }1 }
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
# ?4 K0 g5 a3 M: c- ~/ i, y               {
# V8 F7 S. @5 R% J" }                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");+ }9 {( K$ R* l2 _
$ T% R1 i- o% o; m: G
                SAFEARRAY *pvNames = NULL;) D, X7 x% t. m; R" L; h/ T6 W# E
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)# y) l5 a$ R5 o6 I1 M5 V6 }
                 {
0 c  N* V8 v  o, P% X8 u1 g# c                    long vbl, vbu;
" o9 P# s/ d. t4 V7 Y6 x                    SafeArrayGetLBound(pvNames, 1, &vbl);
3 w: X0 F) m1 D* l- t                    SafeArrayGetUBound(pvNames, 1, &vbu);
) f  M) v/ |9 |+ A                    for(long idx=vbl; idx<=vbu; idx++)
+ j3 R& R" S- l# G! |* }. K8 s+ f                     {: p9 }/ E. q6 E
                      long aidx = idx;
; g/ o3 N7 [& u, s+ r' ~                       wchar_t *wsName = 0;; S7 v' J+ J5 _+ c# ?5 Z( u' j: S( ?
                      VARIANT vValue;
  ^0 V; Y3 q5 A& s  |1 a& N5 R                       VariantInit(&vValue);
4 j1 e2 N5 f4 w, d' b6 V2 A2 |. u                       SafeArrayGetElement(pvNames, &aidx, &wsName);) b& d) F8 S  i8 [4 E0 q
! n$ z, P% c" q
                      BSTR bs = SysAllocString(wsName);
, ?4 [. d  }. r- S                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);3 o$ Q. P% R, u7 W5 g5 B
                      SysFreeString(bs);
: q3 R: [7 s' [7 B. f2 N
. w- i3 v, M  d* Q3 u                       if(hRes == S_OK)6 E: L, }8 C: h; u2 i! V
                       {& a* b0 S+ W& k1 Q4 t
                         AnsiString s;. x+ _: _( }( s7 R% o. y
                         Variant v = *(Variant*)&vValue;
( d" `9 x' h& ]8 x                          if(v.IsArray())
6 T/ U  h0 Z! M% G. l                           {
5 l' e0 r  h: H6 n1 q                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++): |3 ~  o7 ^& j" v% `1 N- z
                             {
, C! T: m- C, n                                Variant a = v.GetElement(i);/ J1 o! a5 Y" t, y* |
                               if(!s.IsEmpty())
) N' I1 z& R  a5 [8 ?) f2 L; m                                  s+=", ";
6 |  b: l6 B% q) |3 c                                s+=VarToStr(a);3 z* p! ]- h$ w/ I7 Q+ ^7 v0 E6 G
                             }
* C* K# o! K" `! m7 G                           }- A, P( @4 L) v
                         else
0 S, l% O9 b8 E4 t- K: _                           {
: s6 o3 ]  N6 |& \                             s = VarToStr(v);' h  B  t- u- a- Q, o6 d" y$ k
                          }
7 T) B0 Y. j7 I) {% X% l                          lpList->Add(AnsiString(wsName)+"="+s);
" a" v8 Z) r2 E' v* A                        }& p: Z; b) ^/ a6 G+ ~$ w

; D% N8 ]# l0 m+ ^6 |  Q                       VariantClear(&vValue);
+ Q. W* H' f! ^9 C                       SysFreeString(wsName);
! K. \' v1 R( |4 ?: j2 I                     }& |4 l; u1 z& B
                 }4 u# v7 H; `. H! p" Z
                if(pvNames)SafeArrayDestroy(pvNames);1 v8 e( c1 C" B% ^! I$ y& l
                iEnumIdx++;
, Y$ k7 a# ]* j* ], a! D               }# V; Z, j$ u* f9 `1 W
           }
( E. a4 @$ d. y+ w6 j, @           if(pClassObject)pClassObject->Release();
. ^' s/ A: D1 ^( C4 O  i; a0 W         }
  N  B6 C1 X; L0 B  g        if(pEnumClassObject)pEnumClassObject->Release();
& @. z* v, d8 T7 C      }
3 E) M- {  X( y% g& N' z- {     if(pWbemServices)pWbemServices->Release();
. L4 l, y  q9 R6 Z$ D2 p   }: N1 @9 L5 ]$ [, Z
  if(pWbemLocator)pWbemLocator->Release();
0 \1 O# F3 [& s% S}3 |( M  P, L, ^. w, N3 p4 v
//---------------------------------------------------------------------------
+ O6 i. o4 e; ?# L
6 R7 I$ |1 X1 o0 ~// 通过 WIN32_bios 获取 BIOS 信息:
0 [3 H! G* L& U# a4 [void __fastcall TForm1::Button1Click(TObject *Sender)- ?* d: ^% S) ]" ~. ?; d, H- e
{5 c, {7 K5 h2 x2 I1 Q, H* f/ I
   Memo1->Lines->Add("================== [WIN32_bios] =================");
/ q" e$ B% h  Q$ G' t( K    GetWmiInfo(Memo1->Lines, "WIN32_bios");) I+ q: R% z. V) i: l% A6 i! f
   Memo1->Lines->Add("");
! B8 Y3 Z) ~' e9 ~}
6 _1 C; f0 r3 @" {6 B. l5 L; O4 z+ ^0 X, O! f! x5 t9 Y1 G# l$ r
--------------------------------------------------------------------------------/ y  ~# g% L: a

# ]( |6 n) L/ l* QWMI 可以访问的信息类型有:- k2 M5 r  w& h' {$ s
  Win32_1394Controller% M. Z) f9 W7 e; x" b0 z5 c: C
  Win32_BaseBoard, |9 m" v: s9 P, v0 z
  Win32_Battery
, A6 F6 R, k" L7 w# `   Win32_BIOS
" C' f- r5 f, b% w6 ^5 w! J   Win32_Bus/ q1 c7 E# i) U2 g% V
  Win32_CacheMemory
8 f! m& f. [7 S  T, `; S5 b   Win32_CDROMDrive& ~9 @; t6 s& x3 k3 y* q3 F
  Win32_CurrentProbe
8 Z" ~9 X5 A* U$ I# R   Win32_DesktopMonitor* o8 C2 F* z" p/ X. u7 J! h
  Win32_DeviceMemoryAddress
/ V! [- L( u1 X, C6 g/ e3 |   Win32_DiskDrive
% v5 n: }& ^5 \" P   Win32_DisplayConfiguration
7 K' F- M/ X2 q, x7 a5 _) v   Win32_DisplayControllerConfiguration
3 r" A% n' r  h; Q) a7 y0 |" v" T) `   Win32_DMAChannel- X4 H+ a; L# M3 w8 y. Q% x$ _. {' X
  Win32_Fan4 D6 s* t/ [0 v' x8 V, [  v
  Win32_FloppyController# l/ Y; Y  G& p) t5 G
  Win32_FloppyDrive
. A4 R* p, Q9 M1 D3 I+ a   Win32_HeatPipe9 y9 m, h  U' ^5 @) g
  Win32_IDEController( F3 T+ T. \7 z/ q6 J
  Win32_InfraredDevice
( a  w" K: ]; m3 R! }; d4 J7 W8 j   Win32_IRQResource
' c- P. X" l; l( X/ Z+ Z3 l   Win32_Keyboard" C) E" E' H9 S8 S0 e+ K
  Win32_MemoryArray
* P' @% G9 G4 Z+ C3 R% m/ l3 \   Win32_MemoryDevice( p1 A% Q3 h% [1 B, ^7 ~6 W
  Win32_MotherboardDevice
* ?. W7 ^5 E7 V* P   Win32_NetworkAdapter; ~, M; a' L. U+ V# @: h# L
  Win32_NetworkAdapterConfiguration
/ i* L7 m) J, S  C   Win32_OnBoardDevice
, Z% ~+ E2 z+ U5 B4 X   Win32_ParallelPort
, M  N" P/ Z/ {: j7 |* [0 @   Win32_PCMCIAController
( L+ `# K' m7 S   Win32_PhysicalMemory
, r/ M# d3 z6 n   Win32_PhysicalMemoryArray& b6 |  |+ j% k
  Win32_PnPEntity
, d) V+ F6 y  j+ s1 h6 X   Win32_PointingDevice$ U% x5 M% _, }( d7 r) e) p
  Win32_PortableBattery8 u* B9 b+ k- }- d& B
  Win32_PortConnector- g& ?  ?! ?1 d( T
  Win32_PortResource
& U) S2 @2 F- ~# N. Z0 ]; e# \   Win32_POTSModem
! m, `; d" a8 j   Win32_PowerManagementEvent( b! b) x* d/ \; ?# H' Z. I0 h0 X
  Win32_Printer. S' t5 u* P8 l& F5 V/ r
  Win32_PrinterConfiguration
1 t6 v- a0 p# V+ w4 _8 |  T, a* `* q   Win32_PrintJob; H- f% ^, q, y5 K! L
  Win32_Processor
: J& A' s& z, B5 r4 F* \   Win32_Refrigeration4 k, R" E8 K" F2 q0 C
  Win32_SerialPort
$ A# u6 z/ s/ ]: U$ o) v   Win32_SerialPortConfiguration; t# f! {; _2 t  H7 y4 @4 P: I% @) F' k
  Win32_SMBIOSMemory
7 V7 b) [  C- O/ E1 ~9 m   Win32_SoundDevice/ P! Q/ ^  X5 O
  Win32_SystemEnclosure& J- {' v6 p4 Z4 W3 U. u. ^
  Win32_SystemMemoryResource
$ |0 z# ?  B+ u   Win32_SystemSlot1 T7 }1 x, _5 u1 E
  Win32_TapeDrive7 E5 u4 i* F. T( U5 v& x
  Win32_TemperatureProbe
, q2 I& z/ U; Y1 S   Win32_UninterruptiblePowerSupply
8 G8 o' M2 C2 R   Win32_USBController( ?& ]" d7 @2 a- |7 z
  Win32_VideoConfiguration
5 s  q/ @. |, \6 `) X. L   Win32_VideoController
$ m' M1 X* k5 y! w# p0 c  Q4 ?* L   Win32_VoltageProbe% G4 P5 O7 V$ ]7 q( Y
" D6 t8 i2 U9 D; {/ B
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-1 13:55 , Processed in 0.105076 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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