找回密码
 注册
查看: 13286|回复: 0

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
5 F% j% I7 x5 z4 l: V4 J; Z) y+ X$ U4 _0 A( k* N) o

3 B) a8 o0 k0 W, ]+ C) ]0 C--------------------------------------------------------------------------------
1 G5 V) w3 C4 g% y4 m5 h3 TWMI: Windows Management Instrumentation (Windows 管理工具)1 T  `) ?' j1 b
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 4 S  x7 u  b. d& e, ]# T  l
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。2 y1 V' Q" r6 Y0 b! {- ]2 Z7 h6 t; l/ n
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
" @. o8 z* d. t! H- w+ @( T8 _2 g
- [/ Y, m7 I5 b--------------------------------------------------------------------------------  N  y1 b: ~  v6 K( h5 {
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面4 g: D2 Z7 U$ x/ y3 s$ ^
3 N0 V. _4 c6 J2 J
--------------------------------------------------------------------------------
1 S+ Z" a7 I. q2 \$ E% A( m① 初始化 COM 接口:
. E* }9 O0 p' K7 R+ o   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。! v7 ]4 @5 r8 D# u2 J9 n6 G
  这两个函数在 #include <comdef.h> 里面定义。
& A9 t0 W1 R3 C0 K" p+ A
2 A" I- u: k. R% X/ g② 获取访问 WMI 权限:8 x! V0 a' H9 v3 M
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
. ?: x4 _4 z" w5 C, R# p   如果这个函数返回 S_OK 获取权限成功, 否则为失败。/ @: I' Y- E7 q/ P' Q

( v- H1 ?& d7 I; s7 Q③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
+ s  `; q; k/ W& q7 f2 D) ?% Q/ x   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
( D5 f1 |3 u! ?" }* R
4 t1 R5 v  R- n) y- w2 `0 Avoid GetWmiInfo(TStrings *lpList, WideString wsClass)* H0 n! g* L2 Q+ x4 D) Y
{
+ k& D& W; h+ e  IWbemLocator *pWbemLocator = NULL;' _# d# ^" \6 ]
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)" b- c: C9 ^6 O( |
  {0 i+ ~( F% G& Z0 \0 Z8 c
    IWbemServices *pWbemServices = NULL;
  Q1 h# x) D& q! w1 T/ ^( s. i     WideString wsNamespace = (L"root\\cimv2");
# t3 k% d0 S/ Y     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)7 Q& I$ l5 j) x( R  x5 N: l
     {. c2 P2 R: f2 x+ L! s" `+ m
       IEnumWbemClassObject *pEnumClassObject = NULL;
  q+ e% s& L8 M% O% H% K        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;" a9 \; N8 \; R  ~/ e7 ]" ]
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)6 @* {" m. o+ U  o( M
        {& s) R/ t3 {3 g* v3 r' @
          IWbemClassObject *pClassObject = NULL;) g8 X/ S" O* e; g* ~' i0 J
          ULONG uCount = 1, uReturned;
1 ~9 I  G, r7 {/ z. k- }9 u5 F           if(pEnumClassObject->Reset() == S_OK)
. P# v0 q8 b# ~) S2 r% v            {+ S" |& m6 t* E
             int iEnumIdx = 0;
' U& }3 j7 C$ U+ H5 Q              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)" w8 o, {2 J3 Q  u; m; i# j
              {
) }; _$ O9 |# {6 c& o2 U# l4 Y; Y                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
2 E5 R9 m7 q* q) _: d' E& a+ m4 M1 j
                SAFEARRAY *pvNames = NULL;# ~+ X2 X1 J/ v  f
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)# o/ n# ~% }* E) B) m( Y
                 {
6 Q; `, F& `: h                    long vbl, vbu;+ A9 X% b8 \4 v8 W
                   SafeArrayGetLBound(pvNames, 1, &vbl);/ k7 c3 R, c' k5 c
                   SafeArrayGetUBound(pvNames, 1, &vbu);
. \7 `9 H  V8 p; {1 z                    for(long idx=vbl; idx<=vbu; idx++), K5 d( R. I; i  |' f% A  x
                    {
  a  Q+ j& y( n9 F, D' R, l- s                       long aidx = idx;" g2 ~  a" U& N$ l" e2 y
                      wchar_t *wsName = 0;
5 A8 C$ k6 |# k/ W- v; J                       VARIANT vValue;' C$ [( o- H/ C5 e& o, O( e8 m
                      VariantInit(&vValue);2 l) a7 \! g* u3 j3 j9 J& r) n
                      SafeArrayGetElement(pvNames, &aidx, &wsName);3 x# Z# \3 d7 ~4 J/ C. Z

9 w8 \2 Q4 D$ |) \                       BSTR bs = SysAllocString(wsName);/ d) z5 B0 Z$ @
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
8 N. a2 R  y6 |% v- r! e9 I9 ]                       SysFreeString(bs);
- H- G9 Q% f, w
+ R) i! U# |& r% T1 p                       if(hRes == S_OK)
) h9 N; E& |( F7 v, }                        {/ [& Z' {7 Z1 l: e- x
                         AnsiString s;
8 L# ]8 D& U% t2 Q3 ]% d                          Variant v = *(Variant*)&vValue;
5 ~* w* T! r4 P( m  P7 O- w- Z                          if(v.IsArray())
' G4 n; S# q4 w* d# H+ c5 m( T                           {
( p8 J  H# |/ @9 {6 `" z) T/ S                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)& s$ R1 e9 g. m3 ?6 n
                             {! d3 y0 E0 z- z% ]  _( u
                               Variant a = v.GetElement(i);  N. @$ P# W& I/ r2 u
                               if(!s.IsEmpty())" u5 u/ x4 \5 @4 N2 H" z. Q
                                 s+=", ";
4 q$ Z8 [/ b7 |                                s+=VarToStr(a);
  j( P: V. G. A2 I' H0 Q( j                              }( Q, ?7 I& A8 Y6 v' t; y
                          }
$ m7 I" B: ^4 d! q. Q* s( o                          else! k8 q! J4 V& }( w% F7 b% c
                          {
: q  ~2 C8 P, q% H0 k* d: a                             s = VarToStr(v);
4 Z+ A6 g$ ]: l7 ?& t8 x& K" w                           }! s9 v( m, \0 A
                         lpList->Add(AnsiString(wsName)+"="+s);
* j, ~, O2 J$ c                        }
/ R/ a  l( i; A+ i7 Y* F6 E% Y/ M4 q
                      VariantClear(&vValue);/ C3 \4 i0 `' O4 J7 J
                      SysFreeString(wsName);
/ X- S. R2 B6 O. [2 k- F                     }
; O" w2 w# I. a1 V) T- ~- b                  }
+ D9 I8 N1 i* {$ G1 |                 if(pvNames)SafeArrayDestroy(pvNames);
, h# L9 S" O, _0 Z1 {3 ~# d                 iEnumIdx++;
$ o8 E! C2 z. J+ T' R. K               }
3 `. O9 ]: _: Q8 d" V            }
# Z) H0 y, l; M           if(pClassObject)pClassObject->Release();
& M! |9 U7 `  b. T* b% B3 D         }
, P' q( Z/ H( N        if(pEnumClassObject)pEnumClassObject->Release();
# \2 D0 q5 W1 K1 o2 i      }
# F2 r7 ~+ `, s7 u2 u; g9 I     if(pWbemServices)pWbemServices->Release();
9 e7 P7 v( f0 E7 t! ]& c3 X2 }   }! n" Y7 ~, t, Y) P$ y
  if(pWbemLocator)pWbemLocator->Release();
