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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)- w) V9 I  f, O

4 I: E* V9 {; U
; Q2 o) R( d: r--------------------------------------------------------------------------------
. p* {; m/ L9 Q# g- A6 b+ vWMI: Windows Management Instrumentation (Windows 管理工具)% }1 }, U1 L7 d5 L0 f7 T
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 : Q% t' ]& ~* C% w5 @9 U" x2 f
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
& B$ |( o/ J9 g6 J( a7 d) c   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 . P& L- p" y! v" W

8 R8 l+ K* f4 r& \--------------------------------------------------------------------------------9 l3 U* g( d, L1 B
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面0 N' Y( x. c* J7 T! y8 I
0 c* q! {' B" u' t+ t
--------------------------------------------------------------------------------
) @. N" Z# m! g0 h8 ~( j① 初始化 COM 接口:
" Y2 ^0 U1 V+ X) ?   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
* L! N/ y" W' T1 G& @( e   这两个函数在 #include <comdef.h> 里面定义。
% Z& b* N! q, K; C1 c% W
, i3 t' P1 y6 i. E9 j0 }1 l② 获取访问 WMI 权限:, R! H; Z. s& B' m8 [/ t! i" N
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
/ f! ]& G- b) j" V   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
$ Z% @6 u2 Z' y2 S: k/ C: U& u3 p
& ?8 I0 t4 K& \; c2 x' U. h( Y4 Y7 C③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
! C4 E* D( j  }3 d2 I% K  V   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。! M6 z, D# `/ E: \7 I
8 T# G2 N0 @; ~2 B8 C
void GetWmiInfo(TStrings *lpList, WideString wsClass)
6 i3 o  F# E% h) h$ N{
, M: L1 T. ]# W4 G2 f  IWbemLocator *pWbemLocator = NULL;
" y5 n3 p3 \$ b  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
2 ~3 j2 z: ]" m+ L: @! U1 r   {5 T+ ?, y: C2 a0 g1 B, r* J
    IWbemServices *pWbemServices = NULL;- L6 L! @! s; Z% S
    WideString wsNamespace = (L"root\\cimv2");
2 V; S/ ~0 i5 U; m+ n/ c     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)$ a7 z& z; L9 ~% W' `% W: a7 m
     {
( c7 W+ a/ F0 Z3 L7 J& H, ]5 ^        IEnumWbemClassObject *pEnumClassObject = NULL;3 _- e  c  u; d0 ]; I
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;6 i$ r* O9 T" z' c
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)/ K2 N6 ?' e2 s1 q. S
        {! Q6 {! y& j  t' S; L
          IWbemClassObject *pClassObject = NULL;8 B. ]& y6 \; a8 e# y! \: h
          ULONG uCount = 1, uReturned;' @3 }2 k& F  X! C- A7 W; \
          if(pEnumClassObject->Reset() == S_OK)8 u  N; `) \' L7 {$ ?/ b" v' t
           {
( B6 k$ A' ]$ `3 y0 s2 C              int iEnumIdx = 0;
5 }% b  @1 v7 c              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)2 q9 @" ?4 M" W* \, V, K" b
              {
  w7 u' {: v/ t' o# F$ v                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");" [; _5 k* a$ o5 W& U

% O! O9 G* b4 z; A, \                 SAFEARRAY *pvNames = NULL;: P3 g' C+ D* n! b0 y& a( g
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
1 t" r# Q7 M! h8 b- k% q                  {
; l1 @) q: x# u                    long vbl, vbu;$ @6 u; C% b+ X
                   SafeArrayGetLBound(pvNames, 1, &vbl);
% F, p- ?- c* \) P$ V* k                    SafeArrayGetUBound(pvNames, 1, &vbu);
9 u: [0 Y* l/ r2 n                    for(long idx=vbl; idx<=vbu; idx++)
% M: D! }3 }5 u. n  w+ l                     {& X7 C/ G, a5 ~( ]  R- k( h
                      long aidx = idx;
% `. E' D" H* ?0 Y) E2 i# G! Q7 @                       wchar_t *wsName = 0;
; F; s1 a; M8 \6 n0 r. f                       VARIANT vValue;1 @: Y6 H6 K2 A/ ~
                      VariantInit(&vValue);" ?( A* ^3 S# Z( Q3 d* D$ y
                      SafeArrayGetElement(pvNames, &aidx, &wsName);. B  n* j: p- U' w

) l0 F+ N0 {9 m: ^) F: T" B                       BSTR bs = SysAllocString(wsName);
* v9 D$ V% @$ T; s/ |                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);# r1 l* z  B( Y# y. I
                      SysFreeString(bs);; i. q2 a5 Q% }7 y) D' ~" c5 p$ |4 U
; j- T3 W. x" b7 B. l4 Y: b' n* l  }
                      if(hRes == S_OK)
% K7 x% W7 @3 O# x& y                        {
. T2 k  r2 k0 J( ^! U                          AnsiString s;
: y9 S: L4 B9 R% T9 a                          Variant v = *(Variant*)&vValue;: W. d  r. X0 e4 `0 `* o
                         if(v.IsArray())
2 }" A& l1 X' t. m( F8 l2 n                           {+ l- A0 C, Y/ p4 W$ O
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++), A$ S% G" n" U8 C, a5 C* E
                             {9 W1 g! _5 _! z3 q1 z7 h3 m7 Q8 T
                               Variant a = v.GetElement(i);
* s8 M$ ~, E% ^( J/ Y  a                                if(!s.IsEmpty())
3 N. m' b# F1 d8 f, T2 `                                  s+=", ";
3 ?/ N) K  |( e( h* o; b: G- D- O                                s+=VarToStr(a);
$ G+ V9 ?6 J8 c/ k3 W# F9 j0 L                              }
% F( i7 d, C/ G( }* [# w* Y                           }
# k8 }! ~! l8 W                          else$ n2 H! H$ R. i
                          {
" I5 ]$ o" `+ h: Y5 [+ T, k                             s = VarToStr(v);1 l! y, z- k+ [; U# z4 w4 }& s
                          }1 V! l; H0 q8 P( J; ~6 a
                         lpList->Add(AnsiString(wsName)+"="+s);
' J# ?% w9 r- f: j- g- P4 U5 S                        }
0 _. Y* l! K. G) G" ?
: D" M+ k! r1 s2 u6 X' J                       VariantClear(&vValue);
: j! q2 C+ o( p& X2 A  \7 Q: \                       SysFreeString(wsName);! e, H; q! a& Z- a) d
                    }4 Q7 u3 S6 }& S  D& B2 G' Q0 P
                 }
6 |$ n' V$ Y& t7 g- B$ x                 if(pvNames)SafeArrayDestroy(pvNames);
6 w2 y' Q8 W9 p- e$ F% h                 iEnumIdx++;
1 v! |& N) I0 `, }               }  e( T% u1 B& d6 e, T9 r8 @  `
           }7 p! F! i+ X: t" {
          if(pClassObject)pClassObject->Release();
- g% A9 l4 y8 m$ ]         }7 W; Z  k! l& N* b# e: d
       if(pEnumClassObject)pEnumClassObject->Release();; F: f8 b3 }- }& z, t! G) L9 ?6 I
     }, Z6 g1 ^. |* n" `- J7 k% v' u5 A% w
    if(pWbemServices)pWbemServices->Release();/ D5 ~. [; B# E- M2 G
  }5 Q9 I2 M+ Z$ t- T9 `
  if(pWbemLocator)pWbemLocator->Release();: S+ h% ~/ q2 j5 l; O- [2 r
}
' c  Y+ G5 \; X2 t//---------------------------------------------------------------------------
8 G7 W- w$ R+ D7 r
$ t" M" I/ o, Q& p  S/ L- F8 O// 通过 WIN32_bios 获取 BIOS 信息:7 ]' g9 u, D5 |( e3 k' ~8 j
void __fastcall TForm1::Button1Click(TObject *Sender)# P8 `) }: a# y4 B; j
{( w8 f. G* x0 X$ A. w7 ^7 o6 ~
   Memo1->Lines->Add("================== [WIN32_bios] =================");& A0 h3 f8 b7 Y+ V
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
! M/ r' S. t% R    Memo1->Lines->Add("");
4 Y" o; W. q6 ^7 O  N, z}' b9 \, q7 y" ]9 k0 ]! Y

* V& @1 ~0 i4 C7 a! d6 h* K( S--------------------------------------------------------------------------------# y4 r( L  j9 {

$ O! |" a1 L6 ~. s2 KWMI 可以访问的信息类型有:
/ t% a& y; _) D5 w; }8 o6 }) t) G   Win32_1394Controller  c8 |/ u3 p! T( t) T+ ]% \% y. ]) N
  Win32_BaseBoard
  c* a0 h5 [& O& s8 z+ r0 l   Win32_Battery5 {, u* M8 d8 l
  Win32_BIOS4 B4 I* p1 O# h
  Win32_Bus
  {6 l( Y. W/ p# y' m  f   Win32_CacheMemory# V% J; \) p3 q
  Win32_CDROMDrive
) V: W+ C: V+ B0 I  I" p: o$ _   Win32_CurrentProbe
. ^/ c1 Q4 c5 C% x: v+ X   Win32_DesktopMonitor
0 W- B. M# _: F+ M& ^   Win32_DeviceMemoryAddress4 V& u5 o8 L5 O0 G7 l1 n# q
  Win32_DiskDrive
; O: o5 F; T+ g! w   Win32_DisplayConfiguration
( [, s& q7 z7 n! j' x/ o   Win32_DisplayControllerConfiguration
" M9 \* g/ q3 z3 r# _" |" b   Win32_DMAChannel
5 e5 L, l, V' _: Y   Win32_Fan7 V) s/ }7 ~" R( F
  Win32_FloppyController0 f8 J( V" K9 a1 R& B
  Win32_FloppyDrive; N% l- z2 V2 H2 @
  Win32_HeatPipe" r1 W$ S% Q. b+ T
  Win32_IDEController0 m2 U/ O# x/ F, A5 |% P* k
  Win32_InfraredDevice! c" \  P; d4 q
  Win32_IRQResource4 |6 v1 u. U# C( I
  Win32_Keyboard( v/ `( u8 R( `& m. ^$ h
  Win32_MemoryArray8 [% K% N: d/ ~
  Win32_MemoryDevice
- z5 e) X' r4 B) w& M# T8 B) Y( j   Win32_MotherboardDevice5 n$ N+ J0 s4 N3 R, Y- A$ j/ H4 j" ?+ H
  Win32_NetworkAdapter
5 n: b- `- J0 W3 I9 w5 f0 n   Win32_NetworkAdapterConfiguration1 i2 ]! M7 B3 ]  X
  Win32_OnBoardDevice$ @3 v% u" s0 ]9 O. G! J6 w
  Win32_ParallelPort: Z* j0 y' ?9 m9 x' f. s# R. x
  Win32_PCMCIAController
/ [  P) |5 n2 w7 L% w   Win32_PhysicalMemory
8 }8 G% s* e  ~   Win32_PhysicalMemoryArray
5 r2 M' E8 R% U- u. H1 ^   Win32_PnPEntity
9 g. q0 @# T( o3 C0 A6 U9 T   Win32_PointingDevice9 g. x) P) Y/ `$ H- m$ `
  Win32_PortableBattery
- t2 F! t  }5 G$ D5 n# u5 H2 m   Win32_PortConnector
3 t& T: D& ^/ s5 }" y   Win32_PortResource
: c( }1 h1 q, W( \: z   Win32_POTSModem
( R* ^1 ^; ~. I9 t( o6 u1 s   Win32_PowerManagementEvent" |4 J6 }+ O: k: N6 \
  Win32_Printer  U0 L" ?6 q' |8 U
  Win32_PrinterConfiguration4 `( R/ N! D+ D9 i5 c1 p1 ^
  Win32_PrintJob: Y+ b' o$ ?" o; o' G
  Win32_Processor
7 s; z. J5 i8 v1 v6 W   Win32_Refrigeration
2 L" ^4 E3 m, L. n   Win32_SerialPort* J) r" F5 p( L9 }/ q
  Win32_SerialPortConfiguration& \7 d# m9 v! n+ f
  Win32_SMBIOSMemory& Z  O/ ], K6 L, K5 E# e! v8 X
  Win32_SoundDevice
. p- a8 @4 k; F$ k& K* x+ ]0 Q   Win32_SystemEnclosure
7 O1 V! B' b' D9 ]; A' j   Win32_SystemMemoryResource. u' Q. z( }/ l. g' u  E4 w: S
  Win32_SystemSlot
7 K$ b. \# z  B/ `   Win32_TapeDrive
) j1 i1 I( G; w! S" k1 b8 w$ I   Win32_TemperatureProbe
% I3 L4 I1 W) a5 O6 I  v   Win32_UninterruptiblePowerSupply
7 m- K* h- ~0 ]$ x; o! S- ?   Win32_USBController2 y3 s% B5 E* e0 T/ _) ^4 [+ |( t
  Win32_VideoConfiguration
6 k0 \' C& d9 C) B2 J  U   Win32_VideoController) t, L* z. x& W" K1 Q' f
  Win32_VoltageProbe
4 w0 u5 T6 A$ a9 `
* j# T" j! N" p以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-28 22:12 , Processed in 0.019750 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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