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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
6 a  Y; Z$ q- ^* ^3 N( m6 Y) e/ g
; t" \: K9 X: u# L6 o) m! ?0 e" Z
--------------------------------------------------------------------------------$ U0 w& {. {# D# ~
WMI: Windows Management Instrumentation (Windows 管理工具)
6 n) d. G/ V" V( M  |; F   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
& w; X) t) n5 n5 N0 y' c, X3 q   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
6 y0 N0 {6 b- v4 W2 c( p   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
& m! l# J* a2 z3 x8 a. q1 O# N* D2 N  R$ a  W6 Q- [
--------------------------------------------------------------------------------) I! ]: H) o5 w% O' b5 f% L
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
) w5 M7 `3 p' e; a4 a
! \5 k7 [! t( B: [+ u7 q--------------------------------------------------------------------------------, m; ?9 o) ]0 e
① 初始化 COM 接口:- |% b+ Q6 R4 A; ?1 G; `; D* r
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
: X. V; p1 w5 Q! N+ L; K7 T   这两个函数在 #include <comdef.h> 里面定义。
& f: Y- Q7 K' u9 r! h8 k4 [9 }8 a9 p! G- B+ B3 r9 ~
② 获取访问 WMI 权限:& \5 n7 |. e0 h4 z) V
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
. o3 U: Y( \! a- q5 e   如果这个函数返回 S_OK 获取权限成功, 否则为失败。; J% Y0 C) P4 o

1 s- k) k# ~) U2 Z" v) X③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
0 S- V. I/ R# {5 |$ b4 z   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
" |: r8 a8 |- [8 A! z* r6 M/ Y/ U- {$ N; L& p+ V% c( }/ m1 a3 f
void GetWmiInfo(TStrings *lpList, WideString wsClass)
1 H. R$ q6 U& A8 O- n8 @{
; ?; h. b; n2 ^: F+ c$ V  IWbemLocator *pWbemLocator = NULL;* [" I; |8 g5 f1 u1 k) j
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
, t* ]5 g+ ?4 g! c( |0 U. }   {2 W* j! m6 p% T8 ^
    IWbemServices *pWbemServices = NULL;
) @# ]: L- D5 w# s; f5 r0 W% W8 w     WideString wsNamespace = (L"root\\cimv2");) v% D2 F1 f" e6 [: y, a2 E, T
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)" Y$ M- D% a2 k6 y( m
     {
4 e: H2 l0 r( B2 h5 Z        IEnumWbemClassObject *pEnumClassObject = NULL;
8 p' ?1 b% T& J4 P6 [        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;+ a6 [6 V1 x: j1 b! P9 c3 R
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
1 w8 v/ [. _& d         {! C0 a' P8 |9 C* W, L
          IWbemClassObject *pClassObject = NULL;
. m& h; A* Q" a! o) n           ULONG uCount = 1, uReturned;. m) x5 U: Y4 r2 L! m1 V2 m
          if(pEnumClassObject->Reset() == S_OK). l9 H! Z# [. s" J) n
           {
% Y, m  X  H, \% u              int iEnumIdx = 0;
4 c% e7 B  r6 |, z$ ?0 D8 z              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK): J: Q( w" u6 m( L+ u2 c. N
              {" w8 U/ d% E# a) e
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
, g% U' C, u6 r7 Y) @
# P7 n5 `0 H) N" H  h/ P; B2 O                 SAFEARRAY *pvNames = NULL;7 H" |! C) U  j* d: h
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
1 w) [$ S3 X( W; I+ P( n                  {: y5 L* J- }+ T- ^9 h3 w* j. D% P
                   long vbl, vbu;
  `, L) [0 M% X                    SafeArrayGetLBound(pvNames, 1, &vbl);. o* p$ U7 B, ~( A# z
                   SafeArrayGetUBound(pvNames, 1, &vbu);
. }- H, _5 @; [- H4 q                    for(long idx=vbl; idx<=vbu; idx++)
6 e4 Y( M+ j  I9 p5 H- f& C; S                     {3 C, O( @" @1 a, l/ J+ m
                      long aidx = idx;
4 u- b; L/ q, [& u- i                       wchar_t *wsName = 0;2 ], M& ^3 V: n9 a0 J) v% }) z
                      VARIANT vValue;
- K9 |4 N. G9 z8 z$ p3 r                       VariantInit(&vValue);
3 G" v0 A6 t6 `                       SafeArrayGetElement(pvNames, &aidx, &wsName);
& i& M: z$ t% y3 S' J9 [) P  d2 |, Z
                      BSTR bs = SysAllocString(wsName);
. c, h7 J/ D1 p  I& M. \                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
; o, V5 O1 p  ]& @( g/ ~* ?# d. G3 }                       SysFreeString(bs);. Y/ M+ D# ]! z8 M0 W! K& p/ l4 c  m

7 M, O+ [' [. o# c4 z, @" x( @# \                       if(hRes == S_OK)
: H  h1 P# U3 [1 i2 R6 t                        {* k9 Z& @7 R# B
                         AnsiString s;# ~/ ^+ Q1 l$ ]* E% n* s
                         Variant v = *(Variant*)&vValue;
) y) H7 o/ ~6 P: i1 U0 E+ H                          if(v.IsArray())) t" T" T( L5 T) k3 B
                          {7 G. b; N+ N  V8 B* ?, Z$ t0 j
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
: @& g; h- {. k! E. f* T# C                              {) ]1 i6 Q$ G) `5 i
                               Variant a = v.GetElement(i);
2 q/ I! X2 p" p0 c1 ^" B                                if(!s.IsEmpty())9 h$ y) Z! j* \) U6 \+ O
                                 s+=", ";4 _5 ~5 Z6 h& v! P  X: K
                               s+=VarToStr(a);
# C- O  H' e; Q                              }
2 I6 l& t5 ~+ }0 s! ~/ l8 \                           }8 m) }, y$ C% |8 F
                         else2 Q6 Q4 X6 @# ~" x1 m) w' ?9 i
                          {
3 p( [$ J' n3 F                             s = VarToStr(v);& i3 v1 _+ C# s  N' }; }
                          }) D' O% s- H, @% O2 V1 F$ E
                         lpList->Add(AnsiString(wsName)+"="+s);# c% a7 @& o: @- Q& k4 j9 Y. p- j
                       }
