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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)$ {# A0 J3 N3 m1 [
/ x7 }8 t/ z! `8 X! ]6 |, p
# R: r' w% ~+ W; l/ R0 o$ f) L' l6 `
--------------------------------------------------------------------------------* r6 ]/ g" `% e
WMI: Windows Management Instrumentation (Windows 管理工具)
! P  P6 }8 _2 g9 n$ q: `   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
- _' P! O% w8 X! C( J* y0 i4 Z   利用这个工具可以管理本地或客户端系统中几乎所有的信息。, Z0 e2 x! J/ H5 k( A4 K7 A
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ! E" _; J0 p- K% L

0 z& e2 ]$ k4 r+ j8 E' Q--------------------------------------------------------------------------------3 @/ y) T, ^9 }, v8 K& R3 S! M
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面7 _4 a1 F" r" O3 Z# O% t! c
9 s% P* y5 o. J  W  f4 ?
--------------------------------------------------------------------------------
7 `" W' g+ M$ H8 A① 初始化 COM 接口:
1 Y1 ]* z. R8 J, a  y% Y  P5 [   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。! F# }4 Y$ E% I' F# M$ W
  这两个函数在 #include <comdef.h> 里面定义。
1 Q/ a, T7 F, M: ?5 J6 i5 e- S  l9 e: p, B* N+ m) p
② 获取访问 WMI 权限:
  B+ i+ E$ ^: N% M9 X2 L) u   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);' u( C+ S7 d- s7 L0 ]; I
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
7 X7 t4 i8 s. L# P
6 q/ U% M! p- h③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
9 b9 k: X$ X$ N" |1 y   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
% H+ Q3 \1 w, j. T8 i. L) l; T+ a  D  U
void GetWmiInfo(TStrings *lpList, WideString wsClass), c' E$ U& N8 L- B* d8 P
{$ r) ]  C4 x0 y6 j/ s3 C$ x
  IWbemLocator *pWbemLocator = NULL;7 r% a: W& k0 R- A/ N, I2 h9 Q
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)4 k7 _( P' K; B- {: f! u9 A$ B/ x
  {, l; p! F& b6 U/ g, M2 s
    IWbemServices *pWbemServices = NULL;
2 H& ]5 U% L# d. x0 e- J7 F* [     WideString wsNamespace = (L"root\\cimv2");
: F! D7 u% j# z% O, X, }4 P     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)$ N( Y! @2 Z: J: H& y/ |& B
     {
$ ?' F' j0 V* U! e' J6 ~8 c        IEnumWbemClassObject *pEnumClassObject = NULL;
4 S9 r" Z. G  |        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;% O1 H+ h6 r' L$ a8 Y, w1 r4 N. K
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 z. ~1 G% B; |9 f( U4 K: _         {
1 b/ E$ ~- w5 C: v9 R; ?           IWbemClassObject *pClassObject = NULL;- |0 n; s: y- _0 N) v
          ULONG uCount = 1, uReturned;' z2 P! z& u) s
          if(pEnumClassObject->Reset() == S_OK)$ m$ D7 G4 A/ Y# i  a
           {
) A  H& T& ]# M4 u              int iEnumIdx = 0;& _. ?& r6 e: H) t- N$ _8 y% X
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)9 m7 ]" D7 h0 J- A" p1 }
              {
/ N! L/ Z9 j+ L7 }' F7 ^                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");+ H' R5 y$ b- L  w6 E; z1 G, o

* W2 H( I' ?4 h; g- y% n                 SAFEARRAY *pvNames = NULL;& @& e/ N! V1 A% S1 U; V, C6 O. m
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)& |3 v1 ^3 H+ r) P1 |# l3 Q
                 {; k1 w% s. V7 N! ], b% X/ G7 O% P4 U# S
                   long vbl, vbu;
