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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
8 x  {  _$ l- Y# a) y1 o
8 e$ h/ [. G' Q! W' G* ^% A: L* H  e- d! }+ u% o* a
--------------------------------------------------------------------------------
2 E0 F$ b2 v! i( a! G9 LWMI: Windows Management Instrumentation (Windows 管理工具)
9 i- g: x( M& f* h7 S/ v   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
$ T7 u6 R: f; q) V/ _3 e   利用这个工具可以管理本地或客户端系统中几乎所有的信息。  w  ]: q* b* j+ ^6 Q# E& n/ I
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
* P/ i5 u1 F. [/ [+ e) |0 s3 U0 Z
--------------------------------------------------------------------------------
. N/ d4 n/ w- `BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
$ c& L+ [! @" Y! x7 F
% p7 C4 o% d. _) _0 P--------------------------------------------------------------------------------
2 \5 _, T7 W* g" z& P① 初始化 COM 接口:
, @1 D% M+ M' e7 s: L3 y   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
1 S) F- T/ T& e: S% i7 S( j   这两个函数在 #include <comdef.h> 里面定义。6 o( N& f' n% q2 L; Q7 U0 r

, B; d& x, q# [$ N' X) P② 获取访问 WMI 权限:
$ E9 @% T. z8 U- f9 M- q   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
5 g1 l* o6 o" a9 k3 n, L' O, X   如果这个函数返回 S_OK 获取权限成功, 否则为失败。! P3 T5 w3 b5 W/ L% M  r  @! v5 M

) |' B$ n1 ^  f6 w8 D0 n③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
% ?, m. P: E7 w( {# u+ K- @8 i   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
  i3 ?+ J$ t5 J6 J+ i6 ?9 a: j, o2 i# ]3 Y& I; Q( c
void GetWmiInfo(TStrings *lpList, WideString wsClass)
- l$ J: i& E2 c{
9 V* d% u. \+ }8 q5 q  IWbemLocator *pWbemLocator = NULL;
' W- n: q& j& p9 t& j! j  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)0 s' W' l, c: y5 E# v0 w4 W
  {
% w5 B" L7 Z- O2 r  C% n4 r1 i0 u     IWbemServices *pWbemServices = NULL;( R2 [1 ~# w. u( I( S1 b& @$ S
    WideString wsNamespace = (L"root\\cimv2");$ Z) o) V% t( T; _  b: A7 Z7 |- s
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
: a7 _4 I6 i4 g" J0 w4 i. ^  F3 a      {5 K4 X2 J* _8 \* @3 ~" }/ C8 a; ]
       IEnumWbemClassObject *pEnumClassObject = NULL;
1 q0 Z; p8 |, [2 `0 h        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;& H2 m1 U4 ]1 [0 E" a1 G
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)" O+ [7 a8 A5 Z2 u- o5 E$ x, `- {
        {
: c0 G6 G# s- g           IWbemClassObject *pClassObject = NULL;( z3 b- V/ i8 ^1 b# {; @3 J
          ULONG uCount = 1, uReturned;
7 ^/ y: H( d( E( B. p! Z6 V           if(pEnumClassObject->Reset() == S_OK)
7 _& }9 O' E9 L; C            {/ h, X6 g+ I6 p6 L! n2 H3 Y
             int iEnumIdx = 0;  ]3 i% O0 ?) S6 Q1 E/ W/ [
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
# i5 b* k5 R/ L) b               {
4 p( Y, C3 z8 e                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
* N1 i; e3 `8 v5 ~9 x$ ]1 Y4 o7 K6 X
                SAFEARRAY *pvNames = NULL;0 h4 C$ [* E& T% C
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
# t* m* d' R( ^- P7 s  M                  {
  `6 N0 A9 [( _                    long vbl, vbu;
5 }. P4 l. Q  x1 e6 y% R. C( L                    SafeArrayGetLBound(pvNames, 1, &vbl);
5 j' r# P" J& V) D( h  y                    SafeArrayGetUBound(pvNames, 1, &vbu);; K7 q4 W8 m9 B( U
                   for(long idx=vbl; idx<=vbu; idx++)
! G0 [' c+ Y8 \- J( m8 j                     {2 Q7 e. p; q5 P: m
                      long aidx = idx;0 y+ Z* `& n3 q3 [2 b! p
                      wchar_t *wsName = 0;
' C6 Z# \, u  \  B                       VARIANT vValue;
- k, @' `+ y& ~8 J0 J* ^                       VariantInit(&vValue);
. B% j( p. n9 {                       SafeArrayGetElement(pvNames, &aidx, &wsName);" @- ^* a" P$ T! J1 f& d0 G, d- L: C

, j( e% j2 ~# R$ P; D                       BSTR bs = SysAllocString(wsName);
1 }. D  r9 e. A, a9 p                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);; W) }! E4 O5 H' f) F4 `
                      SysFreeString(bs);
8 i' d3 b0 K$ {6 L! H+ r7 k( J7 @$ y9 n: b2 Q2 Z6 o- `
                      if(hRes == S_OK)
) Q$ d% w' W% a                        {! e/ _; ^8 A2 j
                         AnsiString s;
, z- w4 J" ~4 ~, o/ n5 ~/ C) X                          Variant v = *(Variant*)&vValue;
4 ]% z" Y. A6 n- F                          if(v.IsArray())1 c" i7 Z& L) M8 v: p( J. Z. Z& \& a
                          {1 t( G8 W/ Z) q
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)* V' |1 |! m8 F/ j( b( Q9 d
                             {8 |. W$ U& r* S; ]: w; ]' M
                               Variant a = v.GetElement(i);8 E1 x" h9 b4 m' C% f' o5 d
                               if(!s.IsEmpty())
+ s& l0 F3 i3 N/ V/ S5 c0 j                                  s+=", ";8 r. d1 K6 M7 d. @
                               s+=VarToStr(a);
* d1 V6 \/ K, r$ r; Q                              }
9 l# a' C6 T: ~- d: {& c) f8 a                           }
$ @7 ^# p  e+ w% y2 R. v6 |( e                          else
9 Z' U! }. b& t5 E                           {7 X( h( L" T* N; d
                            s = VarToStr(v);4 ]' G$ U; v7 D! @
                          }; I$ g! }5 Q4 j, f7 Z
                         lpList->Add(AnsiString(wsName)+"="+s);6 |' b( J0 c% O
                       }
