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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者). _5 \* C! n6 h- U( [

+ l% }. U$ t8 f* v2 p6 P; S4 I+ v# h5 {' }
--------------------------------------------------------------------------------" ]( x" u# e  `- m- D
WMI: Windows Management Instrumentation (Windows 管理工具)2 Y  W: C6 q+ C4 e9 V- `
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
. v( l6 M" _5 m" ]$ C/ I; i   利用这个工具可以管理本地或客户端系统中几乎所有的信息。+ @8 z) B, Y9 E
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 & ^% _2 [$ n# m6 @% W5 O5 Y
5 ~* k! B4 k9 a7 [* r; B. h$ A0 r
--------------------------------------------------------------------------------3 `& J! U2 A7 p
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面! F8 R3 Q+ _) @7 d
7 Q7 V4 N$ G( w0 h. I) Z0 ~
--------------------------------------------------------------------------------
# W1 R6 O2 p9 r/ z( x' c/ H5 y① 初始化 COM 接口:( F. X9 N* D& Y5 ?* E6 ]
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。4 @* \2 |$ m7 e+ y$ ^# P3 J
  这两个函数在 #include <comdef.h> 里面定义。% i- E+ t4 k1 c* M+ v" @
  m! m  O/ S# G$ x
② 获取访问 WMI 权限:* s* B2 m5 O. z- [+ A7 A
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);) R' s: @4 q, E! f; [3 u
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。! `' ]5 A7 R- r( p) Y9 b$ Y+ a
9 O1 y% X  S, T1 Q& a  a! Z8 W
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
$ X' w7 \# M; D9 P   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
; Q' r% G7 s" Q5 _: }0 ~" w8 V$ M  }' v6 S3 L5 ?9 Y1 b
void GetWmiInfo(TStrings *lpList, WideString wsClass)
6 S$ F! ~3 b0 V3 @' {: d6 n, o{. S9 Y+ _' U3 n# @7 O& E7 Q
  IWbemLocator *pWbemLocator = NULL;
+ G7 ]2 x8 @7 E7 [( X/ J  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
, P7 _3 {. T, |8 V( R   {! E! ~' ]! e) }) ^/ y7 S) Z" V% t
    IWbemServices *pWbemServices = NULL;
# V  x: H- i  e$ J( }8 ~# v     WideString wsNamespace = (L"root\\cimv2");- O, U8 k& I0 i4 t/ u* Z
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)+ Q4 L& t& L8 n
     {
6 F6 q. T6 ^8 k8 w3 C* T        IEnumWbemClassObject *pEnumClassObject = NULL;
+ |3 H" P1 F, y$ ~; G4 m        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;6 Q1 d" q7 m$ }3 a2 o$ K3 e; ?4 e* x
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 q/ [. e- ~" U$ K, U         {2 a  c1 \7 z1 N0 a3 o0 p
          IWbemClassObject *pClassObject = NULL;. _9 f( U+ C$ N
          ULONG uCount = 1, uReturned;
# ]1 n5 b0 Q& |4 i( t           if(pEnumClassObject->Reset() == S_OK)' O; S0 v. D. L; }7 W9 t% `- M. W
           {: H( f( k4 ^( T) l! z. F/ ~  O
             int iEnumIdx = 0;
$ l% z5 _9 B+ ~$ L( `              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK). m1 D4 [% P3 H
              {! ?. O4 t: H, d0 ]& v
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
2 [: u' ~7 I$ j* X  v: ^7 H! g/ Q; M3 p, L4 G
                SAFEARRAY *pvNames = NULL;
& Q0 w7 Z% M  y! Z. Z+ p                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
% d4 B6 o$ A4 i) u7 Y                  {
! `9 E  E1 ]6 ?3 M! ?                    long vbl, vbu;
" M" G+ R4 n: @6 b8 a8 i! G" D                    SafeArrayGetLBound(pvNames, 1, &vbl);
: `9 h  ]. H) K+ s                    SafeArrayGetUBound(pvNames, 1, &vbu);
3 T% P% Z+ ?- |                    for(long idx=vbl; idx<=vbu; idx++)7 S4 U& P% D6 k# ?5 q5 b9 U
                    {2 y5 q9 q6 M& y9 q) a4 y0 C; o/ W) `
                      long aidx = idx;
/ L& ^% H: y! e/ V                       wchar_t *wsName = 0;" f/ E: W# y. Q1 ~* \" r+ q
                      VARIANT vValue;( x6 k. o2 D5 E8 E* V
                      VariantInit(&vValue);
# d1 F) i  j# K0 u3 b- b, Q+ q                       SafeArrayGetElement(pvNames, &aidx, &wsName);! {4 q* n" g+ `
3 Z1 s' O/ [: H, \* L/ e! u
                      BSTR bs = SysAllocString(wsName);
9 S6 o1 F0 B* r; e                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
2 j# _/ n! u/ {9 n0 ^                       SysFreeString(bs);% O* y# P& t1 c. P% X. ~4 j
# ?. V% V& w  J: o7 e
                      if(hRes == S_OK)8 U3 Z: h6 Z0 A% C9 d
                       {: F" T* d1 T. }2 {
                         AnsiString s;/ c' M' {: L  {4 h& g0 {6 T
                         Variant v = *(Variant*)&vValue;5 |7 R. v! W1 ]' y( e, S
                         if(v.IsArray())
! ^4 c& K5 g5 }3 u1 T                           {# q; T( _# B9 T; P
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)0 q5 b6 ]$ X2 O+ r: l7 u
                             {
' ^$ W9 k9 G( o/ U, E                                Variant a = v.GetElement(i);
$ d9 F7 s6 A0 f5 |# a: x                                if(!s.IsEmpty())8 P3 X  c7 R3 L
                                 s+=", ";
! `- [, r  `+ `0 G8 {                                s+=VarToStr(a);
5 ?* U# F1 c1 H                              }
% g6 q4 g5 e+ C3 `                           }! k* v; V0 G$ k
                         else
* O% c. u4 x, ?' A6 I                           {7 R; b6 A$ L; h3 Q9 r9 p
                            s = VarToStr(v);7 s3 b; Y; u. g4 ~3 `- {6 f
                          }
8 o+ j2 f+ O" q6 c1 U                          lpList->Add(AnsiString(wsName)+"="+s);
8 R5 h% N; u3 l9 `& k0 U+ v) D                        }
8 o' g; ~; K( I& h9 q9 Y$ u. i5 T+ w7 }/ V+ {) S& ^+ i
                      VariantClear(&vValue);7 n2 L& y6 ~0 A
                      SysFreeString(wsName);( o' m& ]% V; B( O2 `+ T5 F0 q4 m# \
                    }) }7 @$ |, ?8 Z( G3 w# B2 I4 d+ C
                 }  p. S  \: Q; |, g) p: d; B
                if(pvNames)SafeArrayDestroy(pvNames);1 X$ y  w4 Z$ B; }7 A
                iEnumIdx++;8 C8 j& C- S4 i. t: z; `" Z3 ~
              }1 K$ K) k4 `2 z4 `' p5 M' _  l
           }
' @) V# G4 h0 A: r2 e           if(pClassObject)pClassObject->Release();" M3 n. x, [: K5 w. [1 L* \1 ]+ M2 q4 M
        }9 {- x+ w) c3 j1 K+ t$ G
       if(pEnumClassObject)pEnumClassObject->Release();" P5 Q7 o" a% P
     }
7 J% o7 U2 I% |9 W$ `     if(pWbemServices)pWbemServices->Release();: W  M2 I- j  N8 i) ]  D
  }
) z+ C% D0 p7 v3 a( J' l2 E+ x; X  if(pWbemLocator)pWbemLocator->Release();+ n$ y- ]+ K6 L9 V
}
, S5 c9 R6 q$ r) T4 _( E' H2 @8 H//---------------------------------------------------------------------------
" x$ {: Q% y" e5 c# M
; G6 v& q: I% Q: j/ J! V// 通过 WIN32_bios 获取 BIOS 信息:  e* [/ L* h8 W% }
void __fastcall TForm1::Button1Click(TObject *Sender)/ X: i1 g# `8 m9 r' s" x3 A6 f
{' d+ K$ S( H4 G1 @8 ]& F* @
   Memo1->Lines->Add("================== [WIN32_bios] =================");( }, v5 ~  ~% b3 G* r
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
3 X% o2 y  M2 A" S5 J( }    Memo1->Lines->Add("");, c- q1 s4 \% E' t: T) U) D9 o
}
+ ?: B7 c3 j9 \% S/ U# \) z0 z; _. d* f, K6 O
--------------------------------------------------------------------------------  i, q' O, K! r( d

/ o  H7 e; |( K7 V$ N- c! Q7 h9 lWMI 可以访问的信息类型有:
: O) G# p- }# G+ k1 j' _   Win32_1394Controller% \$ n) x  j$ y5 g# D" A9 y7 r9 C
  Win32_BaseBoard/ ?& D1 z$ i: d2 O/ o
  Win32_Battery" B* G0 e: o& \' c: _, B" d' D
  Win32_BIOS
  [7 E0 z: l; a. ^5 B1 v   Win32_Bus7 v( X3 Z7 L7 I6 ?& Q) B
  Win32_CacheMemory3 Q7 P: `! v, s8 {0 s4 z0 s  ^/ V
  Win32_CDROMDrive$ p% m# H& M% `0 ]7 b* h  `
  Win32_CurrentProbe
; n2 k7 s% o, N$ i+ n, b2 a1 Z   Win32_DesktopMonitor0 @% N) p. m; @! m$ X3 V* a
  Win32_DeviceMemoryAddress. g$ E; i7 }$ J) \
  Win32_DiskDrive  E5 S  R1 G! U- \2 F& `! r% M' J
  Win32_DisplayConfiguration6 l3 D( Z3 f" Z* w$ f8 a: L. _
  Win32_DisplayControllerConfiguration
, a, o5 I% i! u   Win32_DMAChannel
. r' p. D/ F8 x9 S) P   Win32_Fan
) E, v1 \0 Z: r   Win32_FloppyController
0 |4 F  I$ q0 ~" P2 ~8 Z   Win32_FloppyDrive$ ~$ J( w7 S6 b  E$ f, U1 K9 S
  Win32_HeatPipe
5 A9 h# R! w( f5 I; \. U1 W   Win32_IDEController
6 k6 B, U; g9 |# n9 }   Win32_InfraredDevice
6 j& p+ f0 R6 @4 g   Win32_IRQResource
5 ~) I3 o1 A- X   Win32_Keyboard
# S/ w& x5 D$ Y* |6 _' F   Win32_MemoryArray
$ v3 C. G, g4 A! u   Win32_MemoryDevice; o4 T" ~2 B' {5 U5 w
  Win32_MotherboardDevice
