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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)5 i) L3 r& a8 b7 q3 k
5 c& g+ e, _% k7 m& Y' b9 j6 m

0 i; x. ?# y2 b--------------------------------------------------------------------------------
; a8 \6 m: _' t# _2 Z3 BWMI: Windows Management Instrumentation (Windows 管理工具)  ^1 B9 M# x6 b/ Q. O
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
" W" I) J2 d' J+ @# a! q9 t& X   利用这个工具可以管理本地或客户端系统中几乎所有的信息。4 o2 Y; ~6 O* f. E
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
, l) A( j/ L. G+ V, g8 y/ U5 |2 c$ e6 K" m1 F* p% J2 K+ Q
--------------------------------------------------------------------------------  a' Z$ T, r7 U; v7 P; y
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面/ n% l1 J$ \1 F) s
2 c$ o4 r& D1 K1 O' @
--------------------------------------------------------------------------------5 l/ I+ n4 V9 u9 W% O4 n: X
① 初始化 COM 接口:
5 t/ @9 E( C4 G8 A   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。/ b7 L4 P1 X5 b7 c  B& X
  这两个函数在 #include <comdef.h> 里面定义。9 }* @! q- X1 J0 F1 y

( G# c) T! ]8 @3 L2 I8 Z② 获取访问 WMI 权限:
2 Y# Y0 Q" O# `, Z   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);! D- v8 j7 A4 U6 V: [
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。8 ?4 y7 Z+ H- U% a0 K+ }
- `3 F6 Z& L; ]: B
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:3 \' _2 H, `+ p- M) H
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。+ q3 k- f! b4 U* C2 `8 h7 Q

. i8 L  y" v9 r. @void GetWmiInfo(TStrings *lpList, WideString wsClass)8 q* o- ~- H8 J4 _3 J6 t" ?
{# x" O# C  c+ |. Y. ~( H
  IWbemLocator *pWbemLocator = NULL;
9 ?$ E+ [- k9 U: |5 T5 }$ X  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
4 z# a) n1 [; o; @& `* c0 w3 W   {" b1 Y; d, R/ L" G4 T4 H. u( |, D
    IWbemServices *pWbemServices = NULL;  G# m3 E* L5 D# t$ _% C
    WideString wsNamespace = (L"root\\cimv2");# j" |2 C' U+ l' k, J6 s) `
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)2 g$ W0 K7 M3 P
     {
% H/ p( `/ T9 S* g9 b, ?+ c: l        IEnumWbemClassObject *pEnumClassObject = NULL;
" w% M+ J/ v6 N3 X        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
3 a3 p  k4 H$ u5 u/ l3 n        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK), y( y: K: v, l8 e+ Z* j% O  Z
        {! t( F3 L" ?2 d  \
          IWbemClassObject *pClassObject = NULL;
+ }, n0 q0 m2 R2 Y6 p0 g1 A$ ]* n           ULONG uCount = 1, uReturned;
$ r2 j# a% j6 D$ y3 H           if(pEnumClassObject->Reset() == S_OK)
2 r% Q) B" d: w% Y/ B% T4 R            {
7 V. k4 m) ^+ u& a! s# N5 Z7 o! `              int iEnumIdx = 0;
6 ?; h8 }% q; }) O              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
$ {4 @9 R" S8 `" ~               {! |! s0 I! p" `
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");, ]4 u( m% m" i- U* U
: h1 D9 h! u+ m5 r9 ]
                SAFEARRAY *pvNames = NULL;+ M5 r2 g% t% l# S6 N* G% w6 \9 ?
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)4 n& z% U* v1 F8 @6 u
                 {
% M2 u5 t6 B6 Q                    long vbl, vbu;, ^" C6 x  s3 \$ ~; T, g' M
                   SafeArrayGetLBound(pvNames, 1, &vbl);
/ ~) _. k. b% b7 i: U/ d, ~                    SafeArrayGetUBound(pvNames, 1, &vbu);
' D) \. u$ g( G7 T& V: `. f1 W% y                    for(long idx=vbl; idx<=vbu; idx++)
+ k7 `, s1 |" `& l5 q                     {4 Y0 P- Z6 F" D5 m0 r2 V4 T
                      long aidx = idx;
5 k, A) K4 y$ Z6 y9 I; j3 p0 j                       wchar_t *wsName = 0;
/ `* v( A& v9 M" i+ ?# O7 W                       VARIANT vValue;2 {4 |- O' U) @
                      VariantInit(&vValue);' P& t# t' f0 t) n& G& T( q  u
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
5 B  K+ ]  b6 w+ M
6 Q/ ~7 ~& k; G7 ]2 i' D                       BSTR bs = SysAllocString(wsName);
! B& K7 j' l+ z2 W- F0 _                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);+ v; a1 A, q! Q
                      SysFreeString(bs);
6 a. j, L, R' I; B: x
0 _& Z( l+ W; e# j: M                       if(hRes == S_OK)
0 l) S* J$ P  y/ E                        {
+ i* t0 r) [$ z/ R                          AnsiString s;
! l) c& [% {+ W6 z/ ^- {1 ~/ c                          Variant v = *(Variant*)&vValue;
7 K9 C0 i0 F$ L. Z, O                          if(v.IsArray())/ I; S0 c+ x- `
                          {7 o. ?7 r2 C% D; \
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++), _6 H. M$ F0 K" I
                             {) O+ E9 F$ p% F; q0 ^
                               Variant a = v.GetElement(i);
