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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
0 y8 ]4 l( W" C# k4 T9 I/ ^( ]) K- s( V1 C6 q
8 E# I0 p* |$ B1 i5 G. L7 H
--------------------------------------------------------------------------------3 W. B# [1 |# [( f  g0 A
WMI: Windows Management Instrumentation (Windows 管理工具)
2 b2 h" r( R* D' U   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
, E$ ^6 A4 z8 N% n1 q; ^- a+ l   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
6 E/ j+ y4 i% A! u   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
% H$ V- u( a- e! s  Z* O" j+ `
) ?, U5 W& g3 o1 u# J6 [--------------------------------------------------------------------------------
, T+ C- I  A5 a+ c# |3 u! y. O0 cBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面4 G; r2 g  j/ g
: {& P- E* c* m% z: z5 V
--------------------------------------------------------------------------------
0 y7 \  H% V% M① 初始化 COM 接口:
! u6 ~% `# |/ M5 l' ?5 _- |   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
$ ~! Z1 ^/ d: U8 u  W& E/ B   这两个函数在 #include <comdef.h> 里面定义。
: T) |/ ]+ a( f4 a: Z& i$ _; U! G# E8 j7 {% P! V
② 获取访问 WMI 权限:
* X6 m/ p/ j) L   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);$ e8 b' y% B) E7 B3 R) r4 D
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。9 ~* G+ f- k% l. f, }/ R
+ U6 Q- s' m- j8 |& v0 ?$ p2 ^8 r
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
- L& B) d$ t. a" Y/ ?5 m% \   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
9 s* T+ P+ J9 W- ^
0 @3 H% {8 `# k5 [* Evoid GetWmiInfo(TStrings *lpList, WideString wsClass)
  H# Z4 h% W6 C1 }9 j  C{
+ Y# L3 |- [6 `  IWbemLocator *pWbemLocator = NULL;
/ I, ]" k" `7 a/ H; |  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
' G/ t3 ~1 g8 T: b% F; q   {) v4 {4 f: o1 I3 {8 d6 I- b  O
    IWbemServices *pWbemServices = NULL;3 K- I" ~1 M7 W2 L& t' Y# W2 y
    WideString wsNamespace = (L"root\\cimv2");. E2 @$ H3 P. i) Q5 Y' n, j, Y/ q
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)8 `) h: n2 o( \& w
     {
1 t  A5 |/ U& U/ S        IEnumWbemClassObject *pEnumClassObject = NULL;
- l0 ~' l0 D# {& |+ g        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
' O& {6 z5 b, _! k5 h" R/ a* Q        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK), B3 z. g+ W" R' o) }9 z: V
        {
; k+ x3 W& o6 a' O- i2 d6 J           IWbemClassObject *pClassObject = NULL;
! v6 z: `$ B; H* q. F  w% a2 w           ULONG uCount = 1, uReturned;) U# V& O8 n( I
          if(pEnumClassObject->Reset() == S_OK)$ i7 z: M$ }9 j
           {
: I# J, _8 O& e  t              int iEnumIdx = 0;& ?: q& D5 B% t9 C
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
% o( i( E; d# \1 \9 @               {' N3 z6 W5 A) \6 ^' d
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
% Q. m! R! O3 J& O) ~* b0 [
: b% B& P* i' ?& w" l6 C" o$ Q                 SAFEARRAY *pvNames = NULL;
  ^- D9 ]6 J! F1 s' N0 h+ t! P                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
+ @: s8 M- j8 Q8 X                  {
6 e9 D8 X& |( a: s+ E0 V                    long vbl, vbu;/ f/ K3 v/ K- I) [2 T
                   SafeArrayGetLBound(pvNames, 1, &vbl);
# U4 r6 H& X1 k                    SafeArrayGetUBound(pvNames, 1, &vbu);
1 ~  R7 p1 j. D9 E. ^1 k                    for(long idx=vbl; idx<=vbu; idx++)
; T# X( p) q5 \: z                     {9 Q1 A1 ?& a' \9 L
                      long aidx = idx;
# ]. e+ t; ]! q# M$ t+ O' L4 X                       wchar_t *wsName = 0;$ \$ W/ C3 ?  w, ~% S/ g! K
                      VARIANT vValue;
) c8 W/ @3 P2 S& ]1 s; t+ Y+ U( e8 s# A                       VariantInit(&vValue);3 R; t0 L/ J) E' o1 |3 ^
                      SafeArrayGetElement(pvNames, &aidx, &wsName);" R+ x. @. b- R4 D* g& ~1 N+ b) ^
7 Q8 C( ^# f5 g
                      BSTR bs = SysAllocString(wsName);
9 _+ N5 S% A& x4 `$ |2 f                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
$ H, |0 Q( A( u3 ~% N$ x6 N4 M: s; E) L                       SysFreeString(bs);
7 [1 K4 K1 ?1 ?7 x% V: ~$ h9 Z, t- O7 X$ o
                      if(hRes == S_OK)
7 `' }* Y: `. o* E! q                        {
  G, ^9 U+ g! @  q" w5 z0 i+ _) {1 X; v                          AnsiString s;
) g9 {& i/ f+ r                          Variant v = *(Variant*)&vValue;
: B4 P) n6 ?  n. a6 ?2 Q0 ~                          if(v.IsArray())
: n2 W/ x6 L- ^' G, @                           {0 b% c) y0 B3 s7 H' n. K
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++); w$ ]9 f5 g, g2 n) w4 }3 w
                             {' t( V0 Y2 d3 o! Y
                               Variant a = v.GetElement(i);
/ G* C2 y6 |) Z# {% \                                if(!s.IsEmpty())
4 }* F" ~/ X  \3 ^6 z                                  s+=", ";' V( q* A0 B$ b# K* a
                               s+=VarToStr(a);8 N" P& e9 w  R$ ~; u1 [
                             }
