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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
& t2 o! a) j1 H0 y2 ]3 `1 c+ u4 X1 D3 H  ^! A
# a4 x" A/ d  Q9 U4 L. T: C: N
--------------------------------------------------------------------------------. ~3 o: t, [- `8 T
WMI: Windows Management Instrumentation (Windows 管理工具)
% T' l5 M3 U/ I4 ^. r$ ~& h! f6 z7 ~   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ) Z) P9 {& ^3 f! W! M
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
0 r) ^2 J8 s( ^; l" r1 `8 d0 P   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
9 [' {: L3 _0 {9 k( t& I( N" O8 T  t% U. @' @  i
--------------------------------------------------------------------------------
0 {# S5 w; {* M: IBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
& ^, _( h' o! i, y/ ?% c& k7 g2 P
* J# O% f# q6 t, C9 i--------------------------------------------------------------------------------( o4 |1 w* M8 Y2 T) l+ `  g
① 初始化 COM 接口:
3 G2 X* Z! ]- O# Q* c) m   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
) G  j% A& G: ^# i# ]/ \   这两个函数在 #include <comdef.h> 里面定义。: i- _! m( d3 O% @8 a% r$ }
1 e2 V/ Y' H* e: u, l) O" u- }+ x9 Z1 h
② 获取访问 WMI 权限:
/ L" ~* S" L6 x% A# D   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
! B# l( e+ K; N! i& t   如果这个函数返回 S_OK 获取权限成功, 否则为失败。& _: h& x# T# B9 X! W5 u
$ y% T5 v4 f& l: l' i8 r; M# i
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:$ n( q! @# x) p( [# e( O6 R
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。7 J8 o! N& a, @* A9 H* V& ^7 g
( h" [2 H8 w- E0 ]! G
void GetWmiInfo(TStrings *lpList, WideString wsClass)
3 C5 i% r& j  s: M{
: T) `0 ]( ]* r  IWbemLocator *pWbemLocator = NULL;* O5 y8 Z  @$ |  t5 |6 X9 e5 C2 ~
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
0 l5 N1 w& ?" v   {4 Z9 N* `6 B. f/ |
    IWbemServices *pWbemServices = NULL;6 |/ i5 a6 C6 U  x2 O: h/ |
    WideString wsNamespace = (L"root\\cimv2");: r) A, a( \/ m7 z+ i0 ^
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
7 X/ \/ f3 F, y      {
* `2 S# V/ O1 @. A, E5 \        IEnumWbemClassObject *pEnumClassObject = NULL;/ P8 W1 G' _8 o2 b0 c( _3 g; n5 \
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
9 d: M* i0 I# U0 S0 u6 Q        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)% s3 f+ v6 R+ b7 T  U1 u6 ?
        {, M# Y! M0 V( |8 X8 a4 k
          IWbemClassObject *pClassObject = NULL;- B/ W- u( z8 _% q! }
          ULONG uCount = 1, uReturned;, S: b6 r( O/ G$ i! f; f
          if(pEnumClassObject->Reset() == S_OK)% G2 U! Q; x4 ^3 k1 s9 ], l
           {0 Z9 T* @$ Q" k- {/ g+ t( O# J
             int iEnumIdx = 0;
. c0 o# G2 C6 S" ^! }+ V7 }7 R              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)! |! i5 d6 B0 K6 o
              {
- L" p$ J. L% d, i/ ~: i                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");! v  @, _  o# J9 S
$ @4 c, }# R) I% u" g) h- ^* ^
                SAFEARRAY *pvNames = NULL;
7 E7 h# A2 u- h+ A                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)* _; l, h7 ^) s6 {5 h
                 {
  z. p$ ~, A) @4 v, }                    long vbl, vbu;. q2 n9 r: [8 o  \& O* O
                   SafeArrayGetLBound(pvNames, 1, &vbl);
" n" i* l' _- B* A) Y" S                    SafeArrayGetUBound(pvNames, 1, &vbu);5 Y: q4 N# z8 l; g" g. W% H
                   for(long idx=vbl; idx<=vbu; idx++)
8 k. u* `, T; W: y                     {2 A4 {" f' T* D
                      long aidx = idx;
+ m9 D2 B, ]( D( x                       wchar_t *wsName = 0;
2 X1 I  N2 C' x  g. T9 y                       VARIANT vValue;  b" u6 s2 X% ]' q: a- j/ s
                      VariantInit(&vValue);( Y# p( \# M" O" ^$ n$ L
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
- e% p6 O  E1 B" N# ]
6 p  o' R6 f0 e* h9 l/ A3 g                       BSTR bs = SysAllocString(wsName);
: R% s; p7 _) L! s2 _                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);& H& s' _4 ]1 `+ @) l; `+ w
                      SysFreeString(bs);
3 `7 k7 k6 F6 x9 g: G  H, v. ?/ r7 f+ k0 X$ F$ E' p, W
                      if(hRes == S_OK)
1 e7 y7 b4 N+ w$ J                        {
# X1 F9 {, z0 j' c) p" x                          AnsiString s;' k4 ~% T2 q% ?2 j: `' w" |
                         Variant v = *(Variant*)&vValue;
  Q: K) @8 N  @. q1 m/ a5 {                          if(v.IsArray())* m& o" F; O) m4 _# h& G2 Z
                          {9 y; W$ F5 M/ X
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
- J* j* h& [* g                              {7 _7 O* v2 a6 r1 u. E2 U
                               Variant a = v.GetElement(i);
1 U5 I' L  T- u) m* q' P                                if(!s.IsEmpty())
" h3 R& z' N+ A, k) u                                  s+=", ";
$ i7 n6 |& e2 X, k                                s+=VarToStr(a);& a, b9 R" K( a5 d  D- I1 @0 W
                             }/ t& S7 y! N1 J1 T% [
                          }
* I0 g% w: i4 p3 Z                          else
1 w' H/ h# X  ]+ M+ c0 [7 x3 w                           {- v# I: ]- H0 C* u( }. O
                            s = VarToStr(v);7 d% h6 r! ~- z% l4 M
                          }" {; M  z; E8 i2 K
                         lpList->Add(AnsiString(wsName)+"="+s);+ D- A9 r+ w; b1 t( W0 W0 F  |
                       }
. {0 {" h; M8 D; ]5 |
! _- g1 E; D- R% M2 \8 K                       VariantClear(&vValue);
/ M' I; ^1 ~& t! [                       SysFreeString(wsName);
# u, J3 U' l$ x8 M8 O3 g6 m- W                     }! j1 R  a0 U( k
                 }# ]/ G  y) g9 k: ]! f; L
                if(pvNames)SafeArrayDestroy(pvNames);
. f1 c% z% L1 k4 Y                 iEnumIdx++;
, j8 ^. k" ]" y$ C5 R" x8 a" {' n               }% R% N; I1 B' L2 {. L
           }% H1 Y# w/ G% I3 e  k
          if(pClassObject)pClassObject->Release();) E6 f5 ~+ z- {, O) J
        }
! r7 z8 M* O$ h9 [! X2 ^        if(pEnumClassObject)pEnumClassObject->Release();7 \* `( G3 V% d3 ~
     }
$ p$ `7 M- T: D2 X- O     if(pWbemServices)pWbemServices->Release();" k6 K9 j* N; N$ }
  }3 B, z+ P8 U- w' X  C+ u
  if(pWbemLocator)pWbemLocator->Release();& H0 M$ f2 G8 q+ `8 Q
}
6 e* P! T+ @5 [//---------------------------------------------------------------------------+ q* T' p4 Q5 H: r. [) s
1 k- Q/ Q) ^5 B. L" F4 r
// 通过 WIN32_bios 获取 BIOS 信息:
6 l: @! [- T- F4 ^7 G  yvoid __fastcall TForm1::Button1Click(TObject *Sender)
+ \' I4 \4 R/ N. v7 ~- b/ o7 J{7 n* q* o  M% g6 w1 x6 E' P. J) U. q
   Memo1->Lines->Add("================== [WIN32_bios] =================");
; O) c, K7 Y$ s/ v3 P& i    GetWmiInfo(Memo1->Lines, "WIN32_bios");3 n- c2 J+ y0 m- p% \) X( D. c
   Memo1->Lines->Add("");5 v7 j% K: c' I0 O5 L
}
2 G* u: x/ w3 \6 B! Q- ]. B2 r( ?
! Z6 ~# a! a; l, M5 t* ?--------------------------------------------------------------------------------
* F7 k4 T1 h. Z; K1 o
; x% Z, l6 G2 vWMI 可以访问的信息类型有:! Y' `8 H5 U4 r6 q6 W% e, u
  Win32_1394Controller' z% {, x$ H3 d
  Win32_BaseBoard1 k0 r  B8 v4 p# J% l( @$ z+ L
  Win32_Battery
* V. _8 H& w, D; g; P% M, [   Win32_BIOS
7 ^# f3 T# \+ J   Win32_Bus' }8 y; k9 X/ z' b7 P5 v: T
  Win32_CacheMemory
0 D+ j6 A- z. `5 e/ Y0 O% m   Win32_CDROMDrive; z2 H! ~) A% T/ _7 ^+ y' [
  Win32_CurrentProbe7 Z& {% Y  e9 _. I5 m  Z1 w3 }
  Win32_DesktopMonitor
. i2 P8 z0 H/ p5 R   Win32_DeviceMemoryAddress
6 y% d7 \. n: b7 O' }/ i7 T) ^0 G   Win32_DiskDrive/ u" D; L% X) g# X' }8 I2 H8 A& x
  Win32_DisplayConfiguration
# K$ ~1 C0 P. A( z   Win32_DisplayControllerConfiguration
4 t/ }, i/ v! a- W6 n. W   Win32_DMAChannel( Z9 e- W5 v4 F, \2 K. ]# h( C
  Win32_Fan5 Q2 {" A- l* `6 l$ s
  Win32_FloppyController
% ^$ ?+ \& [$ E! D% q9 C   Win32_FloppyDrive5 f4 d% P" ?" T7 a
  Win32_HeatPipe9 V4 N  a8 v5 L3 K' ?( t, \
  Win32_IDEController5 Q6 b" G( R$ F, n
  Win32_InfraredDevice$ W& }& t* F) n2 T
  Win32_IRQResource
5 N9 f% \) x  N$ }* \   Win32_Keyboard
5 S( Y. ]! l! B8 }   Win32_MemoryArray' e" s4 n; ?2 m* S) u! I: H
  Win32_MemoryDevice* S2 J% _  T  H4 E4 p# D  Q: ~
  Win32_MotherboardDevice+ J- B6 _1 {, |5 ]
  Win32_NetworkAdapter; z3 z  W1 P' h# J+ ?
  Win32_NetworkAdapterConfiguration
8 r- B7 q( @$ }; P   Win32_OnBoardDevice
0 q& E& h# G% O/ ?* p0 M6 M9 e! {2 H   Win32_ParallelPort
6 r% ^3 r8 y. P: s1 b& E   Win32_PCMCIAController" P7 F3 E0 F% |6 R! c' [
  Win32_PhysicalMemory
8 O$ Y$ n8 f5 `0 R7 B7 U' W9 W   Win32_PhysicalMemoryArray" o8 i+ {/ _* i: L# Q
  Win32_PnPEntity
( J/ q! D% t. A" S; d" T   Win32_PointingDevice/ Y' |' I' K- {6 J. r
  Win32_PortableBattery7 O3 D8 [, E9 h: X6 p* o& G" t
  Win32_PortConnector
) o- |2 C8 X, L& {6 j; R   Win32_PortResource
, W" F0 _5 g: M   Win32_POTSModem
$ Y2 @# N" J; Z4 W( L   Win32_PowerManagementEvent
2 f1 d' @7 S# s# V' I* J  k+ e   Win32_Printer
4 z+ T* t- f/ r8 m2 P4 _6 h   Win32_PrinterConfiguration
3 O# H. E, _9 @, e! b/ ~- f7 _. I9 P   Win32_PrintJob  _; h4 ~  u+ J: g+ i5 {& S' j
  Win32_Processor
3 r9 _. E; g3 v0 e; |   Win32_Refrigeration
: i8 w( D# `) X: g+ G5 d   Win32_SerialPort
# x' A2 p3 C  u   Win32_SerialPortConfiguration& U9 t( _9 U/ D- Y- V
  Win32_SMBIOSMemory
. t( L7 ^7 z% O7 h' c8 P   Win32_SoundDevice
0 m" {; S& r* ]3 {   Win32_SystemEnclosure. T5 d- z  z. F& e3 x/ f/ G. b
  Win32_SystemMemoryResource
. @1 k* D* Q# L2 L   Win32_SystemSlot
. Y; f/ R* Z! C$ X, O, ?# G" L0 ?   Win32_TapeDrive, r$ X$ Y$ @& q  O, ^  @
  Win32_TemperatureProbe  p' n, \1 h6 d# \: A0 X
  Win32_UninterruptiblePowerSupply% W: J' @7 l* Y$ u. e' K  b! K* j
  Win32_USBController/ j; o2 ^4 r! ?3 y% u: r
  Win32_VideoConfiguration4 z# e9 U. f9 f7 Q, d8 t2 U$ V
  Win32_VideoController
% C+ r% F$ [2 u   Win32_VoltageProbe" T7 P- Q  _: r1 u
0 W% g8 c9 H4 k; G/ G0 X
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:56 , Processed in 0.018468 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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