: n2 {* H, d" ?: W                                if(!s.IsEmpty())- {' B* y% n& ^) h# m# W- G4 |! _. ^
                                 s+=", ";0 u- c, ]# `# y' \4 y. v6 t
                               s+=VarToStr(a);
6 O  z4 V" Z& n                              }
& r  y" g# p2 J' C                           }
- w" G/ v7 r0 H* l, a9 Q                          else
- f0 y# ]' X/ `+ _/ c                           {
4 r, L7 s+ n6 J* z4 R7 Q. @! N                             s = VarToStr(v);
: V4 \) C2 r  k& R! ]' a' B5 H                           }
0 b# a. g% p& o4 K' V# ?. x% z                          lpList->Add(AnsiString(wsName)+"="+s);
3 }5 o; }3 b/ u/ Z  j                        }
  J7 G! \; Y  @- T9 x) @4 R% g% V: t5 x5 t( D+ ?  E) g1 m
                      VariantClear(&vValue);% r* R2 l5 c$ w  j( _, G( l* i1 W( o
                      SysFreeString(wsName);! X- v& l+ r# i5 [! ^7 o2 I$ t4 S
                    }) M% e: A! M  I7 S' l4 M
                 }& Z7 {% L$ y. X7 ]
                if(pvNames)SafeArrayDestroy(pvNames);, _% L& t. ~# A# u" `
                iEnumIdx++;! y8 L. p# ~. J2 O$ H
              }: \) }. ^4 m: Y2 R$ M: n: M0 h
           }# e& R6 N/ y2 k8 l5 _6 I# D
          if(pClassObject)pClassObject->Release();
. Y/ j: t4 d, v6 F1 y         }
5 @7 I8 H' m: R; W3 w7 |- m        if(pEnumClassObject)pEnumClassObject->Release();
) A- q/ Z5 g0 \% w0 _      }
, Z' C& C3 \4 R+ }     if(pWbemServices)pWbemServices->Release();" b0 t4 p3 D! P6 b0 M9 Y  }, b3 |
  }0 ^: J7 N4 e# s& U
  if(pWbemLocator)pWbemLocator->Release();
$ i# U6 g' i& O}# X. H  R: h* A1 @, ~) g
//---------------------------------------------------------------------------
* ^+ A' e0 H* r9 o( M3 m! |
+ _5 J6 v% T/ X7 }; H// 通过 WIN32_bios 获取 BIOS 信息:* w1 x9 U, a2 \# x
void __fastcall TForm1::Button1Click(TObject *Sender)
+ U8 R$ G7 j/ a- r4 j( }- s0 y{. Q, `; S$ S6 o' ]' w* u) U# v
   Memo1->Lines->Add("================== [WIN32_bios] =================");! h! q+ p' t0 D) s4 s9 u
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
4 @/ q. X+ _4 M  t    Memo1->Lines->Add("");3 U1 q3 y: |  @& m4 o- ]) s3 E  Y+ ~
}/ ~' ]- l! N; B$ q9 {. `

% ~7 O7 b  A& g; j( r+ Z. g/ V--------------------------------------------------------------------------------
  Y) ^7 f! Y& ?6 z  ]' o
' r  l5 ^. @9 R  oWMI 可以访问的信息类型有:0 f0 T5 Y, A1 E) ?' C" E  d$ ^; a
  Win32_1394Controller' Z2 s# n# O& ]7 X2 P
  Win32_BaseBoard