$ }& R! j* S, q4 a0 M" R3 k                           }& j( P+ x. [( ?% f6 c& B6 w; u
                         else3 w2 A8 h6 |# x6 G" _- d
                          {, j& N/ G7 o/ J+ ]" |
                            s = VarToStr(v);4 x2 K7 |% a: {2 V3 k) |- _$ f, O
                          }9 H( P3 o8 g5 F
                         lpList->Add(AnsiString(wsName)+"="+s);) i) w- X" p2 F+ ]8 f  g  Z
                       }, g9 e- V) G, j/ ]

  C# h( o' X1 t! c) R                       VariantClear(&vValue);* A+ M6 K# Y6 _7 Q# R3 O
                      SysFreeString(wsName);
: g  u( G% x6 W" ]8 Z  e( D                     }
+ Z2 v7 A2 _9 @9 A% K1 e1 L                  }0 m# g/ S  h" ?- ^3 l/ b) V
                if(pvNames)SafeArrayDestroy(pvNames);" z' e- z9 G9 k4 K
                iEnumIdx++;, o0 X) n$ C3 d* I
              }1 s% L/ Y0 E' \
           }
2 Y% ^6 V2 E, T( x5 M           if(pClassObject)pClassObject->Release();
/ F) J# k% |$ U; t         }: m2 y8 T; I- l7 G' F2 z  h' v
       if(pEnumClassObject)pEnumClassObject->Release();( T. X7 O* g7 V7 B2 C
     }
4 B! I2 D& w+ B6 t     if(pWbemServices)pWbemServices->Release();
+ B4 k6 \  p  z2 }+ P6 t' N! s   }
- w1 \5 i& z0 J  if(pWbemLocator)pWbemLocator->Release();
8 S8 v5 }& s8 v0 |4 y+ t/ V1 o* B}3 m' W' [4 g! |
//---------------------------------------------------------------------------. b+ u, ^, X: p; O& j& E
, z  K" M1 _. U& G, s! v9 I
// 通过 WIN32_bios 获取 BIOS 信息:: S, _; k! b- e1 w% J: n
void __fastcall TForm1::Button1Click(TObject *Sender)
' w/ J9 E" T9 z2 Y' u{
8 {/ t0 b6 m7 u2 U3 q    Memo1->Lines->Add("================== [WIN32_bios] =================");
  R8 U0 t0 q7 E$ I    GetWmiInfo(Memo1->Lines, "WIN32_bios");
/ s0 w1 A# X5 _$ r" P; v% R    Memo1->Lines->Add("");/ ^; E  ]7 t; F
}
9 w, M/ R* @1 L, M  h' K) b. F4 |9 ^1 |) z, e
--------------------------------------------------------------------------------$ l' @0 A5 ^6 A/ Z6 u2 b" B
0 F5 f! l/ I3 F# }' c" H
WMI 可以访问的信息类型有:, f, t; S& B6 P, E8 N' r3 J+ a* Z
  Win32_1394Controller) T; M; B3 q+ g( Y
  Win32_BaseBoard
8 w& W- S$ M" c6 \1 a/ k6 F   Win32_Battery' k' X7 b+ T- s- f/ h  }: ?0 a8 n# a9 Y
  Win32_BIOS
* x7 [9 |1 @9 g( J   Win32_Bus
& h$ j! M& {$ v; K* G0 O: i  a   Win32_CacheMemory
. k3 p  ~5 S# ~! o$ ~$ \   Win32_CDROMDrive2 n8 U4 L7 O. R, M5 ^/ P8 ^
  Win32_CurrentProbe+ \* a* }5 c4 A1 T# b
  Win32_DesktopMonitor
' w5 P, h8 G7 j' P1 }   Win32_DeviceMemoryAddress
6 }3 O/ m3 `) k( f! I+ z" |   Win32_DiskDrive
$ @! K" `! q* ~' M0 I& z( ~   Win32_DisplayConfiguration4 m' e; d+ u! m. u" V  K. R; y
  Win32_DisplayControllerConfiguration: }: ~1 ^3 M7 \2 U. \9 t) K# u$ L  {# x% Z
  Win32_DMAChannel
