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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)! h" ~! W9 L# I9 m/ O

3 D2 T9 I4 v% s/ i: Z9 L9 [5 M) e3 e5 ?
--------------------------------------------------------------------------------
" |2 G) n+ s' s( H  j5 D) VWMI: Windows Management Instrumentation (Windows 管理工具). |8 h+ E# y! _) ^+ {$ @" @
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 , K9 |3 Q7 P# X' B5 ]/ U0 j3 Y
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。' k$ N! E( u" m) r
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
, v: I. u* ~8 }" E3 y$ L- a' x# _  P; Q; h  Z* K. o8 D
--------------------------------------------------------------------------------: H4 C, B! V; b; y
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面: Z; j7 X3 e/ H4 ~% k4 H, @6 c4 L
! \$ q) W5 ]5 u/ W% s
--------------------------------------------------------------------------------4 }; R# N5 }  C; J: H6 |; C5 O3 `
① 初始化 COM 接口:' j6 u/ b* Q& C- S, ^* K, |5 q
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
) G; k/ C- c/ k$ W   这两个函数在 #include <comdef.h> 里面定义。
; c. {" K8 Z! O- a! @. A3 o
3 h, K6 U- [# m7 T% T② 获取访问 WMI 权限:7 r, @$ t( s! |  Q! O6 f7 Q
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);; Q" J  F* p' ^; r& z# i0 n
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
: S- L" H% Z8 {; H5 b9 w: o0 m  E; v8 M; o" E' x! V
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:% ]  H2 \0 Z: m& `8 a/ J
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。3 U0 @5 ^$ G* L) o3 |9 b
' i, d8 s, O% N" T5 {1 `( s9 I
void GetWmiInfo(TStrings *lpList, WideString wsClass)
* j5 j0 p. E0 z& @{7 Y  I9 ~9 \( R6 E2 i1 i* ^0 K6 [
  IWbemLocator *pWbemLocator = NULL;, h+ d* P* x* q; \; [1 Q; {1 O
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK), a& T- f: u# l8 A4 e0 V
  {% j: y  T* k4 d3 C8 q
    IWbemServices *pWbemServices = NULL;/ X  s, h/ h2 |/ ?  T& i
    WideString wsNamespace = (L"root\\cimv2");( v5 h: m2 s4 y6 J4 Z
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK), f# R4 K6 W3 x0 k3 V: h
     {8 s- M+ ]0 O% e$ M* T( q# W5 ?
       IEnumWbemClassObject *pEnumClassObject = NULL;$ z; L& i: W( L+ m9 Q& d
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
, Q" v) _  M3 `- M& S& r; n: c9 y        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
4 E- [/ t4 Z* ~2 ~6 E         {+ c6 y8 r* @# T$ j7 p# ?
          IWbemClassObject *pClassObject = NULL;  _" @7 w" j2 q; g
          ULONG uCount = 1, uReturned;9 k0 I5 N+ _2 |+ y* _8 J( N
          if(pEnumClassObject->Reset() == S_OK)9 W& _# ~# T2 V
           {
  s, x- [; W  X, l% n" c- o) C              int iEnumIdx = 0;) k5 d! O7 \; M& b  ~: _% g
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
6 M8 }% E8 U5 f- F( S, Y6 w7 ]* g               {
- _) h# @  M5 j7 M( d3 s: Z; I* J                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");$ k4 L7 N( B) _+ u
* ?: Z$ Y1 ^1 W1 w7 v
                SAFEARRAY *pvNames = NULL;
- |+ M; _0 z2 c$ C* H, ]                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)$ t! ~$ A) P3 I4 O/ a
                 {
) N/ Y: ~* Q* f$ Y- m                    long vbl, vbu;
! E2 h- w& O9 i. L                    SafeArrayGetLBound(pvNames, 1, &vbl);7 c. U% H% m) D7 s" C8 X; ^
                   SafeArrayGetUBound(pvNames, 1, &vbu);4 y; }+ P' h! o; q# |) q6 c
                   for(long idx=vbl; idx<=vbu; idx++)
2 P. c3 i1 q/ M* X2 j7 g. Y                     {' t9 N+ j( R4 T% T' D
                      long aidx = idx;
% }1 ?9 S; a9 d' P9 N% l                       wchar_t *wsName = 0;6 t/ g9 L, ^7 k3 A" I! h, |  S1 C
                      VARIANT vValue;" a3 Z: K3 P+ s- A$ h9 \
                      VariantInit(&vValue);& O, B+ F. f$ T2 a6 ^
                      SafeArrayGetElement(pvNames, &aidx, &wsName);9 c1 k/ F8 {2 q" o: O- g; }- S
+ o0 V, ^% D9 f' }' H
                      BSTR bs = SysAllocString(wsName);1 g5 t  X" Z& y& i. q
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
" i; f3 U% G7 d( Q; i                       SysFreeString(bs);- I5 c* {. K; i
2 B7 ]# r0 t) q0 b
                      if(hRes == S_OK)/ K- _& Z3 y5 _1 j- G1 Y9 y5 v; x" s9 i; |
                       {
6 x5 w8 m/ q: p  _4 h# O+ J6 r                          AnsiString s;
" m% E' f$ e+ n1 F4 ^" e                          Variant v = *(Variant*)&vValue;
' X* `6 m, I+ v9 ^1 P( O7 N1 D: E; w                          if(v.IsArray())! K5 B7 i6 x' h5 y* t! b+ J/ C
                          {
# j$ \+ x1 w: c! U7 [                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
2 l& M' P8 Q6 l" \( K  T9 j                              {
; F1 L$ H" b6 n                                Variant a = v.GetElement(i);! @+ c% I1 d" v" Y3 J* I
                               if(!s.IsEmpty())
" Y$ u# a6 `5 \7 M$ @                                  s+=", ";4 q8 W1 H) T" W) Y( m% p. V
                               s+=VarToStr(a);
# Q( ^! ~6 \# q+ A! ]                              }1 `- |7 d" Q6 h; t" o
                          }9 ^. a8 {7 H8 O4 V* \! E  u- ]
                         else
( c2 \% ~3 e7 J+ V5 H) X; L                           {; B, D1 M0 a$ x
                            s = VarToStr(v);
- B- y7 D0 R( c- i) S) J. v                           }; K, _- C1 C( t4 f5 }" |: J
                         lpList->Add(AnsiString(wsName)+"="+s);9 N" G6 n7 e8 g
                       }
; `* I' e* c* u: Y8 \- j7 [  H7 |* I0 H" ?( M" u
                      VariantClear(&vValue);
) M" L; J9 ^/ G3 V/ C                       SysFreeString(wsName);) W* o% I3 e" n* H; t9 K
                    }
$ b3 ^& D- @" Q5 [: j6 B- X  g                  }
, ?: E: J4 J$ E* z                 if(pvNames)SafeArrayDestroy(pvNames);
& A3 K" u+ R+ O                 iEnumIdx++;
* f$ t0 [5 |0 \+ M# b8 e8 N               }; A) v; L% {, c" M1 `9 x
           }
5 ~; C7 z6 A( b# b" P           if(pClassObject)pClassObject->Release();
- N; v4 H1 v% C2 ?8 T         }6 O- b; U( S$ |5 e7 C# l9 I  ?
       if(pEnumClassObject)pEnumClassObject->Release();
( ?0 e) N/ A2 P1 F' q) |      }
, @8 b# E- }/ R7 }     if(pWbemServices)pWbemServices->Release();
$ I" e8 b  k$ N$ P. g' q( q+ d) a; w   }
0 h( o  [6 H* M! s; U- }/ z  if(pWbemLocator)pWbemLocator->Release();
8 m- B0 N! ^  \1 l4 L1 Q}
9 e, B: V5 c9 f( W5 ~" B//---------------------------------------------------------------------------' f4 r1 B7 L9 L! C% b- M: W

9 ?" r7 z) [" F& C// 通过 WIN32_bios 获取 BIOS 信息:
0 \# I- c% C+ p$ a# v% Q; ?void __fastcall TForm1::Button1Click(TObject *Sender)
$ X. m- U' |+ E! j# B6 [. n$ _  H: `7 K{
9 F, ^) V2 {1 u9 q/ O; ^. `    Memo1->Lines->Add("================== [WIN32_bios] =================");
1 E& V, q/ B' \/ |6 s3 `# t    GetWmiInfo(Memo1->Lines, "WIN32_bios");& n  p2 i# _, w% j
   Memo1->Lines->Add("");
3 g; ~% n8 R* O4 E) O) {}
0 u) N" G0 o; O6 G( }
2 D4 O  H4 W" S1 q) z--------------------------------------------------------------------------------
6 A  |, V, t5 P6 Y
& D/ K: m6 S2 n# ]5 cWMI 可以访问的信息类型有:. D4 i! @' |+ ]2 V( B) L
  Win32_1394Controller
! H/ E. ?) h) u- E/ H' `   Win32_BaseBoard
5 E: h" R( X3 H   Win32_Battery
$ E& G6 v/ R% F' C' ~* S6 i   Win32_BIOS5 e3 `: E  @" V& c) ~+ K' N9 G) W
  Win32_Bus5 P, t7 ?) P* s6 O7 `! h: C  p% {
  Win32_CacheMemory- m% D$ d" o' W/ k
  Win32_CDROMDrive. g: u: G. u) o! c
  Win32_CurrentProbe
! ]1 ]6 ?7 s8 ~5 y* g, p   Win32_DesktopMonitor" ~0 J( V" p  N* U: ^, c
  Win32_DeviceMemoryAddress% p( W+ r& q/ b, f$ x
  Win32_DiskDrive
+ s, a$ o% F0 M3 c% w$ Q3 u( O   Win32_DisplayConfiguration
2 Q- R- A9 P5 Y. B2 _! q' n  y   Win32_DisplayControllerConfiguration% m$ k. u7 U; i4 L
  Win32_DMAChannel9 {2 l; J4 C) l0 f
  Win32_Fan8 o0 G  B' W: r2 K5 z7 x; r
  Win32_FloppyController. _+ S+ k8 B4 j8 E* t+ c2 ~- b
  Win32_FloppyDrive, h& X1 _, J! Q3 {8 K$ J0 ?
  Win32_HeatPipe4 n  ~! w. e0 M
  Win32_IDEController1 D, Y! S1 u6 }% E# A0 g5 h
  Win32_InfraredDevice
7 ~' m# K2 t; P! ~   Win32_IRQResource
' _/ e3 y$ `" S; M4 V& g5 f2 v: q   Win32_Keyboard6 W- n7 _+ O8 v# A  b# }- P; G
  Win32_MemoryArray
3 V4 M& o+ U! T" q7 X   Win32_MemoryDevice
% X/ ]3 T/ [% K/ M6 L4 x   Win32_MotherboardDevice
0 I* C1 f6 Q4 r: t$ k1 a, A   Win32_NetworkAdapter1 z/ R5 [6 a% L1 B9 h
  Win32_NetworkAdapterConfiguration, r' V6 s) ?6 i; t% U1 E
  Win32_OnBoardDevice
$ H) r4 q3 n& ?- a1 j/ J   Win32_ParallelPort
1 P. `. u8 d2 L* r   Win32_PCMCIAController
: a+ b3 V& f" F1 K5 k8 f! h% i: j   Win32_PhysicalMemory
+ k& h5 |0 y# u9 y$ K   Win32_PhysicalMemoryArray2 x4 m  ^  s$ u1 F1 o  N; n
  Win32_PnPEntity
% j6 \) [* f, D" ?% Q0 l: ~1 e   Win32_PointingDevice5 `, W- S% x/ k0 C; q2 @) ]
  Win32_PortableBattery3 f0 M% r5 q3 p6 d/ G
  Win32_PortConnector