% O/ ~7 h2 I1 |+ d, t                    SafeArrayGetLBound(pvNames, 1, &vbl);) X) g0 k" P& Q7 R* t2 V
                   SafeArrayGetUBound(pvNames, 1, &vbu);( @. ?4 R2 ~( x, v1 Q2 h
                   for(long idx=vbl; idx<=vbu; idx++)2 {9 w! S' C  L+ l
                    {; W9 ]: m. I* t# m
                      long aidx = idx;( x  X4 M% V  w" Q& {" N9 J! q. |8 F
                      wchar_t *wsName = 0;
5 A* d: L9 Y% W4 k6 b+ f                       VARIANT vValue;4 u# ]  _, J* C: B) b# v; k  N0 {
                      VariantInit(&vValue);8 r9 e, @: ^# f$ _; A/ h# N
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
9 ^" D* t8 [2 d, X0 J$ Z" x# _/ {: H- j( t: ?6 a
                      BSTR bs = SysAllocString(wsName);
5 x5 a. h9 R) n9 O: u                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
1 F, p3 o3 V- H/ v1 l                       SysFreeString(bs);
# M4 i, N+ Q& I4 ]
" A6 f- N$ n1 W1 @8 P: C% X; ?                       if(hRes == S_OK)
1 a6 E% ~; R7 M2 E+ j( K6 t                        {
8 M1 l* x; T, P6 C5 H# C+ Y: Z                          AnsiString s;
  q9 T' ]! d' P& L5 w2 A# W8 l% \                          Variant v = *(Variant*)&vValue;0 l. Q. U/ A, n
                         if(v.IsArray())
4 l- f: D+ c' W0 D                           {
% h: T( W3 ~' m0 ?% W                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
, Q1 T/ S& c7 l# P# h5 _1 x  [                              {
6 ~% a1 L% |: b5 E                                Variant a = v.GetElement(i);4 `* ]1 W  L/ v8 o
                               if(!s.IsEmpty())$ B- z. F( T" F: I, s
                                 s+=", ";
5 H  G6 q) i( q' ~+ `, s- n2 f                                s+=VarToStr(a);. J% n7 |; K0 C% s! Y
                             }
5 q$ v$ e& @7 {3 a5 V0 U7 x                           }6 ^" K1 L% u2 Q8 {6 y
                         else) g7 U, [8 E5 s0 A4 i
                          {* Z3 z& W% X0 H, c, x
                            s = VarToStr(v);
' _, t! Y( g  S$ t                           }
: f8 l( y- |. Y                          lpList->Add(AnsiString(wsName)+"="+s);; {% f5 e% D% ]
                       }0 O2 s& D" ?+ T( O7 l$ ~

" x, L: t2 Y2 c                       VariantClear(&vValue);
2 o) H' B" S. {3 g* w7 `# d                       SysFreeString(wsName);
4 I/ E7 G5 R$ ]( B/ {* h, a                     }
8 G, o: n- P; a9 [5 t1 Q. S                  }
7 Q. a$ |% l* W' y( u                 if(pvNames)SafeArrayDestroy(pvNames);
" Z1 N' k' J4 P                 iEnumIdx++;! U8 }0 U! x4 u
              }
( n/ G2 k5 i1 o; E: R* b; A            }9 r( D6 P6 j% B
          if(pClassObject)pClassObject->Release();4 ?0 `' Q3 w; y- l4 S, R
        }' t' ?# g  a. n* l6 B5 j
       if(pEnumClassObject)pEnumClassObject->Release();
" C% i" T8 r3 {1 X& e4 g9 n. X      }
7 R5 ^# v. J7 e7 J6 S" Q     if(pWbemServices)pWbemServices->Release();7 A. O' T  n1 }* Q3 r& T
  }+ G) O6 I0 i" P0 y
  if(pWbemLocator)pWbemLocator->Release();( F/ [6 p6 P5 P; C
}
% s6 {) A4 u4 w% t//---------------------------------------------------------------------------2 c6 [6 Y4 w* d
% n) z0 J4 k7 y1 |8 M
// 通过 WIN32_bios 获取 BIOS 信息:& C" B5 ]7 ?, h% p6 O- T; S( V* I
void __fastcall TForm1::Button1Click(TObject *Sender)
0 B' z7 z+ W* m8 r% c{8 l. F5 H' f3 r3 a
   Memo1->Lines->Add("================== [WIN32_bios] =================");
" c. b; D. G% y1 P    GetWmiInfo(Memo1->Lines, "WIN32_bios");
( g: P. P/ I/ R. M9 H! S* ?; B    Memo1->Lines->Add("");, x, ]4 f8 }0 Q, S
}
6 t: N+ F6 v5 V, Q6 V. u2 m* e: J8 q/ Q* L! C6 P* I, Z
--------------------------------------------------------------------------------
1 b( _$ x8 y; L. V4 \
; ]0 E; f, f1 K! {0 OWMI 可以访问的信息类型有:6 v8 v$ W" P, Q- ?2 R/ w$ o
  Win32_1394Controller
3 {: j+ o- s  ~   Win32_BaseBoard
7 |9 M- R3 V: c! ], U( w) ]# ?   Win32_Battery- P8 \! b8 ~. A* v: X
  Win32_BIOS
, [; P6 L  b7 m1 [& x4 M8 A" L" ^   Win32_Bus
, q& D7 y9 z6 M/ G   Win32_CacheMemory
: @$ B2 S; N5 ]3 ?7 u2 t  O/ t   Win32_CDROMDrive7 x5 f4 k) w. q: S$ D# \
  Win32_CurrentProbe
, ^+ [1 d8 x8 j7 {9 b   Win32_DesktopMonitor7 J" ]" }) L2 f8 q' O$ d' P
  Win32_DeviceMemoryAddress* N* U) v+ v% N) {& j' |
  Win32_DiskDrive7 a% v  n6 F, N$ c* e8 u
  Win32_DisplayConfiguration
2 F4 l5 f* i$ W) W: B  M# p1 L   Win32_DisplayControllerConfiguration
7 _$ |, q& b* ?: q; K: N  |# K   Win32_DMAChannel
1 Y: _8 Z) _: y0 {9 }7 j   Win32_Fan' t) y5 K  y5 [5 g8 z
  Win32_FloppyController
! A5 F% r* G! }: @! c, @: E   Win32_FloppyDrive, W4 U* i5 Z6 `1 o3 M
  Win32_HeatPipe$ y' G4 q; p' r# X/ g$ p0 N+ \
  Win32_IDEController
( @' V& s, O+ b9 x" I   Win32_InfraredDevice8 d5 m0 I" G4 s" Y/ a; A
  Win32_IRQResource1 F  J, f6 m' l1 J: R7 G, I
  Win32_Keyboard8 N$ ~2 R0 Y% o( k
  Win32_MemoryArray
4 H0 s0 v" h* v   Win32_MemoryDevice. |# j% }7 `" ^8 m
  Win32_MotherboardDevice8 c  _, j$ q& g
  Win32_NetworkAdapter6 j9 a! h# o* K+ ]
  Win32_NetworkAdapterConfiguration( }- z3 Y7 e4 A% f2 H
  Win32_OnBoardDevice% S) p; N" D; y7 e6 \' v' N* r
  Win32_ParallelPort
, {4 ]2 W4 v( R   Win32_PCMCIAController
8 a  y! q4 R6 c/ w   Win32_PhysicalMemory: v% f7 a6 K# Q4 {! O$ c  q
  Win32_PhysicalMemoryArray
0 B, r4 w+ H5 }/ `  ]0 J   Win32_PnPEntity$ l- C) x, E  P2 s1 d* D$ j
  Win32_PointingDevice
+ L" D8 v4 f1 O+ j6 o+ E% q   Win32_PortableBattery1 m3 _" T8 r9 }% Y
  Win32_PortConnector
$ m2 X1 C$ T$ `2 Z( N( R   Win32_PortResource
0 @& U) S: y+ J9 ?' c( [   Win32_POTSModem
  N* N4 K4 A5 e( l! f" q   Win32_PowerManagementEvent
! W1 L/ Z( y' Z4 ~3 k* ]7 o/ B   Win32_Printer. ]6 J1 }) e5 i
  Win32_PrinterConfiguration3 O4 V! c$ w, @# \
  Win32_PrintJob+ U( B+ u( J, G4 h/ p, ?' ^5 p
  Win32_Processor
  p6 s* ?/ q' l; u* R, B9 C   Win32_Refrigeration
/ z  O7 f! Y. y" F3 |( T6 B   Win32_SerialPort/ o: ]3 _# w1 J6 S  \8 m
  Win32_SerialPortConfiguration
6 V% @# O& E' H9 j! C1 a   Win32_SMBIOSMemory+ C# t0 O8 l/ U5 S5 O) B1 q
  Win32_SoundDevice* v/ x$ g1 m* }1 Q2 I
  Win32_SystemEnclosure
# ?# {7 y( P/ R  U! `' y7 A- D: {   Win32_SystemMemoryResource" p1 i' ~2 i( `% H; A) H3 |/ ?
  Win32_SystemSlot6 T$ U* j. q6 }% i; b4 ]
  Win32_TapeDrive6 b1 z' H0 H3 C+ H
  Win32_TemperatureProbe
: b3 S5 C0 R' ?' \1 V/ f   Win32_UninterruptiblePowerSupply
- b* a& w9 a. ~1 }: K   Win32_USBController
8 F8 ^$ _7 |+ J/ D2 f   Win32_VideoConfiguration6 t/ a- f& t5 R9 z) x) ]; l
  Win32_VideoController
) B! N' \) r- z% k# M   Win32_VoltageProbe2 P' L  l4 M: ?8 C1 l  n

7 I/ ~6 C& a" U以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-19 15:34 , Processed in 0.020793 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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