2 w7 S% u/ e+ v5 ?}
0 E+ D- o" c8 k6 F//---------------------------------------------------------------------------0 P7 p5 P  x0 ]7 @

( W+ |  L' G0 o! P0 u// 通过 WIN32_bios 获取 BIOS 信息:' [: Q/ h; S( g# {0 r$ S9 g$ E, P
void __fastcall TForm1::Button1Click(TObject *Sender)2 D% A: H5 F! ], N
{
4 v0 n7 e8 `. O, N( {    Memo1->Lines->Add("================== [WIN32_bios] =================");
2 U0 ]: ^5 \  }5 W! g' }    GetWmiInfo(Memo1->Lines, "WIN32_bios");: e8 q! c& j. z9 B5 [
   Memo1->Lines->Add("");; N0 y$ m( ^3 I0 b' y/ b2 C, j- K/ w
}
5 E( I  O6 t& f* o$ s$ e( X
1 ?* b  y0 n. e2 {  |--------------------------------------------------------------------------------
. I: G2 E) @9 e. m  P& a! a7 v- N/ m3 |  L5 e3 m. C
WMI 可以访问的信息类型有:
4 d/ ^8 V7 R# v6 I& ]0 \: i1 F; d   Win32_1394Controller
8 N! d/ u. L) ~7 o   Win32_BaseBoard. }$ N0 ]- l0 |% J
  Win32_Battery
5 \' y* ^. \- w/ A6 `/ @6 ?   Win32_BIOS
: ?5 T7 w  i7 v  S   Win32_Bus/ t" G" ]: V; A
  Win32_CacheMemory# T! n' g- t0 b0 D* T. y* y
  Win32_CDROMDrive: @( e; o- x# y3 E, r) w
  Win32_CurrentProbe  \8 I# Y. m/ F/ M' w6 X3 S
  Win32_DesktopMonitor
1 g6 S8 z: B* T$ p7 m( W, ~   Win32_DeviceMemoryAddress7 X5 z8 z% m- V" G$ s
  Win32_DiskDrive
6 n: S% {1 B+ }, R! d   Win32_DisplayConfiguration! P" ]; _) x- u: ?& h/ N
  Win32_DisplayControllerConfiguration6 S! U) h* b7 [2 F9 T
  Win32_DMAChannel
3 Y9 _& j/ N4 z" V   Win32_Fan
2 V  {$ @* x* {% x   Win32_FloppyController% ~$ K- D+ v  a. n1 h+ ]( w& _
  Win32_FloppyDrive& s- c5 V% h7 z8 L8 u6 @+ K7 U: u
  Win32_HeatPipe$ K6 a/ X% x; W/ R  y$ H' O- i
  Win32_IDEController4 ]" [, t* l1 z1 ^4 b5 `  C
  Win32_InfraredDevice  Z* A! S7 O* \6 }# O, S' j- ^& |3 g* ^
  Win32_IRQResource/ y: W8 K6 i& Q8 K
  Win32_Keyboard, s! `2 i3 V; e5 Q, J6 j5 X
  Win32_MemoryArray
5 C4 q6 A' \6 L# B+ X* }$ n   Win32_MemoryDevice* k! E2 W* {# J5 L
  Win32_MotherboardDevice0 e- `3 w8 {1 N
  Win32_NetworkAdapter
( \: A- [. z' G8 a   Win32_NetworkAdapterConfiguration/ Y  ~7 E' M5 d+ S
  Win32_OnBoardDevice
) y2 E4 ~$ T( `/ o/ {  G: _1 }   Win32_ParallelPort- N% R' a  e5 Z$ A  }. S, N
  Win32_PCMCIAController+ z) s% z4 n1 D: k
  Win32_PhysicalMemory
+ {+ \5 L* f8 F   Win32_PhysicalMemoryArray- X9 s/ @' ~: @; t9 Q
  Win32_PnPEntity
+ w7 H+ t0 A( o   Win32_PointingDevice
% o! O2 c+ r* |9 r4 V   Win32_PortableBattery/ J. E) f! u9 d7 R+ ?! E1 c5 t
  Win32_PortConnector
2 c& h2 Y; @, v* u8 T1 J0 w; w   Win32_PortResource& @6 r+ _7 e$ O. Y# @! o* q( _
  Win32_POTSModem, E$ T( H5 s& w- ]4 g2 ^
  Win32_PowerManagementEvent
7 `4 B, W5 a8 ]" h3 i3 b   Win32_Printer
: ~0 w1 t& C2 g& f   Win32_PrinterConfiguration
$ e. A( F& m; ]8 n   Win32_PrintJob* A# h6 V  F$ I
  Win32_Processor; r9 `$ z( e' k5 k
  Win32_Refrigeration8 P# f5 F$ q2 k$ ]) O! K5 D
  Win32_SerialPort3 X7 t( o& w; I+ y7 b
  Win32_SerialPortConfiguration9 E0 Y' b; o. t& L0 T
  Win32_SMBIOSMemory$ R' a# u% Y; A
  Win32_SoundDevice  B9 _/ H0 Z# g% A% U
  Win32_SystemEnclosure) d5 @! H9 y# [
  Win32_SystemMemoryResource( K7 S( u6 g, Y$ v- `8 A5 ?
  Win32_SystemSlot
( y& x3 g! H8 @. X6 i) q% ]  e   Win32_TapeDrive
) u1 w2 R% Q! D- R   Win32_TemperatureProbe
; r/ E) Q) J& ^) C   Win32_UninterruptiblePowerSupply, _/ z/ V) k5 ]7 ^
  Win32_USBController
/ \; a3 ^9 E2 O  V% l, A   Win32_VideoConfiguration
* k0 j1 z9 ^9 V5 k   Win32_VideoController
1 A+ C5 b* O$ r7 `) ^2 \   Win32_VoltageProbe
" ?2 i! ~/ U7 P8 q1 \& X/ w" O, M' E
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 03:05 , Processed in 0.016713 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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