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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)8 i* R( n1 P2 z: ]/ a# J) G
- G0 [% A1 N# k  n3 h7 V
% n$ p& d( M, m5 B8 |& H
--------------------------------------------------------------------------------7 ^) U  Q4 A/ u4 r: h
WMI: Windows Management Instrumentation (Windows 管理工具)6 L7 v; I: I. C
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
, y% y& }+ J5 g, h, N   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
, b: Q5 F8 m  Z   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
3 |( g4 r7 k+ l6 Q$ G) O
' ^) |( e/ G/ l, [% g- o6 V0 J8 m--------------------------------------------------------------------------------; P. B; K* b6 X0 Q9 s
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
0 q+ o1 w: O: M& c+ }6 }7 A+ R6 j! }8 J3 J& l8 _7 e: m
--------------------------------------------------------------------------------
$ F5 x' I4 H6 i. c. ^8 o, B2 o① 初始化 COM 接口:7 M. }7 o& n( C8 Q! a
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。* w7 h$ i, {3 F! I" s
  这两个函数在 #include <comdef.h> 里面定义。
$ X: k, @) L( }3 F, _6 U5 T" p
# j) B# }0 B& q3 Y* Y② 获取访问 WMI 权限:- n# J1 l2 J1 E  O
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
8 J5 J: U5 K. V, I% b   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
: O. y; Z& S* P# A: M7 p. [: i& q! i$ W8 l2 A% ]
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:. g, B! D0 D' I4 i) ^
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。- M7 t* S7 p4 G# P$ `2 |

