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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
9 _& _1 K; ?2 ~5 M
1 J& o4 t7 m& H. v% u# D/ }
" H* |% e8 t  f# N5 @) v--------------------------------------------------------------------------------
5 j! d7 C, z/ L' EWMI: Windows Management Instrumentation (Windows 管理工具)/ S" L+ j9 }7 Q. F1 R
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ! ]4 b9 q0 b% _+ Q$ f* `" Y
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
( u+ h# ?! _9 F! @" N   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
. C5 ?$ b. w0 ]6 f$ T! C
! f) P( B2 m, S. r--------------------------------------------------------------------------------$ c& ?$ o/ {! @) {3 ^+ ]) m) p
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面( z! V  U; N% h
" _7 w2 u( D( R# m, i
--------------------------------------------------------------------------------  B7 A5 t8 N) G* y, W
① 初始化 COM 接口:
0 W& O( a6 n# t8 G; |4 c" p- c2 u   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
) u4 ], ?- x$ q7 P+ G3 R& ~   这两个函数在 #include <comdef.h> 里面定义。4 ~5 `" F! g! ]" P) C' \, n* y
& B% D- j: p( `2 w9 k+ T
② 获取访问 WMI 权限:
3 h' S+ \2 ]. `3 b3 `+ T! h   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);; a) P. d" u  K
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。8 z( Y, C& L/ ?3 }& W: r+ f& Q0 Y

- n! D$ J9 i0 u7 `# G1 ~* J③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:6 X) m+ l) D+ Z  j. x
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
3 f( y" s- c* W9 J; O+ e+ G9 Z( X; W$ k
void GetWmiInfo(TStrings *lpList, WideString wsClass), k( [1 z) R) a8 g0 \( i3 D" z
{) ~* g5 l6 B/ O- f/ f$ ~8 m0 Q
  IWbemLocator *pWbemLocator = NULL;
' J1 t* C  u5 F  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)4 G! m9 U3 f; z0 c' N
  {9 k8 k: C( t6 U. C+ N
    IWbemServices *pWbemServices = NULL;
+ b' X( F4 [7 p* W; k0 F7 M( U     WideString wsNamespace = (L"root\\cimv2");' c' ~" \* O0 N& O- Q
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)7 v# {- B9 M* a6 \6 n6 G  V
     {+ @5 Y- |$ j, H* v  c
       IEnumWbemClassObject *pEnumClassObject = NULL;: \$ A: M* X. H1 P. ^
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
+ I0 D/ {; L; y1 G. k        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)* V1 b5 {, \5 D8 ?) d8 l8 }! G
        {
& _# i( |) W& g7 v           IWbemClassObject *pClassObject = NULL;
9 J- d6 T1 U% t3 o5 L2 g+ `           ULONG uCount = 1, uReturned;
% ~; R' p$ F! S2 ]! p           if(pEnumClassObject->Reset() == S_OK)% Z. @9 g- L8 ^4 `
           {
1 z/ ?/ t0 [! l( ?              int iEnumIdx = 0;
- _/ @4 j7 x# B% [# h              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
9 K0 m  g$ n7 X  V3 F  z               {
& c4 ~# _# R$ [; @) ^                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
/ w0 |, U7 J0 }; S
/ f2 a- c! C: f0 k0 B, `2 W  b7 A                 SAFEARRAY *pvNames = NULL;
6 p4 g1 W5 R; r4 p* ?                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
& f  l1 ]: Q9 C) @                  {; I6 F" |; a6 o+ D
                   long vbl, vbu;  L/ a1 Y0 ?  g% l6 Y3 H1 [9 y
                   SafeArrayGetLBound(pvNames, 1, &vbl);0 s" h) P* O) W
                   SafeArrayGetUBound(pvNames, 1, &vbu);
- J9 a: }5 d4 j' o                    for(long idx=vbl; idx<=vbu; idx++)! V9 l9 z! W, u( s
                    {; }( h! J% f2 f% M# C- ?1 P% ^
                      long aidx = idx;
. w, Y- Q; r* g7 f: y1 K0 E  J3 x                       wchar_t *wsName = 0;$ m: J" x2 `  `6 n+ t
                      VARIANT vValue;
$ [! p1 O4 }# C" I8 H- }0 \                       VariantInit(&vValue);+ j" K( t6 X4 ?5 j7 d5 Y
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
0 o: {2 s2 Q# ?/ I( I: M7 ^& s
. b& v1 V' ]2 J1 `; V( h& H                       BSTR bs = SysAllocString(wsName);3 D4 g) x# G/ |- k7 Z. _. K
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);; Y4 x& K- h3 Z# w$ x- U+ e' W
                      SysFreeString(bs);
$ }  i% O! C3 A) G6 ^7 {4 \! K5 D. F  E
                      if(hRes == S_OK)
4 P; G$ P" Z( p% _: @                        {' V: @3 |6 W8 @4 u; I+ j
                         AnsiString s;: `" ?/ o" n8 z
                         Variant v = *(Variant*)&vValue;$ X5 V: [' D' Q
                         if(v.IsArray())$ v% X+ @. b8 Y( R5 K9 ~
                          {
& h, J1 L7 n. b                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)( t9 ^0 {7 m6 }7 m9 p
                             {/ D5 r, D$ i4 |7 T5 v9 q
                               Variant a = v.GetElement(i);
9 q1 R' U; z0 A5 I# L- W9 O- W; Y0 Y                                if(!s.IsEmpty())
4 K6 D& p" R8 B7 l$ ^                                  s+=", ";
: C  M! q- _+ ?6 [, k                                s+=VarToStr(a);" e! \" ^: a( c# ?$ r5 W2 s: G  a
                             }
0 V' D0 c. n5 j* g7 i8 h                           }8 b! h7 [7 d9 r2 G
                         else
! b9 h. S+ ^/ C1 ~  t/ z                           {
) F1 F7 F; b  X5 L$ B1 {" Q                             s = VarToStr(v);
  m- }; `. b  v( b2 F( C" L                           }
3 a7 m, L6 U/ P3 \% v2 W                          lpList->Add(AnsiString(wsName)+"="+s);
" c* d5 w2 C- `& n& h0 a                        }% q. f* l/ [( a# B
* r/ U9 ~6 U* E" C. ^* s2 v
                      VariantClear(&vValue);0 i  K) V1 P6 q5 q/ f% P8 j
                      SysFreeString(wsName);% ?- m. g. x. F( a
                    }3 S0 P! g" ]& M- Q9 S" P
                 }
: H1 p. R2 c& q& {- s                 if(pvNames)SafeArrayDestroy(pvNames);
% y2 e7 ^5 ]) Z/ M! ^6 w                 iEnumIdx++;; ~8 ?5 }$ W5 [  \
              }% J, p3 I1 I: V: Z7 X
           }
1 E8 p3 J! X  O" M6 L8 e8 Q           if(pClassObject)pClassObject->Release();6 R2 {$ P$ s3 J
        }& y2 \1 X# J/ N
       if(pEnumClassObject)pEnumClassObject->Release();6 m4 ?8 @4 U$ u" F+ A( x$ v
     }
  J$ |- @1 H- O7 s! |1 B! F$ I: h     if(pWbemServices)pWbemServices->Release();; A% M% H' b  R5 ]
  }$ z3 A3 H1 ?5 u' u4 a
  if(pWbemLocator)pWbemLocator->Release();* e9 p1 t7 s5 ]' J8 [
}
9 R& o" N. T3 q5 `; E//---------------------------------------------------------------------------
9 Z, ~" Y% W+ ]% x6 f( b$ B" x8 T! S% b% S3 \; o" X* N9 \
// 通过 WIN32_bios 获取 BIOS 信息:
! Y2 b/ j  l! I. Q. q( T# _, }. t, j. pvoid __fastcall TForm1::Button1Click(TObject *Sender)
% E8 e+ f. p1 c- f$ O9 n{
) ?6 _1 P# A% l& U2 g- @    Memo1->Lines->Add("================== [WIN32_bios] =================");, {/ x$ E" P+ b
   GetWmiInfo(Memo1->Lines, "WIN32_bios");: o+ U- Y; l( Y. ~- M" i8 n/ b
   Memo1->Lines->Add("");0 q2 J) R/ ~* W7 H
}  Y! D0 a% a0 |

