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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)+ {( _5 j2 U* O/ {$ C
) B- Y9 i0 C' \6 `1 @1 L2 A5 j

, o0 a3 @7 T! I1 o. f" c- c) L. p& a--------------------------------------------------------------------------------8 @' K& J1 w. L1 B$ h- n9 `
WMI: Windows Management Instrumentation (Windows 管理工具)& z8 `7 }* p' T* j8 K) A
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
' O# n" O- N5 M, m7 m. w# t   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
8 o9 p9 U2 R$ i   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
$ [: U3 _& s& V7 g" Q
, H+ u4 [( z, c% P8 k8 N) K--------------------------------------------------------------------------------! }; J, h8 G' ?; ~
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
, X0 B& z/ ?7 o. N* j: y
3 |2 [1 e, w9 h3 k--------------------------------------------------------------------------------
) t/ g4 ]( _. Q- w( y① 初始化 COM 接口:
+ Z8 O0 I1 Z4 W: O   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
* i4 }% p0 H3 L# A) n   这两个函数在 #include <comdef.h> 里面定义。
$ L0 G% p, B7 w: U# G
! x( m% a* x; w$ b2 q$ I② 获取访问 WMI 权限:
& K0 i! f7 ^' U4 H' n9 ^( H  Q   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
. @- |; `  E/ X3 G3 E   如果这个函数返回 S_OK 获取权限成功, 否则为失败。/ W# I8 {: a' y8 V* m0 _
+ O" ]% w$ _. [( K9 q( R/ b0 o
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
6 Z" D3 s, V* }1 a/ c3 h   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
; j3 S8 v0 w2 W- m# o1 ?
. S* y$ c- K9 X1 ovoid GetWmiInfo(TStrings *lpList, WideString wsClass)/ H9 c, L, N* _7 N3 W" ?, l
{
- S1 A0 X$ ^' V+ f  IWbemLocator *pWbemLocator = NULL;
* ]2 Q  R& L+ ~/ N* M% n1 D2 P: H  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
2 P9 C  n' f$ \  t   {+ C+ P, \% v4 T# K
    IWbemServices *pWbemServices = NULL;
) {# n( b/ Y" b     WideString wsNamespace = (L"root\\cimv2");
" ^0 H4 C* H7 d3 A     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)5 f4 f" a" q) g$ O+ f  J+ ]; p, W
     {; f8 d( W2 h; Y5 E$ _: K/ @( h
       IEnumWbemClassObject *pEnumClassObject = NULL;6 K# e0 `, E+ _" o4 Y* G$ F) D# X
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
, i0 n. w/ F2 Y2 _- w3 F  N5 W- q        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
: P$ f9 o) q+ t3 t% j         {* ?' j' O5 h! M  z: l. Q5 K
          IWbemClassObject *pClassObject = NULL;
" ?$ X2 ~/ i" f# G% p" r! `7 P$ g           ULONG uCount = 1, uReturned;
* A' p) |" o4 T! P3 p9 m           if(pEnumClassObject->Reset() == S_OK)
" l8 \  a$ ]( \            {
& [! _+ Q7 _) W( P# d) g$ Z              int iEnumIdx = 0;
- V" \$ u. A; }! h! D              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)) h' n+ l  a; [6 ^2 J: I6 P9 C
              {4 z* Z4 P! q! r) R; L
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");+ |& k- C. h8 ^5 Q- g( q3 @

: z1 [7 _( I# f+ R3 U                 SAFEARRAY *pvNames = NULL;3 O& R& f4 ^' U! s- G2 f  I
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
" R8 W6 {. L1 J9 E                  {5 p9 g# h1 t! M0 R+ D$ J
                   long vbl, vbu;
& O" ?5 ~( |4 q                    SafeArrayGetLBound(pvNames, 1, &vbl);
8 Z$ w+ R- f% H+ K& P+ N8 R/ k                    SafeArrayGetUBound(pvNames, 1, &vbu);% p2 w8 H; _2 f8 X6 R3 f9 l
                   for(long idx=vbl; idx<=vbu; idx++)
5 B- _1 p" ?$ S                     {: g8 ~7 B9 o5 l  R3 m! x' a
                      long aidx = idx;) _6 O0 _" z& c$ f# e
                      wchar_t *wsName = 0;. p) |. I4 S8 M1 ^/ V8 R  ^  p& O
                      VARIANT vValue;
) d5 j: d; a6 A                       VariantInit(&vValue);
3 P- P; Y& a! x. g- e0 v7 E8 s# T                       SafeArrayGetElement(pvNames, &aidx, &wsName);
  B$ L9 a  l; v2 z% L. M7 U6 \7 b
- H1 U5 B; ^' u- P# C; x                       BSTR bs = SysAllocString(wsName);5 h. g: ~) \6 a
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
" g' \8 i. |! F1 @                       SysFreeString(bs);
$ s* x8 f7 |+ Z& y% w+ Q+ r1 t6 q: N! H
                      if(hRes == S_OK)- a* l0 h0 T& a8 c1 e: i8 p
                       {
3 V4 e2 K9 B3 j: R5 T" U                          AnsiString s;
0 W9 \; x# j; V) m7 @                          Variant v = *(Variant*)&vValue;* S4 R- K" S4 U  ^, D. D; _
                         if(v.IsArray())8 I+ O9 l1 v+ `' J
                          {
6 g4 {' [2 G0 c8 i                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
- u7 ]$ D! T3 U2 N8 R# ?2 U                              {
4 e; O: y- Q6 e5 X8 a                                Variant a = v.GetElement(i);
" ^: v6 J/ p" |- r: c$ j                                if(!s.IsEmpty()): P8 E1 l7 Q4 ^
                                 s+=", ";$ ^3 o8 y5 `' Y) G
                               s+=VarToStr(a);2 o# K5 }- m$ W9 ?9 n: H9 u0 Y
                             }* Z$ l+ S4 M! t: F6 H$ f2 q% |$ i
                          }
9 E* _3 Y! ]1 X) ?                          else
: g, m! M7 u. n3 [! D                           {
5 D6 y) q0 s# T9 R5 a& |                             s = VarToStr(v);; M9 L( a1 @9 ?
                          }$ X; ~8 j0 @, G& b
                         lpList->Add(AnsiString(wsName)+"="+s);
" Q# s2 M9 ?8 k7 M+ b4 g8 Y9 `                        }
& p% F! I2 K6 F* H6 I- n; o7 }1 A" h9 y
( i. Z. {9 J' C                       VariantClear(&vValue);. p2 t, D0 g. }7 u( K; ?+ t- s9 @
                      SysFreeString(wsName);, X9 s/ j' q2 k4 e0 s/ p& O
                    }
( z& K" N0 j0 ~" U# Y& ~                  }* T4 P+ _7 _# L0 e
                if(pvNames)SafeArrayDestroy(pvNames);
% H+ P. |! t1 w" u6 Q8 p; {                 iEnumIdx++;
0 K5 ]* Q' u6 H               }1 [) {$ F5 `7 t, v
           }
  d! f: {. F6 Z, m           if(pClassObject)pClassObject->Release();9 b- A! j9 [: ^' ?* |% h4 ?
        }
3 Y( N0 K- X9 t7 `        if(pEnumClassObject)pEnumClassObject->Release();& s- ^6 O6 N3 l' p4 V* z4 _& H
     }; x0 w; O8 |4 m& g2 {
    if(pWbemServices)pWbemServices->Release();2 a4 }3 _0 o# j( Q2 d# m# e% J0 B
  }
' `3 r7 G/ A% g5 S  `0 u, {! I  if(pWbemLocator)pWbemLocator->Release();
6 C4 L  Y' n) y' A: Y}6 M' Q. m) [. C. B
//---------------------------------------------------------------------------
+ }( V7 B9 i' X6 W. \4 E7 d9 k& Y$ Y' Q( e, V0 |* E
// 通过 WIN32_bios 获取 BIOS 信息:
% h/ ~' i. G( {2 S# V' w% xvoid __fastcall TForm1::Button1Click(TObject *Sender)
$ w; A- G' D% J8 g% [{
8 j7 ^  D4 v8 q. H- L' m7 T    Memo1->Lines->Add("================== [WIN32_bios] =================");% g2 H6 }  d; H1 P$ h( P# }
   GetWmiInfo(Memo1->Lines, "WIN32_bios");* {( h9 L" a! _  c; c. @7 ^' d
   Memo1->Lines->Add("");; B6 }% d/ X, I, A
}
3 e* M$ U* o( z7 U
* ]* l' f4 {9 z. m& }--------------------------------------------------------------------------------
/ V% n$ I3 [7 S8 ?/ p/ r2 F( n* ?# D, J) |( H" d  A3 a( f2 W
WMI 可以访问的信息类型有:0 c0 c' [& S. ~/ l. F* h: i8 w
  Win32_1394Controller- o( j# m9 e2 A/ s
  Win32_BaseBoard4 u3 J7 C1 E8 M. E6 B1 o. C
  Win32_Battery
/ s$ ~1 D0 j7 C. W   Win32_BIOS0 x- R+ Y# u5 @$ \
  Win32_Bus( r: J/ s: Y* S' n
  Win32_CacheMemory+ R9 X: L( G6 L& I# p: n: }
  Win32_CDROMDrive
5 u( h0 b  N/ U/ F" {# d   Win32_CurrentProbe  U; S4 }& ~3 `% V
  Win32_DesktopMonitor
9 v' z' j$ c0 }3 Z   Win32_DeviceMemoryAddress
- o7 m; }3 w8 ^- y! D! N$ |   Win32_DiskDrive6 [7 x! c: I0 g# p
  Win32_DisplayConfiguration
/ h2 o5 A8 \- a: R. u7 n   Win32_DisplayControllerConfiguration
3 k# ~. A( n- _# G: Q   Win32_DMAChannel
' p9 w" R) J" z" I/ W) F   Win32_Fan+ E) r+ V  e) G2 V  H6 v
  Win32_FloppyController; k$ r" l5 L/ C6 n+ V6 R
  Win32_FloppyDrive! p: E/ ], p  k, W
  Win32_HeatPipe
; _5 A' U4 s4 s4 @- r   Win32_IDEController
% ^# r4 I7 p# T: [7 [- R   Win32_InfraredDevice
5 T) J8 n0 L4 p4 L  B& `: k   Win32_IRQResource6 b# E) V( p. C0 P7 v
  Win32_Keyboard
# Z* A3 d  I1 Y7 B! H& K0 i2 d   Win32_MemoryArray
  J; f" `4 B2 h. m( Y; S   Win32_MemoryDevice+ w, H0 O3 T3 @8 e# i% \. ^
  Win32_MotherboardDevice) y  \4 ]( _' {! j4 ^* z; C8 Y
  Win32_NetworkAdapter" I1 K6 b/ l# E/ C$ o
  Win32_NetworkAdapterConfiguration3 d/ y) k8 J& U. F3 e& d" G8 m& r
  Win32_OnBoardDevice) t4 I; J4 b+ K/ j3 Y
  Win32_ParallelPort