: a) u8 l5 C. C2 `   Win32_PortResource
! D9 u; B. V) m$ \: T   Win32_POTSModem
1 ~. q- W; v/ v/ n   Win32_PowerManagementEvent
! n# Q3 n6 f! A& v9 S" R* u   Win32_Printer( C) w. @" _: c0 |6 Z
  Win32_PrinterConfiguration8 U4 X( l; Y5 U" |- J9 u& C5 C
  Win32_PrintJob
6 v+ n/ b- M. s: C5 V1 `   Win32_Processor
8 K& e$ r+ P1 A9 w$ W   Win32_Refrigeration
6 a9 T0 d( X( Y! w; ~. }   Win32_SerialPort
1 z' y8 g7 |1 b+ d$ Y% Y* L   Win32_SerialPortConfiguration, O! T0 W9 Q5 V( ]: D3 ?5 a. {
  Win32_SMBIOSMemory6 P- `/ a+ ?" h- v  [* t  `8 E
  Win32_SoundDevice
" S" \; I% s3 l, h   Win32_SystemEnclosure
/ e) J, r$ o( m/ N( P+ z   Win32_SystemMemoryResource4 \: m7 f/ o  X! o
  Win32_SystemSlot
; S* q6 G9 L( G' ]! {   Win32_TapeDrive
) j, U* G  C4 o0 O6 \) X6 Y   Win32_TemperatureProbe
& c" n9 i8 g% Q5 u   Win32_UninterruptiblePowerSupply
* s" s3 f; C1 K   Win32_USBController
/ }: e% p/ o; {1 X) ^; a   Win32_VideoConfiguration
( K3 |5 L0 [+ f9 N0 `   Win32_VideoController
* ]3 T2 o" a7 |+ W7 G, B) M9 O   Win32_VoltageProbe
# O+ A- L3 o0 {
: n% z$ |  \; @以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-29 09:57 , Processed in 0.022775 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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