* z% j, v  ^( r1 Z$ A" K) E' Z* W, s+ \5 Q
                      VariantClear(&vValue);0 A8 m2 }/ D0 v0 A
                      SysFreeString(wsName);
! }2 m; g' h7 v6 Y# @- k3 n4 i                     }
/ Z" [7 Y8 w2 [8 ~                  }
+ q' @) C' b( O, q4 y, i                 if(pvNames)SafeArrayDestroy(pvNames);
2 ~* v* i# `  ?! g5 T                 iEnumIdx++;8 ], ~! i& S: ]0 C. k( P/ X
              }" f% o/ G% k( T
           }. H6 d5 n4 t9 ?( r0 H! V* v8 l
          if(pClassObject)pClassObject->Release();. {4 J$ `7 V& P
        }
4 N# h; O! {! k6 v$ W        if(pEnumClassObject)pEnumClassObject->Release();
  m; Q  Z$ J3 _1 }      }/ T$ @/ O1 R- x4 b+ q2 u. @
    if(pWbemServices)pWbemServices->Release();5 z  ]$ O* O+ H1 Y
  }
  ~; m& i& [9 l  if(pWbemLocator)pWbemLocator->Release();, Z! n/ H  j" V" R3 K* v0 Y
}
6 c( M- I  Q3 f1 S//---------------------------------------------------------------------------
8 L. V% A! S" m( O; m
- @; @/ T# a# C. S, w4 T# r// 通过 WIN32_bios 获取 BIOS 信息:+ \/ @/ s& u9 e& j! T
void __fastcall TForm1::Button1Click(TObject *Sender)9 ?3 X$ @' [* ?% _- N" }* h
{
7 |- L6 N6 H5 Y. L    Memo1->Lines->Add("================== [WIN32_bios] =================");
: J9 h7 P, |2 y    GetWmiInfo(Memo1->Lines, "WIN32_bios");
( U3 z* j1 ~& Z' x3 c    Memo1->Lines->Add("");
( m5 Z, n1 f2 ^}  Z* v& {9 r* b9 Q' n" S/ z1 m- K4 i

/ v2 v% g' t+ z. |--------------------------------------------------------------------------------" E: V  I, E3 n5 W4 |4 w% d; o

. c1 B% X7 D$ _7 M, X) PWMI 可以访问的信息类型有:
! v$ ^/ K' e6 N& q8 V   Win32_1394Controller+ g5 y8 g/ s. _4 k  i8 `
  Win32_BaseBoard. G& {8 V8 [; j. [+ u# g
  Win32_Battery3 b/ x: a6 B! p- s
  Win32_BIOS5 i6 m. A+ b+ d
  Win32_Bus# q9 f' o) s$ P, n. g/ t) n
  Win32_CacheMemory" f( S+ Y* d# |' y: m6 R
  Win32_CDROMDrive
- b) ?) y. O1 `0 F   Win32_CurrentProbe* n; F# K6 a( l9 Q3 S4 {
  Win32_DesktopMonitor
9 ~' |7 K( ]9 Z) c7 X   Win32_DeviceMemoryAddress1 A  b: W7 _/ Q. u. N6 o  t
  Win32_DiskDrive
7 t* {& e  M3 @7 Y   Win32_DisplayConfiguration
) P. e+ t% h9 F! ~   Win32_DisplayControllerConfiguration, l5 o- g# h# p) n  |+ v' z$ Y
  Win32_DMAChannel1 o1 T% ?0 L6 i+ p/ }9 G
  Win32_Fan8 M# ]) \0 H0 Z* C# {
  Win32_FloppyController! S" V4 r# \! @0 I
  Win32_FloppyDrive6 R2 I# A( t. a
  Win32_HeatPipe* n7 B; p# j$ P6 m" s- }+ ?% P& l
  Win32_IDEController: x+ v5 N4 W5 \6 l5 ^
  Win32_InfraredDevice6 Q$ l1 B4 E5 y6 t5 T. f9 A+ [" m
  Win32_IRQResource
0 @6 h- f" F: H& S9 S# ?$ a   Win32_Keyboard/ A7 T& D- v# Z, _' t: v
  Win32_MemoryArray1 A1 S& `  l. ^! l: ~
  Win32_MemoryDevice" R8 G6 g; \2 g+ F
  Win32_MotherboardDevice7 F* h1 `/ U1 r$ y% W. k( m- `# C8 }
  Win32_NetworkAdapter
, T: q1 d! z! Q& i   Win32_NetworkAdapterConfiguration
: w4 G" f9 m$ _" v   Win32_OnBoardDevice4 v6 U6 z1 X/ p" [( m
  Win32_ParallelPort& g2 S& Y2 ~5 D- a
  Win32_PCMCIAController
' y5 H  u% P8 O6 N0 ?! _$ N, s; D   Win32_PhysicalMemory
+ R3 ~; `/ V  g   Win32_PhysicalMemoryArray
! c3 R; ?  K/ B$ d/ Y   Win32_PnPEntity
1 Y# ]% Q- H( W1 E2 @. H   Win32_PointingDevice
; @4 V: o# y1 u7 h   Win32_PortableBattery
, n, {. M' S2 v! t' \3 T   Win32_PortConnector) t$ H. p6 h; W1 d" F+ a1 D: N9 n% D
  Win32_PortResource$ r8 n$ }, D7 ^& _( ~
  Win32_POTSModem
7 D7 b1 Q. n2 E   Win32_PowerManagementEvent
* Y4 C0 |9 _. S   Win32_Printer' C/ @0 N! m* e$ |  d- Z
  Win32_PrinterConfiguration
) B1 ^/ [  r  V* Q1 a4 z   Win32_PrintJob
( F( K( O, X4 j- W3 X4 d: q2 K/ ?   Win32_Processor' ~3 W# K9 f6 ^% [7 D5 G) W
  Win32_Refrigeration# m! U2 E4 c# {# [! c: Q* q
  Win32_SerialPort
2 J3 y7 Y6 J; e! D; l! c  J& S% m   Win32_SerialPortConfiguration1 `0 l% x' O- w
  Win32_SMBIOSMemory4 ^' W& L6 B( H8 Y
  Win32_SoundDevice
/ \4 I& s# P; P- G9 _) Y8 u4 o   Win32_SystemEnclosure) \- v' a& e: e+ Z
  Win32_SystemMemoryResource! y+ y$ e% t+ U7 o& ~4 @% ?* N
  Win32_SystemSlot
9 y( E( G# }' h( K1 A   Win32_TapeDrive7 `2 L' M* e3 ~! g2 L
  Win32_TemperatureProbe
  y3 |" O% A' J. n7 k) U2 N   Win32_UninterruptiblePowerSupply
* b* y& S% e" R0 V   Win32_USBController
; e7 p) g5 M) S0 K   Win32_VideoConfiguration7 y; Q- y, }9 U2 X$ ^8 B4 c; R
  Win32_VideoController
( J6 w$ h- T& B# @   Win32_VoltageProbe+ V- Y9 Z) s/ R5 l
$ C1 m$ F* o: K
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-24 05:34 , Processed in 0.019379 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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