& h9 b( c4 K# P6 H' [   Win32_NetworkAdapter
: e. E2 h$ L" w8 I   Win32_NetworkAdapterConfiguration
0 v: I* q1 e9 S+ y2 G! `   Win32_OnBoardDevice! Z0 e, [( y6 C7 Q
  Win32_ParallelPort: {, Y, {3 C+ R# @6 _$ R5 T
  Win32_PCMCIAController
, i- n, x1 H: l& w1 t! e- K) R   Win32_PhysicalMemory' A. r. g( N5 {5 _# W" J! o! Z
  Win32_PhysicalMemoryArray
! d  ]9 C8 D& z$ K( f   Win32_PnPEntity( w) }7 ?( q" \0 `
  Win32_PointingDevice; P3 N- s, B: o% ^  \' W: t- I+ \
  Win32_PortableBattery7 m5 B, Y, R5 S7 C" F  V9 Q! C
  Win32_PortConnector4 G) x( \. K$ `$ z
  Win32_PortResource3 L2 w6 c% }" n9 H8 r9 V
  Win32_POTSModem+ \! _9 U1 q# T; ]9 ~
  Win32_PowerManagementEvent2 P  T2 v4 s& Z: K, f9 U+ H
  Win32_Printer' D( Q: O3 A4 `: l- y) A4 o$ \
  Win32_PrinterConfiguration