4 R* A. Q7 r  G# I5 P& Xvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
( k; t/ _0 k9 s" p- ]" _6 l1 I{- v1 U0 b) Q4 W: F! i( u6 f
  IWbemLocator *pWbemLocator = NULL;
9 Y  ]4 F" H. v9 E" J  W& [  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)! k7 A2 N+ @! E# K
  {
; t# \' {  U4 {/ L3 c% r. r     IWbemServices *pWbemServices = NULL;& J; s, c. ~& v. A
    WideString wsNamespace = (L"root\\cimv2");. Y1 D/ N- x! d) u/ z+ I
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
8 z3 R& C; N# G" r1 M  A      {
' b- ?! ?9 T2 [4 T3 S) F        IEnumWbemClassObject *pEnumClassObject = NULL;( P4 F& f3 m  W& |+ s
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;+ @4 v7 T/ t7 x& g9 O/ B! y
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK): [# h1 O+ ?/ \' X6 p, z
        {
' d: O( K9 d7 S' _0 x( T" ~" r$ ?. G           IWbemClassObject *pClassObject = NULL;
. g" M( f7 @$ g/ f; L) L  \2 U, U           ULONG uCount = 1, uReturned;
8 M' A& C* B5 ~* E$ g           if(pEnumClassObject->Reset() == S_OK)6 }( Q1 \: z% H$ f7 ^/ m
           {$ y. o  K- o# Q$ k9 \+ l) b
             int iEnumIdx = 0;/ R/ O, x" J2 j
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)0 P7 |7 m4 |- T
              {
7 U/ ?! }8 y- @. a: r2 y                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");; Y2 A! I- c6 @$ f1 r( @
, ]: |; F/ k  @8 M' {
                SAFEARRAY *pvNames = NULL;" Y7 j/ A) ~; M, C: q- u: e2 `
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
* }9 I" |  e% \) M1 S, J                  {
9 D9 G2 A5 ?8 a: W  Z                    long vbl, vbu;
! P# n3 U9 h8 @+ G( J6 |                    SafeArrayGetLBound(pvNames, 1, &vbl);( F6 k- K# G# D: a
                   SafeArrayGetUBound(pvNames, 1, &vbu);: g. ?. n. `2 W- R; N: F3 ?+ ~
                   for(long idx=vbl; idx<=vbu; idx++)) K1 L7 f, W. i5 k, [
                    {
# |" I, C- V- X# }) \                       long aidx = idx;- Z" n8 R4 w/ a$ ]- o3 p7 a
                      wchar_t *wsName = 0;  {% t+ w; D- q- D- ]; r. o3 L; Q
                      VARIANT vValue;
' ?1 G. m, }: ]4 @                       VariantInit(&vValue);9 k6 H3 R- N$ B6 }
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
$ M. ]: @) y0 z0 J6 F, }; h9 F
* w( }) K" R0 n& E, c- d                       BSTR bs = SysAllocString(wsName);
0 v1 ~& P1 K  j' W7 |* }( [                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);; L; d: y& a. P+ P: c
                      SysFreeString(bs);
  g7 z3 ^' Y1 k. J2 {& i2 _
- K6 |8 F& ?! }( {6 h* ~& g1 S5 G                       if(hRes == S_OK)
/ k+ G1 m3 R& p. h! {) z                        {
* @' T" w, D+ r4 G3 l+ c5 q                          AnsiString s;; j; D. X1 J- _3 s+ j) t
                         Variant v = *(Variant*)&vValue;( l& k- j, y( h' o( u: l
                         if(v.IsArray())
3 V2 k0 ]3 k) N* E; m' R$ Z/ ]                           {! m5 M2 \. m1 k+ o2 G7 s, D
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)* z# F6 s( g' M
                             {2 b9 j& A! Q' A; p! E5 y2 {
                               Variant a = v.GetElement(i);
: A! @0 x9 j, X& D. D                                if(!s.IsEmpty())
3 w8 W+ I4 i# {" P& y                                  s+=", ";: T- o0 ~, K( W. T6 ]
                               s+=VarToStr(a);& y, S) r0 G  V3 z8 {! v
                             }+ S9 O9 [, U7 d0 O+ A2 d
                          }
& s1 r) {7 d2 N  g                          else8 [! p1 K0 N$ @' \. ?& Q
                          {
# H# k" ^' t5 z8 x; k                             s = VarToStr(v);6 {9 l% F% z9 v3 Z
                          }
9 x7 z8 U2 c3 F3 s4 Y. c+ {                          lpList->Add(AnsiString(wsName)+"="+s);& P) _+ p7 x8 o) H
                       }
$ R8 p8 q$ K( G9 p" M% j/ Q
5 `$ ^1 c6 @- }  e3 }% r                       VariantClear(&vValue);
' g3 N& G- l/ l' t! w) J! r                       SysFreeString(wsName);
- x0 v# A1 l. ?6 B                     }! s4 d( ]  j5 L- t# n2 [
                 }" `+ a1 G% b% l' E" I( [
                if(pvNames)SafeArrayDestroy(pvNames);# z# z0 H% s( \' U, F4 j
                iEnumIdx++;
4 V' r& Q0 t* b( U2 \& b+ x               }
( _- I7 d! w. z- N$ a            }( I; b% z$ p- M3 D2 m( e
          if(pClassObject)pClassObject->Release();" j. W; i7 z2 {
        }
' R. e0 A8 X0 [9 h. Q; \        if(pEnumClassObject)pEnumClassObject->Release();
3 j" K' Q7 l( I( p$ U  h5 F6 s      }
# T" T8 A! n; ?& W: w- {     if(pWbemServices)pWbemServices->Release();
0 m* Q$ J! a+ h/ _# ~$ N4 f   }! O$ H6 N- W* |% X* A8 a! r
  if(pWbemLocator)pWbemLocator->Release();
- Z) N+ x0 ~. X3 |& p7 T* G}
  J) V  n# W- j  n  |  s4 B0 a2 n//---------------------------------------------------------------------------
