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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
1 I8 L6 V3 e! K1 e! ^0 a1 K
8 w. Y. a, ^$ a$ n7 |
4 n2 M9 l2 _6 a. i% p7 V6 T7 o' u6 @--------------------------------------------------------------------------------
9 X$ o6 e! w2 ~3 ]; V4 gWMI: Windows Management Instrumentation (Windows 管理工具)& ]  Z1 \4 a& v5 g- n8 b; a
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
. T, e/ \3 z2 k& d! i- a1 v% S   利用这个工具可以管理本地或客户端系统中几乎所有的信息。7 m' O% l* e( O/ f" E. `$ f3 c' a& B
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 * }; V; S  i* l1 F; k. q

# X3 {- {8 H8 t3 n- d--------------------------------------------------------------------------------
7 I8 u& ?* o/ Y% WBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面1 J4 ]9 q$ n/ o3 Y

* Z. n( w! j4 g--------------------------------------------------------------------------------" |3 O+ t/ J% j& G
① 初始化 COM 接口:5 H9 M' k# U4 d5 m" X9 n
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。: w+ W% w! @/ r- _; ?" r- ~6 _
  这两个函数在 #include <comdef.h> 里面定义。. ^6 _3 f; k6 R* B" x1 {* h

2 R0 P0 o1 v/ {! E2 U0 ~② 获取访问 WMI 权限:
3 T+ g9 c: C' @- t7 e. }/ i1 ~   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);* m7 ^" D  C" |& x
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
$ H$ A3 Q1 Y5 A2 b. _! t  K  t3 o- I# G
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
( ]: E; {* @: h5 U0 \& P7 S/ x2 q   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
; `& o, k7 S' G1 u0 ?5 d2 t8 W2 W! t0 @: V
void GetWmiInfo(TStrings *lpList, WideString wsClass)
+ ?4 j# @: p7 a. D3 e. M" `8 s  }{6 B4 H/ D9 {. i: I) D. p
  IWbemLocator *pWbemLocator = NULL;
* \7 U, G  Y6 k5 {# r3 V" b  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
( D: `/ k4 v, w* ^   {3 K% {, b+ Y( x. R0 G8 |
    IWbemServices *pWbemServices = NULL;
1 @+ X0 w* c: O! D     WideString wsNamespace = (L"root\\cimv2");
2 S) s  N$ v) m6 i     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)& r9 L7 B# g" t) `6 c
     {
0 b2 Y! _  f  ?* i        IEnumWbemClassObject *pEnumClassObject = NULL;
8 t% o$ J" V; e" f        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
1 H' p, p2 D8 Q$ Q        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)2 U0 w2 s8 }# r6 X% q; q- s
        {
  f5 r$ Y% N- X           IWbemClassObject *pClassObject = NULL;
2 Y4 J  {/ O! c- i& ^           ULONG uCount = 1, uReturned;( m- U$ L5 C% s* k% f( V! M* W
          if(pEnumClassObject->Reset() == S_OK)/ L7 z& x1 i+ K
           {
" N9 c! Y! P& @, `1 Y; }: u              int iEnumIdx = 0;
6 v3 y- {1 }" W  [" ~( ?              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)' m0 f# ]( u7 G3 h' W1 p4 }& F! E
              {3 M" ~6 y6 s( l& d) O# Z
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
0 |$ g9 C* N; U4 D& x  m- p* U, ]' ~) k' k, v7 Z" Q2 e
                SAFEARRAY *pvNames = NULL;: d# V/ u) ~+ u, r2 P' w0 j
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
$ k8 S- D! r. M/ t) g" L                  {
  E* S5 E' U: v; }) @* z! Q                    long vbl, vbu;" e& D! D' q! x8 V/ q5 H9 H
                   SafeArrayGetLBound(pvNames, 1, &vbl);
9 X- _. c  J& }1 n, }% I                    SafeArrayGetUBound(pvNames, 1, &vbu);
3 t% S( y) A- z+ ]  e% _                    for(long idx=vbl; idx<=vbu; idx++)" Y( l$ Q4 `" z4 S2 i2 O& T
                    {
6 B* @; t# x3 O) ~4 o) B& y                       long aidx = idx;/ p/ ^9 m& j$ r3 R: F! R6 ]* b) K
                      wchar_t *wsName = 0;
9 W* }  S/ s3 }: Y  F                       VARIANT vValue;0 w$ J4 K4 r$ g! m
                      VariantInit(&vValue);  b$ D  _" E0 A# i# }9 O! G1 l
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
2 ^( s) z, u+ ]: ~2 F* ^: ~5 ~. z4 r: t3 q1 B; c
                      BSTR bs = SysAllocString(wsName);7 B2 k1 s9 r+ E6 e: [1 E
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
/ l9 d5 ]5 S: q9 z                       SysFreeString(bs);0 B6 [4 F. m) g4 o& s! N
. Q" K2 J; I) @
                      if(hRes == S_OK)5 j6 y$ w4 n9 P5 g5 F
                       {
7 J/ u( F- h" n- d                          AnsiString s;" l7 p, d+ ]4 Z7 W1 d' K7 M
                         Variant v = *(Variant*)&vValue;
% q7 l' s* A. v( K  A/ F                          if(v.IsArray())0 ~0 c- P' r0 g" X! p( H' r7 T& r
                          {* l0 _( ~4 S/ f- u3 j8 [) o  C, p
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)5 V) I* g. y0 Y* a" [4 L* D
                             {
; @5 o  ^' h! z2 e                                Variant a = v.GetElement(i);
# r; q/ b3 u% S  B0 \                                if(!s.IsEmpty())% o1 T0 p* u4 a3 H
                                 s+=", ";: E! N/ o' X$ e- a
                               s+=VarToStr(a);1 e6 y0 ]9 z& R' m, d
                             }2 l- K+ E6 k8 j/ V4 y" j
                          }! T1 k$ q/ H1 K1 ~3 W: C3 u' Y
                         else
# i* c! g+ t. P: _% ~$ U: M                           {
% l: ~" a, v9 w0 {                             s = VarToStr(v);9 V$ L, }/ D) M' y8 X" J* i
                          }$ k/ n" L7 d* @; h. P
                         lpList->Add(AnsiString(wsName)+"="+s);
. @) I  X$ L; r2 d/ I                        }6 _/ k# q0 j) Y" j5 u) h