9 M' ~; e* e) i+ G2 u- e   Win32_PrintJob$ Z9 ]8 A- ]& T
  Win32_Processor5 B: f+ h7 J+ F$ E
  Win32_Refrigeration; i3 Q6 X- R8 b6 J3 k* E
  Win32_SerialPort( {# \$ \2 ]3 Y% ]* _
  Win32_SerialPortConfiguration, D& Y9 l0 L& {
  Win32_SMBIOSMemory) q0 R3 k4 R# z6 f" _2 Q  \
  Win32_SoundDevice
9 U5 U/ f8 L) X! s3 |: `, k   Win32_SystemEnclosure
  b: o0 m! z. R# k4 f8 `4 |, E   Win32_SystemMemoryResource
/ A. S/ V# b% `* w4 l. f/ [   Win32_SystemSlot
( e; F( S) }5 e! F% U! v# K2 T   Win32_TapeDrive9 q/ }. i- t; H) d* l
  Win32_TemperatureProbe! n) Y* O9 w5 {2 n5 l
  Win32_UninterruptiblePowerSupply) F9 x& F, q* D
  Win32_USBController8 a: m7 k* O( v: [
  Win32_VideoConfiguration
/ F" o9 ~4 ~8 J% U, a0 G   Win32_VideoController9 f4 G+ D) N1 @$ g
  Win32_VoltageProbe' J5 E# u  Y7 T: u2 [

3 E1 ]+ U3 }* M以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-2 17:27 , Processed in 0.020013 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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