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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)8 K7 G) x3 D6 }0 r9 ]2 W* @

$ y2 B# k. D. q
- ]3 {. ~' ~6 \5 q0 F" G/ b! Z--------------------------------------------------------------------------------
( d# F+ k% D; g9 \2 eWMI: Windows Management Instrumentation (Windows 管理工具)
* ]4 s5 O9 Z) b4 A, O8 q) {% Y! @   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
2 r7 j6 ^5 |7 D   利用这个工具可以管理本地或客户端系统中几乎所有的信息。& U' G+ o  V+ g+ K* p8 V& h4 J2 R
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 0 c8 R5 n9 c% \' Z8 I

" Z8 K9 K5 O' Z/ i--------------------------------------------------------------------------------" E4 ?1 L% P, o0 r0 V' y, F
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
5 _2 T& D: d' h. _4 i* w- I( u9 g3 o6 F/ U% Y
--------------------------------------------------------------------------------/ }2 ^; A+ x& I. s
① 初始化 COM 接口:3 L9 i7 |- {2 y
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
: ]0 x4 D6 ?+ ^2 q   这两个函数在 #include <comdef.h> 里面定义。
% [2 L" x4 @9 P* Q4 Z; U5 u+ M: |& C
② 获取访问 WMI 权限:
; u  n4 F$ X( _1 z) K$ c  d   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);9 R% @4 x$ B9 h# ~
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
9 y0 K9 u2 {* m
# A. |! |8 b3 U7 e, I+ V  ^% Q③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:2 Q7 \" e& ?  s5 N9 U
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。, }$ N( i4 V$ p( H* I  p( o

5 ~( Y' z6 H1 k$ v" kvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
0 x# E- O' G2 ]: @, W{2 g9 W8 b4 Z7 \5 @5 |; r7 T& L
  IWbemLocator *pWbemLocator = NULL;+ k& a# y" n1 t4 n3 b; R
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK); M) P& v1 ?3 m- E8 a; p
  {
6 p! h( v+ ^) ^' o     IWbemServices *pWbemServices = NULL;: {& k) t$ n9 \7 N* G7 z; U
    WideString wsNamespace = (L"root\\cimv2");: U& {: g+ P; O
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)& F1 q  r6 |3 x+ X* h  T
     {
: H  g8 r- L" h% o1 B0 o        IEnumWbemClassObject *pEnumClassObject = NULL;
/ @, o$ v0 A$ r, W- b5 v2 k3 ?1 H        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;( t) a8 E. F3 l, @- H" g. c' z4 E5 r; z
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
) }, K% B  }9 ~* g1 C6 ~2 i, Y         {
. [5 F: g4 J+ s3 D0 N  m6 X/ Q           IWbemClassObject *pClassObject = NULL;# a. ]1 s6 S* v- {# h: A
          ULONG uCount = 1, uReturned;( z  P6 d3 U. ^' H. I& }* }% `! N
          if(pEnumClassObject->Reset() == S_OK)
: r4 B* b5 U; c7 d/ S6 F1 n# \            {0 R) M, d- {8 s3 q- k; j
             int iEnumIdx = 0;6 B6 N! ~) d' r5 K( M+ }
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
% h; A- S  D9 t' X# f& H! ?) z               {# Z, @' ]. `6 T6 n7 Q
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
0 W" n4 b/ l6 D/ q; o' P- G: Z. L. V2 D- E
                SAFEARRAY *pvNames = NULL;
# b, P5 l* [4 d* D0 G! U- ~                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)  q! Y8 u- v) X: {$ f
                 {( h' N" G: E+ d+ F7 N( a7 _
                   long vbl, vbu;
8 o: |5 R3 z1 `5 l* U' u2 ^                    SafeArrayGetLBound(pvNames, 1, &vbl);4 B2 {' q3 H% _$ u9 L9 k8 _
                   SafeArrayGetUBound(pvNames, 1, &vbu);. a0 g! [; w% Y
                   for(long idx=vbl; idx<=vbu; idx++)/ Q. e( q4 h/ J  S( w
                    {% `( w0 Q3 l2 f  ?, }; |
                      long aidx = idx;
. q9 p" E8 O# @' M                       wchar_t *wsName = 0;8 B1 Z; I2 j1 D! r6 ~
                      VARIANT vValue;% l& H7 N, q# e6 E8 E0 G2 f
                      VariantInit(&vValue);1 m$ ~& _! Y2 w4 e. I& _( O
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
( m3 I8 ~7 Z( z( D! c/ V; z
  d# j" j' ]' q6 p                       BSTR bs = SysAllocString(wsName);6 i: ]: d% w! g1 j+ `3 {, l# v* T
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
1 F: _2 s8 R- s$ i                       SysFreeString(bs);
5 W# w; A% f& R
' w+ z* M3 e3 v5 H                       if(hRes == S_OK)4 K: g; T# s, A& B$ Z
                       {
$ P- w- X  ]( f0 V3 L8 S                          AnsiString s;4 ]5 ~. @8 U5 l: ]- W) I# z
                         Variant v = *(Variant*)&vValue;6 q# P0 O3 \  c! ]& k
                         if(v.IsArray()). o4 L0 x1 V( Q5 i
                          {/ x: V, A0 F2 H% ~. H; ]5 r
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)1 V3 D" C" \# {
                             {8 X; t$ K0 N; j
                               Variant a = v.GetElement(i);
* j& M: u% W$ {8 V, r                                if(!s.IsEmpty())
3 i5 Y  [% V6 z; H6 e                                  s+=", ";
+ z( c" x; G0 {. Q# c! D) C# O                                s+=VarToStr(a);3 R: I" m) q' v* R" g9 n4 ~% o5 Y1 W
                             }! q( R2 r# Q. [4 y( d$ x6 W
                          }/ ~+ {1 x+ _  L" x* a/ m3 A" \
                         else
  V& Y* \2 a+ T& _! I: J  l                           {
% P" q$ r" {% u  e0 M. W7 R; Q                             s = VarToStr(v);! J. e/ _0 @) I* Y' p1 h$ d
                          }" M; v+ A8 J7 H# k+ n" a2 w
                         lpList->Add(AnsiString(wsName)+"="+s);5 a1 U' i* C7 y$ Z
                       }
" Z) k: u. O7 X" c& l! g0 e' P2 b4 @* n, T% Z" `, s
                      VariantClear(&vValue);
' f. `6 _+ p0 `; m                       SysFreeString(wsName);
2 T9 i6 T* |7 m: J, l0 }                     }
4 p* M  P5 C8 U9 ?  Y( [7 I                  }9 N+ a+ O: ?. W7 G1 ~+ ?8 r& D  r
                if(pvNames)SafeArrayDestroy(pvNames);- j9 E3 `7 N. l- O( b+ N+ {
                iEnumIdx++;* A% ^* @" c9 k9 \
              }* O' J  v3 ~& b1 H% Q
           }) H' r' B& W+ E2 K0 [
          if(pClassObject)pClassObject->Release();
: L3 g9 u/ q5 s         }( ~8 h% D2 a  h- F' W
       if(pEnumClassObject)pEnumClassObject->Release();
5 T" ]/ a7 ?( J0 l8 b      }
0 Y. A: o# X& ~0 c% B     if(pWbemServices)pWbemServices->Release();
/ P  a  e% R% t   }$ ?' B8 r2 Q% S# @- b" z  p( L; l6 H
  if(pWbemLocator)pWbemLocator->Release();  A: A8 I4 s6 f7 Y1 O1 S
}- j. ?' G) F* U  b, p- M1 N
//---------------------------------------------------------------------------
% n& U* K2 |. `! W$ s. t1 ~" l- M# n8 _1 [* A( n6 k
// 通过 WIN32_bios 获取 BIOS 信息:' ^3 x! c- ?2 h3 y
void __fastcall TForm1::Button1Click(TObject *Sender)( ?! Z( r& ~: b( }5 V0 k9 y
{
- n- J; H  c% H6 U6 x+ M    Memo1->Lines->Add("================== [WIN32_bios] =================");) X; g: \  o+ x, v1 q$ i
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
0 V7 E, B. O" L2 Y$ U/ o- y    Memo1->Lines->Add("");/ B' Q! q3 b5 F* v0 e3 s
}7 o7 w; |0 y6 U* b$ c/ c: Z+ U
+ C. w; y6 N0 T) x6 e: l0 J/ I
--------------------------------------------------------------------------------4 p3 E) o0 ]% e3 @# G$ b3 ~
  A+ Z$ c9 p/ Q1 |( N" M
WMI 可以访问的信息类型有:1 x0 r/ G9 K& e
  Win32_1394Controller& ?5 c8 U# C5 n
  Win32_BaseBoard: ~- T6 M; {4 I: W
  Win32_Battery
/ Y, f! \- n, ^+ B8 G  S   Win32_BIOS
' ]) X* y  d/ Q2 S# N   Win32_Bus; X9 ?8 [; z# P2 w
  Win32_CacheMemory1 y7 r, A3 E+ t# r: ]
  Win32_CDROMDrive7 x  \' |4 m% P6 ^/ t- c
  Win32_CurrentProbe
+ d9 F8 `( `' S( U7 X   Win32_DesktopMonitor& K* W- r7 C1 H' _, h) W  Z" M, X
  Win32_DeviceMemoryAddress
9 }" R- }+ U! p   Win32_DiskDrive. ^0 F1 F& y6 v% {
  Win32_DisplayConfiguration. g, _$ ?! l: F# y) `
  Win32_DisplayControllerConfiguration' Y) e4 D: Q' `2 J+ F/ d
  Win32_DMAChannel
3 y: q, V( S# B$ f' g7 a4 {1 M" _   Win32_Fan3 U: [: B) S/ ]$ ~- C+ r
  Win32_FloppyController
+ A% h- ]& I$ c1 ?" n, ]/ o   Win32_FloppyDrive
" _2 W, m8 J7 J   Win32_HeatPipe
4 |1 H: m/ n0 ?9 e   Win32_IDEController
, C3 y9 A+ S* ~: O2 R   Win32_InfraredDevice
2 H3 @4 |5 y. ]1 h/ u- W! G1 T   Win32_IRQResource
/ E+ y' O* B  F+ G   Win32_Keyboard
- l0 S8 e# h: s& ?% M   Win32_MemoryArray, x0 i# r5 W7 G/ Y6 Y  P
  Win32_MemoryDevice
  l3 q; W' p& r8 o   Win32_MotherboardDevice
9 D, B1 q$ z" ^( M% ]% [5 `+ _   Win32_NetworkAdapter7 g/ P" R% T* \3 i
  Win32_NetworkAdapterConfiguration
3 r! ]& ^! F' c   Win32_OnBoardDevice& E& ~, ^, z8 y) r4 P
  Win32_ParallelPort7 Q6 B) \1 s, e- `- @
  Win32_PCMCIAController
4 A, ~7 k* U/ x2 o1 Y1 N   Win32_PhysicalMemory
3 R1 P$ ?* Y% D   Win32_PhysicalMemoryArray
( Z" ~- I$ j! v9 B4 r- E   Win32_PnPEntity
- `. y# |5 x% z   Win32_PointingDevice
! M( D0 @# }' k+ i5 C, E. b6 b! u$ Y   Win32_PortableBattery
7 L# h( i) ^9 v4 Z. k   Win32_PortConnector
0 {! m. t$ F( y& O2 G. W' S6 n! K   Win32_PortResource
2 S; m# l; Z, b   Win32_POTSModem
3 s. Z" V2 d- ?5 K$ I3 d" X! w- s   Win32_PowerManagementEvent+ m/ _; Z. _9 D: Q( p/ [3 |
  Win32_Printer
* M2 v3 p; g9 B1 p% N   Win32_PrinterConfiguration: d* N6 b* M; B3 W
  Win32_PrintJob, S# p2 V  }  ]' o% w8 T- ?. f
  Win32_Processor0 f, k$ n5 t6 J% N/ z  K
  Win32_Refrigeration& I: m; |7 Q1 z+ g+ K: b
  Win32_SerialPort& d" C$ z( ^# A* k2 Q* ^; d
  Win32_SerialPortConfiguration
" B  W: _* V7 A. P   Win32_SMBIOSMemory
2 j  x; K) S: }   Win32_SoundDevice% u  G7 @0 J& z: n+ w9 K% |
  Win32_SystemEnclosure
, B3 X- y/ d" c# _' ~6 v   Win32_SystemMemoryResource
/ y! N+ v$ v! F4 I# x/ Z. ?   Win32_SystemSlot/ C# i1 V9 {0 B' C, D& c% O
  Win32_TapeDrive! I% }, x, y: W+ }0 C6 L9 P
  Win32_TemperatureProbe* B0 c' ]2 h6 L1 w% U0 I6 U
  Win32_UninterruptiblePowerSupply
3 e+ n8 z9 i+ V9 H9 h! P   Win32_USBController# l& T' _* x" n9 `
  Win32_VideoConfiguration
. k1 h  H  R; L" t7 i9 i6 m+ H   Win32_VideoController
) B' L4 |- ~/ \+ \   Win32_VoltageProbe
' @" `! \5 Z4 b. J; N# k7 q6 w9 j5 `5 H; l+ {
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-26 13:32 , Processed in 0.019853 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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