1 V/ N8 J/ [; X3 E8 M) p3 ~* ]; m! T
                      VariantClear(&vValue);1 J1 f, K7 P+ F; y
                      SysFreeString(wsName);
9 Y$ u, c9 L  L: O                     }
" }. b% b4 X& P& D. }$ z                  }
, H8 |+ X7 d& X% Z& ?                 if(pvNames)SafeArrayDestroy(pvNames);: K  I6 F2 v9 l3 ]/ _. p
                iEnumIdx++;8 @5 p9 ^8 r; Y  m- L& B
              }% ~; \! U9 b* b. K& d/ z( Y
           }% ]% T5 s3 m4 ?# ~6 H
          if(pClassObject)pClassObject->Release();
7 ~, o. F$ G( N+ j         }* q5 e4 T6 h9 _0 l! f0 D
       if(pEnumClassObject)pEnumClassObject->Release();. S7 D8 Z; D$ Y. p
     }
- t& ~+ [1 ?% _! l8 x) v     if(pWbemServices)pWbemServices->Release();' a: g( w7 e6 N$ G
  }$ h- m  i; ]  ~7 }: O
  if(pWbemLocator)pWbemLocator->Release();
5 t% w) I/ @% C! \3 l}
$ B4 \+ _$ r9 U$ g# _- W//---------------------------------------------------------------------------& x) N6 x: }  ?
/ o9 `7 o& P7 N! r% g/ @: _
// 通过 WIN32_bios 获取 BIOS 信息:6 y) P' J! f, @& X2 }
void __fastcall TForm1::Button1Click(TObject *Sender)
9 D4 Z3 @" K" L) [3 T{
# F& y6 ~+ M: I- S. b    Memo1->Lines->Add("================== [WIN32_bios] =================");
2 V' y2 F, u  u: z8 G    GetWmiInfo(Memo1->Lines, "WIN32_bios");6 n# i8 ?, X2 z9 ?
   Memo1->Lines->Add("");
1 l+ w- o' |% o1 V; y5 A* c}
  g. Z2 D/ y% v( ^* x1 X5 f* w8 d/ R- @
--------------------------------------------------------------------------------
9 a8 O1 Z+ f# p( {& S' P. C0 F0 N* @2 n7 |0 }' r
WMI 可以访问的信息类型有:
7 U# T8 M  ~) {0 T* \   Win32_1394Controller
) n. z2 Q8 J$ b/ e/ O6 N  E   Win32_BaseBoard5 G; A) L# n, w  \
  Win32_Battery
" N& F+ J/ \  W4 w8 r% g7 |! K   Win32_BIOS6 w8 s( Z( e1 p" `: X
  Win32_Bus" c/ t8 f6 u! U' u
  Win32_CacheMemory
