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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)1 d$ P; \/ q1 L( d- d2 l* U
/ u/ B2 K) T* n
8 d; i( ]5 j) v  {- D: B" Y
--------------------------------------------------------------------------------
/ G4 c4 E. @: x+ Q) LWMI: Windows Management Instrumentation (Windows 管理工具)
/ q  G5 z: T! z- ~- h, C8 m   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ! b# J2 k: J1 z
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。) J: Y! v1 M. X6 V7 X8 w0 ]" }9 c
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
" P: O# n+ V! y$ Q2 H( h
5 }( N* x. U1 j& H--------------------------------------------------------------------------------8 P! |6 U1 {! g7 a& m4 ?$ s# j( A5 Z( p
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面& @6 \; u4 b& C- a

0 a% A# `8 ?4 w5 C2 X5 E' Z& G--------------------------------------------------------------------------------
. c8 ?( \( G6 `3 n* e9 I① 初始化 COM 接口:. X8 l) y  r6 `. c0 {) |
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
% e/ w% \6 q2 l" Y   这两个函数在 #include <comdef.h> 里面定义。
( S# Y9 N4 x; P7 {" h
. V0 x) K0 ^0 R7 V, ^: j" W② 获取访问 WMI 权限:3 b! `. x# H, {. v& V" M
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);/ [. r$ b. b6 p0 L  r
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
) X& ~. K4 c8 M& o' V- T! s; ^2 O: [6 }( F% V7 q& a
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
1 z  m6 \1 h/ A! C8 Q, H   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
" b% B/ F) O$ x5 ?( L/ ~" U+ A% Q& Z7 v% G$ e) o
void GetWmiInfo(TStrings *lpList, WideString wsClass)1 ~) w/ W6 |5 M& l
{$ ?! `7 [3 T" k$ L1 l
  IWbemLocator *pWbemLocator = NULL;
# n" A  ?* w8 M* r! ^  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
& v8 m2 [2 M1 d! f( {4 o" \2 I' ^/ T   {
5 s- w8 d3 j- l% V     IWbemServices *pWbemServices = NULL;* s8 w+ @5 Z* |: M7 V
    WideString wsNamespace = (L"root\\cimv2");6 p: P. F3 Y) f4 k. R
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)2 d' ^, z8 @# z- t5 {. O& y
     {: H9 O. G1 j% ^5 I. s1 @
       IEnumWbemClassObject *pEnumClassObject = NULL;
4 _+ |1 _& i. ~  h        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
7 [5 A/ t: W+ z3 j" C0 P  y/ @        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)/ q) ^5 B' a% c/ v# D6 D! p0 W$ F
        {- r6 F  e7 `1 D+ D5 t% t3 v
          IWbemClassObject *pClassObject = NULL;
# S) p8 }8 ~) [7 `* k9 E- V" E           ULONG uCount = 1, uReturned;8 w: a( k8 E2 A6 y0 g3 ?
          if(pEnumClassObject->Reset() == S_OK)( c9 @* P, U9 b' |2 q
           {
' n. J% i6 Y$ t8 ?! a              int iEnumIdx = 0;8 i: M; n0 d7 r* i$ k0 O1 Y; `
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK). j& T1 L3 Y9 D( \
              {) j  y' f6 M3 v2 U3 D3 A% ^
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
- E" M1 y' g) m8 O
" [1 m2 E- L2 }4 w) |                 SAFEARRAY *pvNames = NULL;
9 s7 Z6 o) V: Q  |9 H                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
* M" \5 W% D" a0 \; R+ G* l                  {
  Q7 p7 U$ ~. s. Y/ J$ v                    long vbl, vbu;
( H5 y" |. p- ]% i( k, R% u/ R                    SafeArrayGetLBound(pvNames, 1, &vbl);  k/ V( T' h. N, W4 l* ]% f
                   SafeArrayGetUBound(pvNames, 1, &vbu);
7 k! m) v& x9 P                    for(long idx=vbl; idx<=vbu; idx++)
9 U  u1 `/ V6 n5 B6 G, u+ }8 D                     {: J) O( G3 F/ O1 |$ e3 J
                      long aidx = idx;
7 z4 N0 d5 K* G' L6 J                       wchar_t *wsName = 0;
# g* C% p% J' t                       VARIANT vValue;
3 g3 o  U# v3 N( y                       VariantInit(&vValue);- s  n& t; w5 n2 z: H
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
5 V  Q# f+ q2 G8 t( U' @# K5 v7 Q8 a& H
                      BSTR bs = SysAllocString(wsName);' T9 c" V! _3 F& V* ?# N2 Z7 l
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);, _! ]' N, d6 u  }( q3 J
                      SysFreeString(bs);
# A* u1 a, p5 T* m
8 v7 n3 q& d9 m: m                       if(hRes == S_OK)
+ i- J% j  G$ r                        {
7 D+ e6 v" |$ z7 A! z                          AnsiString s;
) C, J+ j* M0 t- A                          Variant v = *(Variant*)&vValue;8 T. N& o4 G5 h0 N* k2 E* S- o, L7 g
                         if(v.IsArray())8 g1 C5 T' b' z0 f
                          {1 Y. }1 B0 N0 o. g. C' N* c
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)5 f0 j2 ^1 q1 X  u+ y0 W' d! i6 G
                             {- I; K- P$ ^  k
                               Variant a = v.GetElement(i);9 e$ G' F5 Z9 W/ P8 `, {3 ]; T6 {( F
                               if(!s.IsEmpty())3 s7 d5 ^# d9 f: u; W6 f6 a% {
                                 s+=", ";
' M. f1 H+ z) t7 [) Y                                s+=VarToStr(a);
+ M! |( ~; ]" M9 d  X: D8 l2 Q                              }1 |/ S. A, Q% u7 s: `4 y! z% g
                          }1 @, l8 \; M; p8 p3 t
                         else- X6 ]  N( d. e  a
                          {2 c; x, h5 N, ?
                            s = VarToStr(v);
. z% H" [7 |& G7 W                           }, B* ]! e  ^; ^9 n6 v7 M
                         lpList->Add(AnsiString(wsName)+"="+s);
9 T+ V( B0 C  f! E/ h( f: q                        }5 [1 S5 Z% E  u! w7 y9 K

  V1 _& ^. z  U: T* I" q: I/ K* q                       VariantClear(&vValue);& g9 l* v: [: G& u7 W1 I
                      SysFreeString(wsName);2 X- G, T9 [  w% v. t) ^
                    }( s" W" x& _8 a; A( y* y( a
                 }
7 B9 A9 J# A3 {' b                 if(pvNames)SafeArrayDestroy(pvNames);7 V$ u5 k, e9 L
                iEnumIdx++;- k9 Z) H6 }! l
              }1 \8 y, X6 ]& D! p. d
           }* o+ i/ k! }; q$ b- `
          if(pClassObject)pClassObject->Release();/ |8 R+ ^% d! B6 t
        }
  P1 c" R; }1 Z        if(pEnumClassObject)pEnumClassObject->Release();% F! O* g7 {2 [; j( Q1 a' P$ l* l
     }( G( D/ j) L1 g% w! t5 g9 \% ?( V6 F
    if(pWbemServices)pWbemServices->Release();
4 p- a+ O0 l8 O+ S   }
3 h0 ]' ~" e9 c# Y  if(pWbemLocator)pWbemLocator->Release();& j( R7 }2 E0 S$ m6 z
}; K4 `" L4 |. W4 R
//---------------------------------------------------------------------------5 X; L  c: f, Z# S2 \1 G
* m/ s4 \1 U& U/ `! }+ e/ s
// 通过 WIN32_bios 获取 BIOS 信息:
! A4 L" D+ `6 Xvoid __fastcall TForm1::Button1Click(TObject *Sender)8 H+ ]$ @" V7 T: Z' x# N
{
+ P* t3 K; s1 S- T2 M# h' [    Memo1->Lines->Add("================== [WIN32_bios] =================");
" @6 K0 L3 {& x' Y3 [, r    GetWmiInfo(Memo1->Lines, "WIN32_bios");
% v$ f( P5 p% X  V6 q9 g    Memo1->Lines->Add("");
, ^0 E' M/ e0 D* v) q3 B, t  Y; e}3 T2 Y( ~- h" I6 K8 [
/ h' Z- e& }# d
--------------------------------------------------------------------------------
. i# V% t( |  I4 T& g' @) v
( ]( W8 f+ q$ W8 O8 p# {- [WMI 可以访问的信息类型有:- ?8 g# u* ^4 s/ H9 h0 X; C
  Win32_1394Controller1 P8 ~/ N+ W# ^; Q6 w: c
  Win32_BaseBoard
5 i* N! ]6 E9 {2 E. r# i1 n   Win32_Battery! ^' a5 ~: |; D% S" _( g
  Win32_BIOS
1 C2 j0 K$ t! x2 M5 h' l3 \   Win32_Bus# K2 N! k( M9 b% h% g
  Win32_CacheMemory
0 W2 b& u" ~4 l! q0 {- l# J  H   Win32_CDROMDrive& Z" i) B5 T3 I/ `
  Win32_CurrentProbe
( q$ Z, {+ r: W3 U5 D   Win32_DesktopMonitor5 Y9 w( Q. V: W
  Win32_DeviceMemoryAddress
* c; ^3 ~& S* C, A% {( N3 s$ M; \. L   Win32_DiskDrive
: U, Q& W5 h# E) V% N   Win32_DisplayConfiguration7 m' W3 ^3 z' `9 v4 A- M
  Win32_DisplayControllerConfiguration
& G; E, S- E5 \$ |0 s, q# _   Win32_DMAChannel
" [3 g& f, u( n5 c1 M   Win32_Fan# f! I4 Y$ m9 A, N, z$ c% ^2 y
  Win32_FloppyController% Q6 E/ _1 p# b$ c" B" s' b
  Win32_FloppyDrive
: p2 ]( `0 H3 k, q3 o7 f6 C   Win32_HeatPipe9 t& m  L( |5 `4 e; e# D
  Win32_IDEController
9 ^; w0 _# c* f: x. O* U1 A" A' G   Win32_InfraredDevice
- y: L5 q' a  K' Z( C  f   Win32_IRQResource6 `, _/ o6 g; N. R/ B
  Win32_Keyboard7 }" T$ [2 N. J; f% K
  Win32_MemoryArray& A9 R+ p& ]9 g$ J) m* F$ y7 a
  Win32_MemoryDevice! h, `9 B1 \, l' u; L
  Win32_MotherboardDevice. z0 x: V5 G6 N4 B' n
  Win32_NetworkAdapter
8 \' R9 w1 m( n3 V2 \   Win32_NetworkAdapterConfiguration
1 x* B0 z! P. U) n   Win32_OnBoardDevice
* D* O' y. ?: O) i5 U6 T   Win32_ParallelPort- U- d" t+ T$ ~1 a
  Win32_PCMCIAController  U) j5 H6 l- D
  Win32_PhysicalMemory
7 x1 a9 J% A& M4 c$ O- @6 h   Win32_PhysicalMemoryArray
2 w8 \) C( d9 d6 I  q  z   Win32_PnPEntity5 j- l% ^, y' g5 Z9 B8 u/ u4 T4 _4 ^
  Win32_PointingDevice
) Q6 {$ V: h, i, [; n) m   Win32_PortableBattery
# J. P5 N3 O9 f2 i3 t   Win32_PortConnector
# Y% M' h9 m# K8 Q. f   Win32_PortResource; X7 F1 l8 s' o! Q! O1 l6 o5 i$ d
  Win32_POTSModem
& ~. y# h8 C; r5 X   Win32_PowerManagementEvent
$ R" R4 J: \' @* L4 M- X& g   Win32_Printer
3 _- B* q! n  ]/ ]3 s2 t- s( W   Win32_PrinterConfiguration9 ]7 v1 N" }7 y
  Win32_PrintJob
: u% ]# R# D( F6 r1 W   Win32_Processor
6 K) i7 V3 u' a# @& i   Win32_Refrigeration+ n1 ^6 I7 j7 p' d: s* G
  Win32_SerialPort
; ?/ o' N2 J/ ~) t   Win32_SerialPortConfiguration
3 Q5 E( X& @, I+ @* \, }% h3 a   Win32_SMBIOSMemory
5 @0 g( S  m/ ]' `: f- u+ Q   Win32_SoundDevice
! R/ F! U( R2 D4 v   Win32_SystemEnclosure' Z7 d+ N& v( V$ o8 }. K
  Win32_SystemMemoryResource
; ~7 \0 c0 C( [   Win32_SystemSlot
) t9 Q( r/ |& ~   Win32_TapeDrive5 ~* Y% G- n$ R# ]0 l8 a2 S  u
  Win32_TemperatureProbe
/ o$ x$ X" n" p  V/ }   Win32_UninterruptiblePowerSupply
9 K8 t' Z, J7 U   Win32_USBController, ?' s; ^+ `7 p; P6 t4 N
  Win32_VideoConfiguration
( ^+ b' F5 `% t& Z: ^, `# p/ v   Win32_VideoController
" s+ s5 ]2 H, z7 l  N+ e   Win32_VoltageProbe& H6 K. N" K9 c: a5 D! r5 l

* b' J8 ~6 ^4 @5 l; a0 h+ d以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-3 20:52 , Processed in 0.019965 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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