8 B. D; l: _1 v9 _8 `. S1 Q6 q6 S. C. Y
( \2 h; h- ^' Q' W" A# \- }/ v// 通过 WIN32_bios 获取 BIOS 信息:
* U) A' y& ]* q: Ivoid __fastcall TForm1::Button1Click(TObject *Sender); ^' J9 ]1 X  S: f7 m( U7 {/ y' M6 G
{, |3 |$ P. t" Y" k7 y
   Memo1->Lines->Add("================== [WIN32_bios] =================");6 H& D6 _0 P8 |* y
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
% _# f3 L" N* \    Memo1->Lines->Add("");
' A. c) e* u/ ?% W- x! b# z' i}
; b6 l3 m9 F5 ]: W$ k. E* h( _, j
) u# q+ f- `; X& N+ j--------------------------------------------------------------------------------
+ \% ]1 G1 ~( x  L9 L' h6 E, E, ~) s& _, u
WMI 可以访问的信息类型有:3 R7 [' G3 \( k) B) G8 W
  Win32_1394Controller
- J$ D8 _& Q. I8 |   Win32_BaseBoard( O- T. }+ f4 ?/ B' b) h: h
  Win32_Battery4 ~' X1 C* b! p7 \0 k2 I
  Win32_BIOS! E; w2 w) Q/ E0 m
  Win32_Bus
- T4 f, Y+ U; h$ o   Win32_CacheMemory$ Q& ]0 q1 z! v% e! P/ V
  Win32_CDROMDrive* ~# @4 r+ g' [
  Win32_CurrentProbe3 B6 I$ I3 ^) U- ^
  Win32_DesktopMonitor/ k3 \8 @/ I/ q8 v) T7 f: r
  Win32_DeviceMemoryAddress( B4 {! l1 l% a1 \
  Win32_DiskDrive
/ g& v: B' Y, b   Win32_DisplayConfiguration
3 C$ ~, b8 z: m8 _   Win32_DisplayControllerConfiguration
' P7 t& ]! ]3 n' Q   Win32_DMAChannel
, L! x/ w& W" W+ X$ w9 Z. v8 M   Win32_Fan
0 B3 q6 z2 |4 F; O6 P# @" D5 _   Win32_FloppyController7 _) I3 s0 ~& y( c
  Win32_FloppyDrive) }, G+ g8 _$ ~* v8 K; y2 D
  Win32_HeatPipe) j, \( D8 k; z: C3 w$ v
  Win32_IDEController
5 o# }4 r7 U4 F/ s2 |" y   Win32_InfraredDevice7 I  v4 g6 P$ f
  Win32_IRQResource( L- {1 ?/ B7 j, x1 T7 p3 L
  Win32_Keyboard
' \; s- y" f6 E; W! E5 Z% N# r0 S   Win32_MemoryArray
0 w, B. p1 s* E) I: d* {/ U# ]9 L   Win32_MemoryDevice/ k" f# d" u- _: ?7 p1 C+ O
  Win32_MotherboardDevice
3 n! {% q- L% t9 A; y1 v- R( K   Win32_NetworkAdapter8 ~6 a# D) w4 p. o7 J6 \! n$ P
  Win32_NetworkAdapterConfiguration
5 O4 [# E6 a( w" y4 l6 _   Win32_OnBoardDevice
; ^# [0 \8 }& w7 G   Win32_ParallelPort
& ^5 q; `" F4 E8 n# @( o   Win32_PCMCIAController$ |! t* {9 {) a# o9 O
  Win32_PhysicalMemory
8 {! y1 H  o0 T3 P! a" g0 ^   Win32_PhysicalMemoryArray% u! r: X. k1 p( Q
  Win32_PnPEntity+ G9 Y% W) p! t* i$ H5 m8 Z
  Win32_PointingDevice- M* l7 W* W5 k3 Q1 d, @. A4 r
  Win32_PortableBattery
3 Y  q1 ^+ g" F3 g: P   Win32_PortConnector0 ^- M/ [6 v* i9 P/ z# t+ z
  Win32_PortResource
8 Z- e/ ~' y2 R  B" a, b- ~2 F   Win32_POTSModem
6 N4 }5 Y1 C% G) b   Win32_PowerManagementEvent
. a7 ^  ]4 h7 `  d% I   Win32_Printer
5 Z6 o' N7 E$ U5 E, x. J# K5 W. s   Win32_PrinterConfiguration
- O7 o1 O, I4 s   Win32_PrintJob* }4 b! O/ I. U+ [1 b- H* y4 j* |2 x
  Win32_Processor: {- H- Y& I  t4 Z
  Win32_Refrigeration& U4 x/ l. r& ]7 x" u  Y
  Win32_SerialPort
% R) l& x% K* F$ P( d( s" r   Win32_SerialPortConfiguration
* C" G+ R$ f, O! _# e  f8 h   Win32_SMBIOSMemory4 Q  B9 F8 F6 s, `2 G
  Win32_SoundDevice# f5 x# y0 p( _
  Win32_SystemEnclosure2 a7 b6 e# x2 G9 K3 b" v3 `
  Win32_SystemMemoryResource2 i% B2 r/ ]" d9 E# @( q( }, w& k
  Win32_SystemSlot% j: q  ^* }4 b
  Win32_TapeDrive7 }# [3 L4 i* K; d, U' m
  Win32_TemperatureProbe( R6 S8 s% H: c
  Win32_UninterruptiblePowerSupply
  L) S* G% j5 p4 W- p, I. |; Y   Win32_USBController
  J$ M% P( W+ S6 R   Win32_VideoConfiguration& j% t" ?+ R1 U  T4 W0 [
  Win32_VideoController- e9 X  B1 O/ Z! f) S# @0 S# n
  Win32_VoltageProbe
2 S# c* J0 ?# C8 k% r( e9 {- V9 p! ?! N: q0 E% Z5 f% K
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-8 03:41 , Processed in 0.018005 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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