7 `$ |7 c, U* e--------------------------------------------------------------------------------" n; s5 X& T8 L6 _" b4 \

' }2 c4 r; d7 ~6 L9 C- K/ \WMI 可以访问的信息类型有:
8 y. n* f0 C8 j5 k# p2 N3 M   Win32_1394Controller
8 ~! M& F: E5 g9 z& x! k! b$ U   Win32_BaseBoard
. x+ R: h. F3 H7 @7 U) A  N+ Z   Win32_Battery
$ z# p( w! N5 j$ ]  O% i   Win32_BIOS
; l+ P' C8 w& ^2 g' j% @0 b   Win32_Bus
# M& o% P2 w2 T, r7 X% E. `  M   Win32_CacheMemory4 G9 |$ D3 |' g
  Win32_CDROMDrive) V" f$ {; R; ^( H+ [8 i
  Win32_CurrentProbe
& E7 R, P; G, q   Win32_DesktopMonitor7 S1 |; ^" P0 M4 A6 {7 G/ M( Y
  Win32_DeviceMemoryAddress
0 e! J7 W3 k6 m9 g3 K! R$ e# U4 q2 n+ L   Win32_DiskDrive
% K* y/ c- m: Y+ _   Win32_DisplayConfiguration+ o9 t' {8 v) d8 y3 v9 q
  Win32_DisplayControllerConfiguration