6 p; d% K2 s5 s- o1 Q, \   Win32_Battery5 d  Y; o! @( I9 ^, |2 D
  Win32_BIOS
* {  z( ]' e3 {! n, A- H/ g) m   Win32_Bus
  r: E7 Q! A: k1 O   Win32_CacheMemory+ L9 h9 B: d# Q6 l0 Y0 B6 @
  Win32_CDROMDrive; y+ z2 g4 @, Q6 B+ S; M9 {
  Win32_CurrentProbe) t) l: U6 z( H1 Y% b; T
  Win32_DesktopMonitor
/ T! Z, y0 t- A) @   Win32_DeviceMemoryAddress4 ]& n# `9 l3 ~- E- r- L0 r4 S! @1 ?
  Win32_DiskDrive
& e( ]7 ^8 O! [- q  w7 E   Win32_DisplayConfiguration1 o9 v6 T2 M$ z
  Win32_DisplayControllerConfiguration: ~( r$ X( V+ B6 z5 M3 R
  Win32_DMAChannel5 j- Y; F3 I. m7 u
  Win32_Fan, d' C" k1 |4 {3 B; w5 s, V
  Win32_FloppyController
% h6 }2 Y0 D+ O$ j& b   Win32_FloppyDrive. D, J+ n; O1 Q
  Win32_HeatPipe  Y/ l. V6 u, h+ F
  Win32_IDEController
( ^4 X9 `( v1 V5 \( r; Y   Win32_InfraredDevice
9 E) K. ^, U2 x/ U1 k6 a3 s   Win32_IRQResource  F3 V! c  D; x% }+ v# W
  Win32_Keyboard: f' u. a1 O, c) Z
  Win32_MemoryArray( h( Y6 f! x0 B) I2 Y4 w  `
  Win32_MemoryDevice
! ^& s" p" ^7 q3 C, J2 r+ {6 _% y3 [   Win32_MotherboardDevice9 X9 ^0 _" d: m/ {( k1 x+ j% P
  Win32_NetworkAdapter
4 ?1 g2 B: s" N: J2 ~. S# W   Win32_NetworkAdapterConfiguration, P9 X% l' r2 M6 c) K% }
  Win32_OnBoardDevice
% d1 ~3 e0 K4 H" ^9 a   Win32_ParallelPort& o0 Q. o$ I* E, ]- X+ Q. w
  Win32_PCMCIAController) f% r! e( q$ l" u; C$ d# f
  Win32_PhysicalMemory
/ e! l2 T) e( y3 Q7 D8 t8 D0 \; `   Win32_PhysicalMemoryArray
, J; }. i8 U$ |% B) V   Win32_PnPEntity
6 B/ R' y' x3 _* t1 ~% D   Win32_PointingDevice$ e( ?1 G0 ~: J
  Win32_PortableBattery
- R' v6 [+ S1 ?0 U$ L! B   Win32_PortConnector
9 k/ I3 {* ?5 h3 W# W# l) E   Win32_PortResource
" i9 w1 v! a& I/ n1 F1 U2 f   Win32_POTSModem7 }6 s3 b5 ~8 x) W+ e! I
  Win32_PowerManagementEvent
. h! f* F7 A* \6 ^- t* y4 A   Win32_Printer- L$ @, a/ Z3 R2 s6 M: G
  Win32_PrinterConfiguration, F4 D7 {. `, i. n- s
  Win32_PrintJob: a% L- q" q. d; a2 `
  Win32_Processor& I( J/ d- J: s: U0 v
  Win32_Refrigeration( i) n( ?) [8 c7 ^1 L
  Win32_SerialPort
5 U# s9 r; i7 |1 u: `/ ~/ W* j. H   Win32_SerialPortConfiguration
& L- E, b5 R. E; V  k9 i# k$ x& o   Win32_SMBIOSMemory' Z- Q$ k& j% h/ C
  Win32_SoundDevice! q( F) D; [; M3 U) y% v
  Win32_SystemEnclosure7 i/ ?0 j/ g* n2 G+ ]. J. i% o
  Win32_SystemMemoryResource, _& T% X* D% }+ ~& l/ f- }( l7 S- t
  Win32_SystemSlot$ U; \$ _+ Y- v' Q' ^6 ~& X
  Win32_TapeDrive
8 @2 J, ]& T7 ?8 n4 G4 S6 A1 a( [   Win32_TemperatureProbe
& ~' Z" X3 Y3 X& n3 D# c   Win32_UninterruptiblePowerSupply
7 |& }) d0 j( S4 E; M1 }   Win32_USBController( O: Z: c+ O* B: v) X: e" S
  Win32_VideoConfiguration
3 G, b3 O6 l, T   Win32_VideoController
  B" g* s% k6 L* |   Win32_VoltageProbe" v) [4 \, A3 [" q4 D2 f' g3 q

0 ^/ _/ {. \& r# k/ P" x( |7 w以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-20 04:42 , Processed in 0.019131 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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