4 t4 m% F3 I4 }, P8 k: u   Win32_Fan" U+ `8 [# z8 M& E8 E0 R
  Win32_FloppyController; M: A2 x' c% U+ j& [3 Q
  Win32_FloppyDrive
) J8 Z" x  s; i6 o8 g; X+ b   Win32_HeatPipe% o* b7 `) J$ |: Z
  Win32_IDEController
, B) W( r. |. F+ Q   Win32_InfraredDevice
- l& t0 x# J3 W( S4 e   Win32_IRQResource
; ^# y$ ~3 X4 F   Win32_Keyboard8 [5 |  M, c: H$ T- e
  Win32_MemoryArray
2 i/ ^- _! o; l   Win32_MemoryDevice
9 Y5 i+ S" g% V, S   Win32_MotherboardDevice5 W9 W# }& L/ q/ N' x- }' t
  Win32_NetworkAdapter
: `. J# P4 n: W6 O* k1 k4 g   Win32_NetworkAdapterConfiguration/ m. e( K& P5 v, w2 r+ N$ E: L4 Q
  Win32_OnBoardDevice
) `3 O( n: x9 {/ p- t3 k   Win32_ParallelPort
3 }$ k4 C+ V5 [   Win32_PCMCIAController
6 X2 h& y0 S" D# y2 |5 _0 g   Win32_PhysicalMemory1 a. j! a' Q. u; v. m
  Win32_PhysicalMemoryArray
* R& D4 ]1 s" a; @5 _2 f# r# f   Win32_PnPEntity( |6 _$ _  g6 x9 D! }% K
  Win32_PointingDevice
0 v. g: N8 d$ C/ T+ Q. k   Win32_PortableBattery& q7 e' y  w2 A4 I, P
  Win32_PortConnector0 V- m2 B4 a: r- L6 @. B. L
  Win32_PortResource% \* {4 \) o; J) h, u- u
  Win32_POTSModem
& \) h1 X6 Y" A- c   Win32_PowerManagementEvent* t% I$ `1 r  n; s1 l
  Win32_Printer, h% r0 x$ ^5 s( R+ k0 K
  Win32_PrinterConfiguration
4 b2 b; Z# m, L# ~   Win32_PrintJob! Q8 C7 |# w1 v9 C1 e
  Win32_Processor9 F) k) z$ u/ W, M1 T: g! F
  Win32_Refrigeration8 O# \2 Y+ a& E. I) W/ G( v
  Win32_SerialPort' g# H% K$ D3 m, |1 l* E& l
  Win32_SerialPortConfiguration
2 b: j4 o' `1 ~" t8 ?$ ^   Win32_SMBIOSMemory2 l& e0 M/ o4 a! O7 x. W& f
  Win32_SoundDevice) m& p( x+ @  f6 R  g1 n/ X
  Win32_SystemEnclosure/ A1 Q  f( y. E$ K1 d" N% z
  Win32_SystemMemoryResource7 q4 o. @- t3 n9 y9 d" V& J- k
  Win32_SystemSlot9 I9 W( w: `3 g% [
  Win32_TapeDrive
8 g% y# }' Z7 N# ^' _, M$ }   Win32_TemperatureProbe) {$ O4 _" N/ m% r
  Win32_UninterruptiblePowerSupply
: E; `( e8 |+ s6 _2 F   Win32_USBController; M6 [2 p# L; S
  Win32_VideoConfiguration
# ?* b3 _) ]# S% W& s6 q. u9 c) s* w- f$ n   Win32_VideoController
- _+ r" x2 M* k* C, C4 q- r   Win32_VoltageProbe  L7 E( z, G$ Y4 o  q6 W% t

  s4 z6 {7 o+ d以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-8 12:46 , Processed in 0.020202 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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