, I) x7 j2 N+ G3 b: i   Win32_DMAChannel
+ D/ }. H& O3 d6 u   Win32_Fan
- `( d$ |' z+ C2 t) D   Win32_FloppyController$ k9 H: }) R. ?5 j1 l3 f. k: q
  Win32_FloppyDrive, g3 k  K5 y$ b$ I2 ]( M; }
  Win32_HeatPipe
  ]3 a2 ~% o8 H0 H( O   Win32_IDEController
* _- h: C1 R1 x   Win32_InfraredDevice
5 Y/ V0 I) x3 R' x/ ^9 r6 o& @3 O   Win32_IRQResource# I5 j" b! m/ O& t3 W
  Win32_Keyboard# p7 E% Y  V) L5 r4 ~0 m: g  Q
  Win32_MemoryArray- s$ Z; u* [6 [% A3 S
  Win32_MemoryDevice
+ s, q  S. I: W0 W7 ]; k9 L3 }   Win32_MotherboardDevice. x( N: L. y$ p7 Q
  Win32_NetworkAdapter
/ C& @# O$ P; J% `$ I   Win32_NetworkAdapterConfiguration
: w$ f+ [# p' O3 o- u( K   Win32_OnBoardDevice
8 e/ H. D. t+ x; d6 P$ U& ^   Win32_ParallelPort1 n8 |' t3 \- S9 }
  Win32_PCMCIAController
( a7 r& B' p6 Q& M1 Q   Win32_PhysicalMemory# }0 y( o' \- D4 [7 Q
  Win32_PhysicalMemoryArray+ i: b3 D- j2 G+ D& a* s1 `
  Win32_PnPEntity
/ j: u/ A5 p) U9 C1 i. G   Win32_PointingDevice
/ [! }& \$ D3 s0 b) G" U   Win32_PortableBattery4 Y: r6 h4 D5 w6 l, V0 U
  Win32_PortConnector
4 ?) C3 J, C& ~8 w   Win32_PortResource+ c- Q: E' u" _( a0 W6 G! u/ J
  Win32_POTSModem# p% {8 H3 G7 X
  Win32_PowerManagementEvent
8 A8 v; ^' p( Y; `7 Z- U+ i1 c   Win32_Printer6 g" g9 ]1 M7 X4 h9 [0 x
  Win32_PrinterConfiguration3 z7 N, I( ~( s) H; ^! Y; x
  Win32_PrintJob% C! m+ t# B2 \+ j0 g
  Win32_Processor
0 g% c! ?, t, D" L0 e' ]   Win32_Refrigeration
. ~* _; F3 g6 x9 M   Win32_SerialPort. X0 h/ _6 `; `' D  d5 a
  Win32_SerialPortConfiguration
2 V* z# o. Z. X/ @% X3 G   Win32_SMBIOSMemory* f, \; s! ?; Y. {1 T" `) U- N
  Win32_SoundDevice
) v* [. \: q! x+ _9 E: a   Win32_SystemEnclosure/ D1 @9 _, `! p) i! C, {+ u
  Win32_SystemMemoryResource7 d3 a& p" t8 U9 B- H; ]. r
  Win32_SystemSlot
. O' C4 E2 D, ]   Win32_TapeDrive$ J: Z& Q- d3 ]' K) n
  Win32_TemperatureProbe
7 O. h! D, C9 o7 H% |$ g   Win32_UninterruptiblePowerSupply
/ o; ]( K5 n3 E0 q, _3 |8 D% w& ^   Win32_USBController
; c$ S  d5 V& E  |   Win32_VideoConfiguration
3 j3 j7 ?3 e  r# ?3 d9 a$ K   Win32_VideoController
3 y9 f3 c5 u- g/ d   Win32_VoltageProbe$ m. }- m' d8 D6 ?  N9 x

) N4 B9 m) Q3 R/ h! S2 t, V以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-12 07:55 , Processed in 0.019434 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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