" B8 x! W# z' R3 c                       VariantClear(&vValue);$ K( a+ V4 y+ r1 m( Y) n
                      SysFreeString(wsName);
) g- @% G  j- L6 y7 ?, T                     }' F& _2 x, w6 N- [6 M! A, e
                 }- h; @/ E7 S0 x* l0 T
                if(pvNames)SafeArrayDestroy(pvNames);  J* g, E8 m; T" |% c- X
                iEnumIdx++;8 W% e$ a. {' }
              }9 F: q- D- ?0 M3 k( p
           }
* o$ l+ S0 i/ w7 m           if(pClassObject)pClassObject->Release();
  T6 o6 l9 @6 [9 }6 Q% |         }! w" M0 W4 \  q
       if(pEnumClassObject)pEnumClassObject->Release();# }1 ^# Z3 P1 @) h
     }! d6 A1 }4 x, A; b  Y& j% v
    if(pWbemServices)pWbemServices->Release();
' p" `. D+ ]+ P! s7 t   }
) m7 k, s& U/ g1 X& S# X& z( k& H  if(pWbemLocator)pWbemLocator->Release();' H- o$ S& E5 V$ |# G
}
. p9 v( D0 x9 w//---------------------------------------------------------------------------
! p6 F0 U# O2 Q4 @. `
& \. A# o! O# O/ a; ~% h/ _  }$ l// 通过 WIN32_bios 获取 BIOS 信息:0 a6 v/ h% i% Q5 {* a# ~7 x5 y
void __fastcall TForm1::Button1Click(TObject *Sender)
0 z" g) |8 [8 s' T1 |4 c{. _2 B+ |2 M: v; O# \
   Memo1->Lines->Add("================== [WIN32_bios] =================");
  J! K6 W. P$ ]% E1 W3 n: q0 y- _; O    GetWmiInfo(Memo1->Lines, "WIN32_bios");
$ h9 l" ]: X0 P. k0 F    Memo1->Lines->Add("");
6 c5 }7 p' I2 \8 n! Y: m( c3 }}. v) d5 W& g/ L: H$ ~8 T# V
# w" b7 k: l/ q% M) j$ J
--------------------------------------------------------------------------------# g! e) \6 v- _( x+ ]* H8 w

* c! B: N* p- FWMI 可以访问的信息类型有:0 k3 t# _( k6 W, D( P
  Win32_1394Controller
1 ~+ i6 A( G4 s5 v2 U# R# x0 o   Win32_BaseBoard
$ k5 v0 W( ]1 t* g   Win32_Battery
1 B. R" u0 }8 x( D" r7 V1 s' j' c   Win32_BIOS
. R2 j; W$ H, F; b! ~* b   Win32_Bus: E  {# C" m5 W2 b$ x0 f: i
  Win32_CacheMemory
% w: }2 E6 W; b2 W, K   Win32_CDROMDrive! T. E. x8 p6 w) Z9 E
  Win32_CurrentProbe3 j3 D  q# I# ]: B, d
  Win32_DesktopMonitor
