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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
: J: r2 o' \; h- ^
" K, W& X2 l& H7 ~& p+ |! X  ~( ^8 N3 u# g0 t) z
--------------------------------------------------------------------------------
+ P$ W! E1 }4 {: O2 mWMI: Windows Management Instrumentation (Windows 管理工具)- k7 V0 I) w3 y0 l4 u4 _
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
4 d" A( N; H- G( s; p   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
2 C! V5 i1 B  b  ]1 V. m/ b   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
. ~0 {, `9 q  H1 ^3 f& w% h* e# |+ y
--------------------------------------------------------------------------------/ g# K; x, S2 f3 K& c. Z* U! r
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
9 _9 M. I6 _7 B" N$ c5 ]  C* I  X3 f* o! `: Z5 |; Q6 t
--------------------------------------------------------------------------------
7 [; w% G7 R; s8 C  ~1 `- q① 初始化 COM 接口:  F& ?3 x0 o4 e& l$ h
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。6 ?+ _7 w3 o; {
  这两个函数在 #include <comdef.h> 里面定义。
" @6 v9 E$ Y, p9 U& o( [+ B  x3 k7 g- v8 _/ V
② 获取访问 WMI 权限:
6 O5 X/ q, C" Y' B2 R   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
4 s0 t2 T1 d( G% }' K" j/ ?   如果这个函数返回 S_OK 获取权限成功, 否则为失败。: V1 Q- t5 G3 @0 A) v1 x

# R7 N" b5 p" I! q7 u6 y③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:$ R. d) ]0 y2 p* x$ q
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。: U$ S5 V7 `' K" h( R  n: c& ~
" n  C" V3 U4 h- ~+ L
void GetWmiInfo(TStrings *lpList, WideString wsClass)
9 L  c: k7 _# }# |9 U- p& @{  F) R: v5 s: m1 F2 X7 d5 r
  IWbemLocator *pWbemLocator = NULL;
" N! M) [# G. v$ s% D  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)% ~5 v% B" D. b* f& T2 k" w; _
  {% X0 r. Q3 J$ t+ ?
    IWbemServices *pWbemServices = NULL;& V: A5 _9 ]7 \
    WideString wsNamespace = (L"root\\cimv2");
! Z3 n, q2 y$ @" w) B% ^' q; P     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK); W5 O6 H5 _' [) n" e5 N
     {5 L3 `  e& w1 m+ E* {8 s7 ~* J
       IEnumWbemClassObject *pEnumClassObject = NULL;+ e4 Y+ M2 Q& f6 {/ y5 x+ J% Z
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
. W/ c$ H: h3 @/ L2 m        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)0 u* c" q& T3 P6 K1 ~6 X' }
        {
* Z8 \4 l1 b# S0 M( y           IWbemClassObject *pClassObject = NULL;
0 o' I, e# T' }! o8 ~; w& X* ]$ C           ULONG uCount = 1, uReturned;
) l: u- S% k& C6 m$ s3 Q7 O           if(pEnumClassObject->Reset() == S_OK)
& ^! x4 [: e1 z: a. J/ E            {0 H1 C. e. S( E/ X  i5 ^; ]
             int iEnumIdx = 0;! h7 L7 M$ v# p/ b5 ]' Y8 Z& f
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)# z: m! _* @4 [% G+ r9 g3 e# _
              {
# V* y8 q% W3 ]! d/ K2 [                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
) H$ r! q5 ]# B
/ Z+ a( {3 P1 `& u$ `/ w                 SAFEARRAY *pvNames = NULL;) Y- C$ Y$ @; z" D% v: _; G) @& _$ j
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)+ k" J0 W  D7 K! V* t% q$ R+ R( C
                 {* C1 L0 A: v6 d0 V' M6 }* X
                   long vbl, vbu;% q' H4 H: w1 D4 s5 n
                   SafeArrayGetLBound(pvNames, 1, &vbl);
2 X! l9 n9 F$ ^3 h6 c( R; O                    SafeArrayGetUBound(pvNames, 1, &vbu);& b- e# B* X2 t: |; n7 T7 t5 m
                   for(long idx=vbl; idx<=vbu; idx++)+ X/ w" A4 m. l1 K6 p6 v
                    {
% H5 o9 {) w: W6 ^1 L( u: ?                       long aidx = idx;
1 w7 m2 K  v) q/ O9 d- f5 D                       wchar_t *wsName = 0;
5 ^" M, f& W) Y! b+ e, I( k                       VARIANT vValue;5 Q: _( z/ k1 \* ~0 K$ [
                      VariantInit(&vValue);& _4 O1 Z( N. a8 P% U. I8 R9 @  T
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
5 R& k( ?, N8 m- Y- h& I% ~
; i- G: F1 j# k! m. G                       BSTR bs = SysAllocString(wsName);  O- E1 D$ Q8 V# ]+ g
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
: z) ^+ `* Q: y7 Z& q) f" D                       SysFreeString(bs);8 q5 Z% A9 L5 ]$ C

' l# n# m2 y* C% H  i9 S- h                       if(hRes == S_OK)( C9 _  f% a* U3 x/ Q" T/ f
                       {
: g, K4 Y8 I9 [& n) @- |                          AnsiString s;
/ s& G. b* v6 s6 s3 s                          Variant v = *(Variant*)&vValue;" c. m4 {3 x, z- ^/ ?1 c
                         if(v.IsArray())
5 ^) M7 O+ P+ q7 L                           {/ u4 ?. S1 ^$ g$ l6 i6 O/ b
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
" c; C, z7 m# G8 y% x                              {
0 [/ m% }5 N6 I; r4 v. L- ]8 @                                Variant a = v.GetElement(i);
4 o2 U& J1 \, r/ I3 {                                if(!s.IsEmpty())
; v6 }* U( T7 b# H# p                                  s+=", ";
# A1 G, Q  s6 ]8 _; s3 m                                s+=VarToStr(a);
# O6 o5 o, K% C" Q                              }2 d, P/ z! Z4 z6 Y! D9 D
                          }( p$ \  O0 P. M8 s( a! X2 K; m* ]
                         else) K- {3 I. s* W+ k7 X: K1 d
                          {
. Q% N6 H( E6 a* m0 o% j8 h                             s = VarToStr(v);- R. U: A# W3 D" U6 z
                          }
, Q5 O% h; b: f& q$ ~* v                          lpList->Add(AnsiString(wsName)+"="+s);, |# T$ g% V' a2 M" k# ~
                       }
* A1 |& ]2 q- h8 S9 h
1 T+ `7 F7 v: T0 W9 d$ {2 D; s" p                       VariantClear(&vValue);% \( E) [; [' Z; A) I( s0 ^" @1 K1 o
                      SysFreeString(wsName);
5 z# S* o& ^# _& t& s5 C8 e9 k. m                     }# O% [# }0 @! q& `! L( K' K
                 }
9 g( ?3 G: E' o7 T                 if(pvNames)SafeArrayDestroy(pvNames);! l9 T4 [1 B' F! s: G; r' A
                iEnumIdx++;( U9 Q! O: a6 T7 @2 V
              }
9 U( ~9 m. I$ w            }
7 I7 f: Q" e8 C* g  i6 Z& m           if(pClassObject)pClassObject->Release();
0 y* G7 w& j  s0 n1 L5 j# m         }& c. y+ `- _; w) z
       if(pEnumClassObject)pEnumClassObject->Release();2 A1 d; V! N; P* Z& d# ~6 Z
     }
2 M8 \: O( w& P7 J' P  A     if(pWbemServices)pWbemServices->Release();
" H, K. E3 D7 U/ ]: J2 g   }
9 d; }* d% m  {3 n& ?( e6 p  if(pWbemLocator)pWbemLocator->Release();) \. f4 `7 ?4 h5 l5 d
}: x! M; c+ B8 l, [( `, G
//---------------------------------------------------------------------------
3 ]# y8 B. R0 c3 Z+ W. n5 ]0 ]! p8 Z9 g) M
// 通过 WIN32_bios 获取 BIOS 信息:
+ Y2 ~: ^0 j; N2 Q' W( g5 {void __fastcall TForm1::Button1Click(TObject *Sender)
  ?8 ~0 f: c& ?' G{6 O; |8 i& P* A7 O5 Q2 k
   Memo1->Lines->Add("================== [WIN32_bios] =================");
- V& T: o" b7 J8 H    GetWmiInfo(Memo1->Lines, "WIN32_bios");/ s! f' {5 M+ {
   Memo1->Lines->Add("");
0 ?- A0 e' j! r9 ]}
5 A' X& k, R2 \2 x# z) U2 G4 {
; g- i: b+ B2 M1 A--------------------------------------------------------------------------------
- H% C0 U$ N5 A: e  u6 A5 }% l! P- G! i
WMI 可以访问的信息类型有:+ V! ]9 f, W" d/ i
  Win32_1394Controller. H2 U) ~+ u% J" u8 _
  Win32_BaseBoard3 `. Z5 F3 g/ P6 N7 k0 _0 y
  Win32_Battery4 j2 O6 D" A- K; p
  Win32_BIOS
5 T5 F' S& @4 ^5 j6 L" _: Y   Win32_Bus- U3 S0 a0 H' L5 x7 ]4 m
  Win32_CacheMemory3 P. v  ]' |; U
  Win32_CDROMDrive, Z: J6 j. V7 y* q
  Win32_CurrentProbe) e) _, b1 r" k( ~+ V4 a
  Win32_DesktopMonitor
4 ~! S8 A# L. C4 H   Win32_DeviceMemoryAddress
- b* a: K8 x9 R0 D$ q8 u) v   Win32_DiskDrive. o. ~% E6 ^2 m! P$ f6 g9 o  l
  Win32_DisplayConfiguration
, K7 O8 h8 w: b9 y9 ]   Win32_DisplayControllerConfiguration5 f7 |, E# m7 ]3 l2 Z3 Y
  Win32_DMAChannel3 D1 J6 F3 q6 D/ @# W, _8 a* q
  Win32_Fan
- V$ Q" T$ ~2 G# F2 ^$ g, s8 J8 y$ g   Win32_FloppyController
- X9 o7 F4 O6 G  w9 Q   Win32_FloppyDrive* f4 B! H) E( V( ]. k$ N9 \$ O
  Win32_HeatPipe8 ?% V: E9 p- X+ ]" O
  Win32_IDEController
, g9 b5 t  V$ o9 ~7 m- P6 M  p: F& T1 O2 F   Win32_InfraredDevice6 o+ P* w) U! u
  Win32_IRQResource
1 d. D7 i# X8 F5 C   Win32_Keyboard! i2 G2 j" |6 ?. g$ n
  Win32_MemoryArray
9 H0 k# w3 X" a, o$ }1 c- s( e   Win32_MemoryDevice
6 O/ i& e; t. w- j0 U9 I$ ?& _   Win32_MotherboardDevice
# C8 U/ J7 i4 z( r  p+ @8 }' V) }# _   Win32_NetworkAdapter7 t7 j: z# F2 C  ^1 \, w
  Win32_NetworkAdapterConfiguration5 Z( Q- {! [" E; ~* `
  Win32_OnBoardDevice
) w. v* b, B5 S& w4 U, v   Win32_ParallelPort
* D8 v% v/ S/ D2 Q5 _5 d5 V   Win32_PCMCIAController/ m) f$ b/ {0 q2 v1 L
  Win32_PhysicalMemory
# T. V( H: X0 z# D3 G1 n   Win32_PhysicalMemoryArray/ V# |! ~& M0 Y6 k" Y+ J3 P) |
  Win32_PnPEntity1 I7 f( y' _) L+ a! r
  Win32_PointingDevice; D7 m3 Y  W% T0 {5 j& ^
  Win32_PortableBattery, E' h/ M! N3 F$ |2 ^
  Win32_PortConnector
0 Q5 l, j% `# _3 ^+ q, x' D8 P   Win32_PortResource
1 [! c$ w8 R& T- v! G6 n+ w3 e   Win32_POTSModem
( D9 J3 b" G9 W% R" F5 x' m   Win32_PowerManagementEvent& W. W/ T  }: H! U  w. u7 x' g) n
  Win32_Printer2 }( R9 Q/ B. a9 D4 \) k  {4 U% Z
  Win32_PrinterConfiguration8 B  U" ^/ U9 g- a  _- y
  Win32_PrintJob
6 t7 G1 x- p, y5 a" N   Win32_Processor
( W) D: D2 u, r. E" n3 d   Win32_Refrigeration, {. Y' J2 a& e  r! W$ Q
  Win32_SerialPort
5 a; h& ]8 [" ~   Win32_SerialPortConfiguration  F/ Y5 z: T. ]  N( I
  Win32_SMBIOSMemory' P/ t) J$ o! P( Q6 S8 I5 ~4 o
  Win32_SoundDevice3 u3 r& ~" t* F/ I
  Win32_SystemEnclosure
9 R, m9 \2 c+ X; }   Win32_SystemMemoryResource/ X5 F7 \  a% d, m' _( t
  Win32_SystemSlot* L6 X! _6 u& ]5 d
  Win32_TapeDrive
: C5 `! b& W& l9 J& b8 g   Win32_TemperatureProbe
5 H9 m- T+ f( Q0 a4 E* |   Win32_UninterruptiblePowerSupply
* E9 {# V1 L( o   Win32_USBController4 ?0 Z: o+ K" J, a' d7 a; E
  Win32_VideoConfiguration
, n  _1 Q2 P3 g6 q0 f* L; [   Win32_VideoController* w/ O, c0 m# [+ J/ v
  Win32_VoltageProbe
& w; y. N* U/ I) ~. r2 j2 [! ?) y) @0 x$ P: V( S; \. Y2 V* V
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-19 12:23 , Processed in 0.018788 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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