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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
  V* q6 Z) h& I7 s" d# l
; w  j5 L7 X1 h/ s4 v. S; |9 V, j- |- G* Y+ r$ V: M& Z2 x, J9 [/ ]
--------------------------------------------------------------------------------  Y% K- ]- ]1 D2 @2 D# m5 N, U
WMI: Windows Management Instrumentation (Windows 管理工具): _% b: j( Y( Q
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
$ N9 R7 z0 q( M3 Z  `% J$ Z9 I3 Q   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
( j* }4 T4 |* w   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 - [  k4 l# n; b6 n0 h6 g- ~
2 u$ O7 w! i+ Z7 K
--------------------------------------------------------------------------------
" @9 k+ r1 Y* L' F8 J& RBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面0 F8 P& C. J! K. ?8 w
# b1 J5 G" k8 x5 l; y6 R! ]0 a5 H
--------------------------------------------------------------------------------
* I5 t. c+ d  Y. e① 初始化 COM 接口:
" Y$ G4 L" G8 j, [: ~   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
; n5 v* F; }2 @: R   这两个函数在 #include <comdef.h> 里面定义。
' f1 y/ A$ g( F: g+ s. I, ^& K2 s; [5 X' Q' Q
② 获取访问 WMI 权限:
6 M8 q) }' M2 J/ b! V   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);( ]3 o9 F$ ]" Y' Z
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
- o* S6 |5 |6 M0 N% Q- ^) R) y2 c" F5 o6 @" X8 l% g6 H
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
9 k5 u3 f% N) ^1 y' f   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 K# S5 K" N" A8 b) L- ^
* i5 ^2 ]& H  ^9 {% i) Z- Hvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
4 ~0 Q$ @- s$ A5 ^5 l{
  R# `" M& l5 Q: f8 @( l- J" ^# A8 E  IWbemLocator *pWbemLocator = NULL;
4 W, b, x& m  t3 B3 F5 P  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
6 X! c, i- E: e1 m   {
" F' {% c" e+ _  v) X8 ?     IWbemServices *pWbemServices = NULL;
' P( C# u' p0 U; ~     WideString wsNamespace = (L"root\\cimv2");
+ M4 M3 c* \7 |3 l3 z     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK). @2 u$ w$ p6 g6 ?
     {
3 F2 g1 A" V3 N! V: P        IEnumWbemClassObject *pEnumClassObject = NULL;
, V) ^) j# T+ k  j        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;! T4 ?+ c* |( A' a  V9 Z# \% V8 d
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)' b" Y6 ^# T6 Q. l* l/ @
        {/ j) m( ?7 A( \4 p- L3 T, A! P3 Z
          IWbemClassObject *pClassObject = NULL;
# Y5 H* M* ^' }) }) n5 l  j& o9 i& V           ULONG uCount = 1, uReturned;# G' h6 ?( `- t/ N, X! }
          if(pEnumClassObject->Reset() == S_OK)( D- a4 ?! ^- [
           {
( y; q8 L: k6 D  D, z, w; }4 H              int iEnumIdx = 0;
& L* H( ]9 M0 F( A) \              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
% E, a2 D$ `, j9 e8 h               {
. v5 r, W. D* P) @1 E                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");: v3 z+ n9 I! Y5 G: @. z2 L, ~- q

& n- U! c/ L& v: P                 SAFEARRAY *pvNames = NULL;
1 y% S/ K# {0 F% l- y" B. t! m                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
# u0 Y4 @$ w* P+ T1 N                  {
$ ?& |  K4 [- J' K' b, Z                    long vbl, vbu;1 p$ f& ?' l2 |( k) r- ?4 p: \
                   SafeArrayGetLBound(pvNames, 1, &vbl);
1 \" H5 q$ G% \, j8 z                    SafeArrayGetUBound(pvNames, 1, &vbu);
3 g0 ?. D5 e  s1 P3 N                    for(long idx=vbl; idx<=vbu; idx++)0 k( d: n) x% V4 L5 T: e4 k
                    {
$ E; A2 b& \. ?+ O$ ?; p" R                       long aidx = idx;
" y* @" ~( o9 t4 V: i( |                       wchar_t *wsName = 0;
! j& ?$ N1 x' P7 h+ a$ x. ?  o                       VARIANT vValue;
" \7 v$ s* E. c) l                       VariantInit(&vValue);! U& {* b6 H; X" H; F% F3 d
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
' K7 i- ]+ @, S: j5 [& P
( t. j7 `: c0 H/ D/ P, t                       BSTR bs = SysAllocString(wsName);* x! x6 h1 ^1 ?+ z3 h2 E
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);, U7 K- t7 w6 q: x* B; l! r
                      SysFreeString(bs);3 z9 F* {% O; U/ _  f9 m
0 _5 H6 K: ~2 E  w' _1 v
                      if(hRes == S_OK)" Y7 _& P7 K% B/ r' a, `
                       {
' p' u* g$ T' b% \5 }                          AnsiString s;( q& V' q# R. @) M, M' V
                         Variant v = *(Variant*)&vValue;9 H6 n, P0 j3 N1 d# \6 B8 t
                         if(v.IsArray())5 \5 H8 y( Q' ~9 Q; l
                          {; Z3 ~' k- ?) S( R) @/ o
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
& i/ ^' S/ _. _3 l& c! s1 F+ B                              {
. b( ~' R5 b( ]) y, D# V                                Variant a = v.GetElement(i);
  J9 M$ j$ `& A: T% A                                if(!s.IsEmpty())
! w/ C/ M0 L) `7 U                                  s+=", ";3 E! T. Z' S1 W' b! \
                               s+=VarToStr(a);
0 w# @! ^$ y' R; d3 z0 v3 C- m# |                              }
8 t9 {: |$ |' P' u                           }  R- R8 R3 V2 r  ]/ ]. m# o7 {8 J
                         else
5 l& b1 R- i- x7 @9 @                           {
4 g6 P/ H+ X  q% Q4 [                             s = VarToStr(v);
* \' W. i- c3 [4 q( o% J. w, N" x                           }
0 H( |1 }0 e- o6 o                          lpList->Add(AnsiString(wsName)+"="+s);# J7 q7 {( E" B" ]( f
                       }
- _. |. d7 G- b$ H
; |5 _! B% [- p$ G* l  j9 T                       VariantClear(&vValue);
: g( d# S" f* q0 e# D1 X6 A1 N                       SysFreeString(wsName);
0 D4 \8 o4 S( v! H3 Q. ~5 `* t& H                     }
2 R5 m! O* A8 s( b3 x                  }0 ^" T; `) g7 q1 u" n6 ~% u6 F
                if(pvNames)SafeArrayDestroy(pvNames);7 H( O2 q3 A8 o% R  Q; k. B% b
                iEnumIdx++;' ]0 X! p) Q/ @( U$ H$ l* t
              }
8 v- Q8 f8 ]  Q" H% j            }+ p. [% B& K* K* z9 r, X
          if(pClassObject)pClassObject->Release();
6 `  t# M' q: o& ]5 ~( D         }
) m5 P' C' O; ?$ e6 v% \; e' W, e, Y* p        if(pEnumClassObject)pEnumClassObject->Release();9 a2 K* p: |0 Y$ Q6 a& ^/ s
     }7 [* Q+ r/ j( ~3 x  K, J
    if(pWbemServices)pWbemServices->Release();
  U! j4 t$ S0 C/ ~5 F1 ]   }
5 W3 L) C) D9 ~2 K' B  if(pWbemLocator)pWbemLocator->Release();
. J. T( f$ F, i. z6 c3 n}; n! N: \/ G& j, D2 `6 k
//---------------------------------------------------------------------------2 W# `% y6 W& D' Z

$ u# E5 M$ \/ K// 通过 WIN32_bios 获取 BIOS 信息:! B( D1 s" I' ]  E- M. B8 t% U5 V
void __fastcall TForm1::Button1Click(TObject *Sender)
- J( _5 E1 {9 n! ]{
3 s- j) N; X4 H6 ?5 ]+ e    Memo1->Lines->Add("================== [WIN32_bios] =================");
5 M( x) `( O( Q, b    GetWmiInfo(Memo1->Lines, "WIN32_bios");$ Q- K7 t. M0 U% r, _3 @
   Memo1->Lines->Add("");3 Q9 A* }( Y4 B0 s0 x$ n
}
. X- _$ Z+ }- E3 b* _
4 ~. }( l4 r% ~) p--------------------------------------------------------------------------------% Z0 D5 Y5 i7 m6 z4 k

" E( q1 f) d1 u: }- u$ z; p" eWMI 可以访问的信息类型有:
' P& t& X2 d" K6 G3 `' [   Win32_1394Controller" L5 f5 f. c$ ?& s( w6 `' C! v
  Win32_BaseBoard
6 w) `4 F4 r; u7 z& J" S   Win32_Battery
/ a: v" ~* }! d1 s! B! _- y. l   Win32_BIOS
& R9 ?: ~8 S7 w9 a+ |( L! x   Win32_Bus
: t1 F; Z+ H0 v0 j* |: ]   Win32_CacheMemory. {0 B: \4 f3 w3 x4 M. l1 _; [
  Win32_CDROMDrive
2 ^, I, n0 u2 e% [( e# j' `0 d   Win32_CurrentProbe+ s5 w/ I2 X0 H* J7 z- X( _) Y
  Win32_DesktopMonitor
: `' T, p1 J3 n  b5 L9 z3 ^   Win32_DeviceMemoryAddress
9 X7 g' e2 O$ `! c/ ^; T9 B$ E3 h8 Q8 h9 }   Win32_DiskDrive
& Q% g* O* j3 L: q+ @) }% y   Win32_DisplayConfiguration- G0 Y" l/ d; G3 ]# i' S
  Win32_DisplayControllerConfiguration
9 H8 ~3 q( [+ E+ ]; n7 h; [, m   Win32_DMAChannel
# R5 k! x) L1 Y$ t. L   Win32_Fan& a! A. B* K- Y/ e0 Z; C3 ^0 W
  Win32_FloppyController4 U* i7 O3 V% U7 x
  Win32_FloppyDrive
, Q5 o0 b/ I) ]% R6 |- I/ _6 F$ P   Win32_HeatPipe
: _( i" ]3 E3 ^   Win32_IDEController& l8 Z' V! `; E* d6 H* `9 V+ l
  Win32_InfraredDevice
+ r* d( W) R$ E' c. y0 u   Win32_IRQResource
1 L8 p2 z/ z0 R1 _. X! x, {8 g+ Y   Win32_Keyboard
* ~  b* ?* Q4 r8 T/ _5 {   Win32_MemoryArray* R. [; b5 P- m( C
  Win32_MemoryDevice
' T" u- I+ Z' S- z+ u   Win32_MotherboardDevice4 A0 B" m+ W4 ]$ d
  Win32_NetworkAdapter
' u8 W- p0 P+ j9 c* t% u   Win32_NetworkAdapterConfiguration4 |" R% c/ S9 T  i$ j
  Win32_OnBoardDevice- u0 j: x+ q+ J8 f+ l* i
  Win32_ParallelPort7 Z1 Y8 l, T; X& B' N1 }
  Win32_PCMCIAController
* z4 ]$ o8 X7 {  k8 }4 e   Win32_PhysicalMemory. T# L8 s9 W; X$ V
  Win32_PhysicalMemoryArray
' o- s$ M9 j) `- G) i) U   Win32_PnPEntity
3 w3 N  y/ [" Z5 b4 X) G; v7 N   Win32_PointingDevice
' u' C- h% y  c  z. d   Win32_PortableBattery
( ?/ I" }6 a9 m6 a, \0 O+ H   Win32_PortConnector
0 @6 f. w8 n1 R3 v   Win32_PortResource
: |0 u9 x5 X: ]8 m/ c% G   Win32_POTSModem
! R- V. S& A7 _/ r: g   Win32_PowerManagementEvent
' d/ v6 I+ T7 _/ R2 U; Y, S   Win32_Printer
4 D8 ~0 n, I8 {: M! y3 S   Win32_PrinterConfiguration
4 l- q- U; R& p5 O, D+ @   Win32_PrintJob6 H1 Q, _' s; a! G
  Win32_Processor
6 g! a5 P" U1 v' t/ U8 ^   Win32_Refrigeration9 \' k: L9 ]& W: v/ T7 q8 @( w
  Win32_SerialPort
& ^& ~7 O% L9 |: B2 N   Win32_SerialPortConfiguration
- S* G, ?( H, x' l+ n+ _5 I   Win32_SMBIOSMemory
& K! d6 X2 b& {, V& s# i   Win32_SoundDevice
6 D6 U1 }- P( Y   Win32_SystemEnclosure
# W/ j) I0 l, [. I, j; }   Win32_SystemMemoryResource4 L& U  p, V0 B, q
  Win32_SystemSlot8 Y1 D% a7 B4 c1 g
  Win32_TapeDrive* m) I4 x' {* p4 n
  Win32_TemperatureProbe
0 r3 `; [0 n6 G+ n' N% y   Win32_UninterruptiblePowerSupply
. c  U: b* @  ]   Win32_USBController3 L; ?0 s5 c9 D3 K4 |6 ]
  Win32_VideoConfiguration  n, H$ |7 h1 h$ ?
  Win32_VideoController
* A9 ?9 Q0 S2 s   Win32_VoltageProbe
9 u0 m) i" z7 D, |1 L
- P5 m2 u$ u& @! v以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-23 15:35 , Processed in 0.021012 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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