6 X: y$ N* _( h0 U9 Q/ D   Win32_CDROMDrive' d7 u5 J. P  B& c5 _! \0 x/ G
  Win32_CurrentProbe
) [) @: ~, `* Z- e7 a9 D5 [+ i& G6 `" ^% L   Win32_DesktopMonitor
! C* E: D  x; T& K4 n& P6 d   Win32_DeviceMemoryAddress
/ M: {5 g0 A0 S+ d" }2 e   Win32_DiskDrive
- ?3 ^* i. O. r4 q' j5 G, N   Win32_DisplayConfiguration
( m' `& H% _3 g, u/ m6 ~# X   Win32_DisplayControllerConfiguration! E8 t( `$ Q" R6 w8 r0 x# ^" c  Z( e
  Win32_DMAChannel$ [. X' Z% R4 |" e' E
  Win32_Fan
  H" W% }# Q  c6 [   Win32_FloppyController
, R# R3 @9 G9 ~8 ^0 c   Win32_FloppyDrive" q6 m$ W# {) l& F2 ^8 l
  Win32_HeatPipe
! G& v3 W- Y$ u" f  `- V   Win32_IDEController0 @$ V8 G$ X( b: Q
  Win32_InfraredDevice
' u" W* p4 j; v: y   Win32_IRQResource
  O& F$ T" D+ F! T   Win32_Keyboard+ [; u( J. t# E: E$ ]; v
  Win32_MemoryArray
3 ~* w' _# B1 ?   Win32_MemoryDevice
  W  D$ u7 I9 |4 S8 W" S   Win32_MotherboardDevice
0 w" J# ^( Q4 ^   Win32_NetworkAdapter
' k9 K! t" C& R, a) A   Win32_NetworkAdapterConfiguration
! P6 x& |. A/ d/ U8 n: K   Win32_OnBoardDevice  r9 B6 N% x7 p5 I3 C7 X" y
  Win32_ParallelPort
1 Z- V" M  Z/ `" }5 g   Win32_PCMCIAController
3 s: M" M1 V4 U( E, t( v: O" H   Win32_PhysicalMemory
2 w. Z* Y. Z- p4 B5 F5 F- T' p* q* ?   Win32_PhysicalMemoryArray* E+ Z; ^% b, E1 ]0 i
  Win32_PnPEntity  H6 x0 j) O( W
  Win32_PointingDevice! v2 o: q$ q- U' C- k& o
  Win32_PortableBattery' x. D( I$ y& J1 D/ U7 T0 t( `/ W! _
  Win32_PortConnector3 v; O+ c2 u) K) E9 f! M0 ^  U4 N
  Win32_PortResource
& l# _7 N6 [# V8 W2 m4 {  {! l9 {9 ?   Win32_POTSModem- }- d( n' n# T; u7 F) L! ]; p8 x/ t
  Win32_PowerManagementEvent! s5 D/ ^1 ?* g2 C; f  \
  Win32_Printer
4 y1 N3 Y. F9 i7 [   Win32_PrinterConfiguration
% R3 k* ^7 ?. `* v   Win32_PrintJob
( i  {7 e9 m! h   Win32_Processor
+ R0 \& T; I. c* ~& |+ ^( Z   Win32_Refrigeration
/ ^' @, E0 L" `. k, Z. ]   Win32_SerialPort' y$ H* k9 Q6 ^: h$ L
  Win32_SerialPortConfiguration4 m: S; W8 w- |# O2 Q
  Win32_SMBIOSMemory. A) x& Y1 x. _3 L; ^% B( ]5 ^% Q7 k
  Win32_SoundDevice( P$ [1 w# D9 H4 M+ o
  Win32_SystemEnclosure
( I- J% U) W1 N: v   Win32_SystemMemoryResource, g- ]9 u: [+ {* O  O# `8 A
  Win32_SystemSlot
9 S( G+ t+ ~3 a! l6 i   Win32_TapeDrive" S* g; z3 _+ ]; F
  Win32_TemperatureProbe
8 B% X  ]0 H8 g0 ~$ M$ q   Win32_UninterruptiblePowerSupply
' k6 g8 k8 p( P9 v5 c% P! N3 I   Win32_USBController9 d& h: s0 }, \. t# B* S& C6 ^- ?0 e7 v
  Win32_VideoConfiguration
: G5 L; t1 u. T) Q2 T# }$ e/ g   Win32_VideoController
. ~. R& O% ^1 f   Win32_VoltageProbe
! P) Z9 J( h6 K) f$ H/ B
* X( O% d- Z" j# W! [3 h以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-12 17:00 , Processed in 0.050675 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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