+ \& c9 [8 s, i- {! k3 ]   Win32_PCMCIAController
. Q0 T! X0 D6 Q4 p7 e1 x   Win32_PhysicalMemory& \9 @" _9 g+ |
  Win32_PhysicalMemoryArray
# e) W/ Q8 h* F) W! _" M0 i+ t: U1 }. Y   Win32_PnPEntity
4 S" ]  N3 e# S0 R   Win32_PointingDevice
) j3 E9 p; c1 P/ t3 L& }   Win32_PortableBattery& Z+ c& l, w/ D8 P, g
  Win32_PortConnector
# d1 \4 I+ D  {) U8 V   Win32_PortResource
+ Z& W4 ~% w4 I5 ]0 `   Win32_POTSModem' `- F  p/ P! C) ?( |& ]$ p
  Win32_PowerManagementEvent4 F+ R, Y8 S% M# P
  Win32_Printer
8 o2 M' [6 F# h   Win32_PrinterConfiguration3 {9 w& O7 G3 x$ ~
  Win32_PrintJob
7 K( r9 W: w5 m, h  K7 @  V   Win32_Processor
- K( Y' B. @- d   Win32_Refrigeration
; Z" D# ]3 k( y+ n2 |+ R) q' X: E   Win32_SerialPort
4 M$ g% ]9 x+ S/ z4 B& \: q* W   Win32_SerialPortConfiguration
8 r7 _7 [( q1 B* r   Win32_SMBIOSMemory
+ |6 S, Z1 k  ]/ \   Win32_SoundDevice
+ X9 n3 i0 F3 B5 q8 b* E) K   Win32_SystemEnclosure; Y+ Q: b6 U3 {) z* ~& U
  Win32_SystemMemoryResource
: c9 v3 e& A% k2 C   Win32_SystemSlot
* `' ^  d* I6 u, T8 [+ D   Win32_TapeDrive
8 X, ]0 S0 K4 O6 o3 o   Win32_TemperatureProbe
  v3 ]7 f- F* h; Z$ c; p4 Q   Win32_UninterruptiblePowerSupply
$ G; Q/ ]/ d1 F   Win32_USBController
' w5 v: q8 j4 V8 }+ M+ y   Win32_VideoConfiguration+ X% ?  T5 }- H: r6 O* ?+ b& ^
  Win32_VideoController
5 w) ]" ]" K8 o8 T1 ]' P  J   Win32_VoltageProbe1 F4 ?5 X1 }0 `' C! D% L

6 B; k. U- T* g' r0 {$ I; t以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-31 09:09 , Processed in 0.019496 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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