$ U0 n  B: v( i4 g   Win32_DeviceMemoryAddress6 Y% X4 O* d0 e+ C* S6 z3 @
  Win32_DiskDrive  L0 [7 n, W; {! _( ^, A
  Win32_DisplayConfiguration8 S0 |) }) f0 W- ~  s. j3 e
  Win32_DisplayControllerConfiguration
) s" g- f; |6 j; r   Win32_DMAChannel9 s+ e6 {0 U+ f( \) X
  Win32_Fan/ j  r" g, k' h: F- [# a
  Win32_FloppyController
& }9 g! v5 A6 L) m" {4 f   Win32_FloppyDrive
1 _2 q7 t( A  V9 v' y: t   Win32_HeatPipe
' H/ u; v9 {2 ~& W4 K% ^, _2 X  ~   Win32_IDEController
; `+ M; z/ @/ Z( i0 d$ u, T   Win32_InfraredDevice
+ d- Q1 h7 R7 _" T' o# z& ?# w  j   Win32_IRQResource
" s6 b# N$ H9 W. x! M4 d/ e   Win32_Keyboard3 U/ q3 g  s  j. B: l- P7 ~
  Win32_MemoryArray
% B+ A1 u3 G$ q7 L8 l   Win32_MemoryDevice
" a/ v6 `' f' E   Win32_MotherboardDevice
; A) `2 L6 J4 @" N$ T   Win32_NetworkAdapter
- W' F) o  f9 c+ W% T% _+ g   Win32_NetworkAdapterConfiguration, I% D) o, r( l3 T% C) @2 h7 h+ E
  Win32_OnBoardDevice
  ~7 }  K7 U& H$ e! H" B* s   Win32_ParallelPort% t( z' w6 G/ X0 {: N
  Win32_PCMCIAController% T% u* E8 P* W( C; Y8 @
  Win32_PhysicalMemory
7 M! R0 R! @* z" g% l3 r! _   Win32_PhysicalMemoryArray8 [( n4 r6 w& b# \7 j1 `" s) i
  Win32_PnPEntity( X7 ~- q9 u0 \$ a& G
  Win32_PointingDevice
/ n8 {+ o# U  i* W   Win32_PortableBattery+ [9 l, w/ o( M( n' p3 M
  Win32_PortConnector
! Q3 d" b7 ^, e   Win32_PortResource* ]1 O4 N+ ?* K# L0 e) @7 K/ B
  Win32_POTSModem& e. |: ~, J1 C9 a
  Win32_PowerManagementEvent  m# r0 n% V/ [" T9 p: S
  Win32_Printer6 A( o. \& r; @8 ^& t
  Win32_PrinterConfiguration1 v& ?( E* Y( }. o" B
  Win32_PrintJob
4 o) h3 J1 V- T4 B! A) Y   Win32_Processor. |2 v$ y: o" B3 s3 p/ ^) _
  Win32_Refrigeration
: G( k( R5 J* u# R" N( p: A+ t% i   Win32_SerialPort; w; H$ o2 @9 W5 `
  Win32_SerialPortConfiguration; t' G2 I& ^& y1 `* e, z
  Win32_SMBIOSMemory
5 V; y5 ?7 H+ `1 X3 P   Win32_SoundDevice, Q8 E( E0 G& x% ~3 z+ G
  Win32_SystemEnclosure: N; j6 x# V2 R+ X1 ^
  Win32_SystemMemoryResource: }7 w. f) q9 g& P. h- s. l& S) |
  Win32_SystemSlot# o6 l7 V! k" I) w
  Win32_TapeDrive
7 e6 y0 \' t* O   Win32_TemperatureProbe
, {5 ]' {5 W+ L( U* H; P4 ?   Win32_UninterruptiblePowerSupply' \& v. k( Z0 u" m& H
  Win32_USBController, Q" q+ f" {3 ]* n! Y2 m
  Win32_VideoConfiguration3 o, n9 g0 Z2 i3 r# W3 _6 j
  Win32_VideoController+ R. S7 b9 {) N+ C# s( y* Q
  Win32_VoltageProbe8 F& a9 X* b7 _1 k- E, q7 k% A
: l& j3 `1 @* y; [) Q
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-12 03:13 , Processed in 0.019709 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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