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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
  Z  z" Y+ P! w* s# q- P; a  R
' f7 z& K0 w' P3 z; G. L9 G
) x& L1 k9 t' Y. A--------------------------------------------------------------------------------( i. V6 L( w8 [; d- B* L
WMI: Windows Management Instrumentation (Windows 管理工具)
5 K: q4 ]4 P. `! m. o! B' t   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
% l2 S4 A5 q' f7 E   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
0 |/ n" a" ?$ G9 V* _1 K   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
! r1 u& ?: `2 j% n  I6 |# e4 W2 ]! |6 ^5 j- H) ?" v2 r2 m
--------------------------------------------------------------------------------* ]. N( C6 }1 K
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
5 E9 r; T8 r* c' t  e7 @" r4 I9 ^6 E6 g$ {- H3 H+ n
--------------------------------------------------------------------------------
# }# v/ f9 @( k① 初始化 COM 接口:
% C: _! z5 E  m8 U; `+ Q/ n2 {- p7 X2 N% }   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
1 h3 l( z7 m9 m   这两个函数在 #include <comdef.h> 里面定义。' `# S' [$ w: {5 M$ P- I2 V

) V) ]8 \) w" m2 J4 g' t, c② 获取访问 WMI 权限:
9 h8 h# J  o' M  {   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
. v5 ^5 b3 x; b0 E   如果这个函数返回 S_OK 获取权限成功, 否则为失败。' `1 A  h6 G; W$ O
& o& N2 T3 ]* b2 B1 @3 i
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:) Z$ l/ j4 T2 v  y; g3 w5 l% ~
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
4 }. X2 ~3 _, l" r7 l. t
4 u3 [4 _  W1 k& Pvoid GetWmiInfo(TStrings *lpList, WideString wsClass)4 V+ j2 w4 [& ]# n) J
{- s8 e9 q6 |' q: }9 I: a! r
  IWbemLocator *pWbemLocator = NULL;6 F& c" o0 m% U0 x
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
4 d9 e" g, o1 P/ n0 _0 W: j  Y   {8 ^* |9 E" r0 ^( W( g
    IWbemServices *pWbemServices = NULL;# |" ^: B" S3 `% S0 j
    WideString wsNamespace = (L"root\\cimv2");
2 Z% y9 Y& Y# g, Z  x8 }     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK). S2 e. i) v9 B8 \" z# ^$ h! d: `
     {4 `8 C5 ^4 F) W
       IEnumWbemClassObject *pEnumClassObject = NULL;9 q! z  b5 A  d+ s" |  ^# F. q2 x7 s
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
6 }9 S; R$ h9 M6 K4 f  t9 k        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
6 ~+ G* H$ S! J/ [2 K2 G! t0 f5 T         {6 r' d- F# M4 l, A7 m
          IWbemClassObject *pClassObject = NULL;
5 P2 }4 e9 a4 ~9 _$ u3 D           ULONG uCount = 1, uReturned;# s, A- Q6 d. x
          if(pEnumClassObject->Reset() == S_OK)1 P) f9 M7 g3 J% @
           {% F! [; x1 z) B7 J2 Z+ b
             int iEnumIdx = 0;3 {$ U' I: Y  @0 M8 B; _+ J, t
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
/ z+ |5 z& O1 v9 T7 N7 H               {' f) x& W! ?' S6 o8 x! |
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");' j, X4 a* W1 c" t$ d

: M& a4 T, e. @& E, b* G                 SAFEARRAY *pvNames = NULL;, F$ d# n& k3 d9 Z2 }
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
2 M1 ^1 t* m8 y; I, ^, G                  {% W+ q( o0 k5 a
                   long vbl, vbu;
& S: ~0 \& o+ v* m                    SafeArrayGetLBound(pvNames, 1, &vbl);
5 n  M, l, n$ e' G! C! `                    SafeArrayGetUBound(pvNames, 1, &vbu);* }6 \6 `" X' S5 u
                   for(long idx=vbl; idx<=vbu; idx++)% ?2 }4 C4 T9 R
                    {* S& w5 L1 h/ R/ ~5 p4 D
                      long aidx = idx;
* Z9 Y2 J( U% |                       wchar_t *wsName = 0;
5 @; [3 N* b( W* k  L# S' d/ z                       VARIANT vValue;( C/ [# H  _6 I# g
                      VariantInit(&vValue);3 c  d- n( s& i* a
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
% j! [' z! P  w$ u- _( f* y; ^" R% K5 M! c7 r
                      BSTR bs = SysAllocString(wsName);
8 m) z/ j$ i2 V                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
/ g: X6 ]! }9 I2 `                       SysFreeString(bs);
( p& }% B. U- [# h8 Z/ m+ J& Q; C- G( s/ Z  T5 k
                      if(hRes == S_OK)
9 S: R) @# d  e- b/ x$ F$ K                        {: F$ ]2 ?  H( h: p
                         AnsiString s;
) z: G! a/ ~" @! f                          Variant v = *(Variant*)&vValue;
& |( k0 e1 b* }9 C) u                          if(v.IsArray())
: l; m: |) n+ r6 R6 }+ W& f                           {) i4 d0 V. ^2 u9 ?
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
, r4 b4 a/ ?+ {( @8 L, B: H- @                              {# l0 t0 f/ {# A; R9 |6 S+ }% u
                               Variant a = v.GetElement(i);
5 l/ \) t5 p8 c+ V                                if(!s.IsEmpty())
9 z( U* U; F' f9 k8 }                                  s+=", ";
- k1 l: C$ p) P* L% U+ y+ Q                                s+=VarToStr(a);
) z  r0 Y% G  E% b2 O                              }
* [; R' Z: |3 M6 }                           }9 ~) f: Z" P# G$ ~  f" `% ]" b/ X2 B: v' j
                         else
& q. W, B3 n  C1 X% h, Q5 x; ~! u                           {
6 v+ u+ A% |0 ^                             s = VarToStr(v);
& w2 ?) _1 C: p) |0 w# e                           }
' g5 m- o7 G/ V1 w1 i% C! H                          lpList->Add(AnsiString(wsName)+"="+s);; O1 O1 J) l) W$ H
                       }
/ m3 x/ q" ~7 e1 c% t/ v/ O: M* V' y
                      VariantClear(&vValue);
! M3 W: V: N' a! _  j                       SysFreeString(wsName);
1 S( E6 }9 v9 Q: \6 c                     }, J& C2 l! j/ r0 e& |% Z
                 }
# s2 B, ~, U" k! l5 B; Z' I% J/ Y% i                 if(pvNames)SafeArrayDestroy(pvNames);3 U8 y; Z+ Z- {2 Y1 i; M
                iEnumIdx++;
, e. C) B1 d% m$ P5 [, P: m% o. H' Y               }
9 o# g6 D# m: Y8 H3 w            }
* N. U' I4 r  `$ X           if(pClassObject)pClassObject->Release();
0 m/ f2 N2 ?8 {+ g         }. K8 y6 U6 P: n/ N  p
       if(pEnumClassObject)pEnumClassObject->Release();
. J+ ~( f* H" X  ~+ y  e! C: v      }+ f' \0 L! M* E3 ]
    if(pWbemServices)pWbemServices->Release();8 U( z: w8 k6 A; A
  }+ k: V; s1 q) o) w
  if(pWbemLocator)pWbemLocator->Release();) j, Z( x: X6 [, n
}
7 Y4 o. n( J$ \//---------------------------------------------------------------------------7 n9 f* {7 h; t. u. O7 Z1 y+ }* d

3 I. `; q: J" b' u- ?// 通过 WIN32_bios 获取 BIOS 信息:6 u. P- G" `' _* g/ q0 m2 Z7 Q  i
void __fastcall TForm1::Button1Click(TObject *Sender)8 Z2 Q7 `3 }7 C" H" R7 F
{
  ~+ d$ w- m; k# i, g1 a, J    Memo1->Lines->Add("================== [WIN32_bios] =================");
; T4 g3 d  x! ?3 A. n. y    GetWmiInfo(Memo1->Lines, "WIN32_bios");( e+ C* L' D/ N, |5 k" e
   Memo1->Lines->Add("");% v  U5 N5 W+ u, Q
}
! m" s5 {! s: }& C, c& D3 ~: D( ]
--------------------------------------------------------------------------------
$ L' B, z0 C* D/ Z8 j& c+ r5 M: H) a$ b1 T- `7 d
WMI 可以访问的信息类型有:2 l" g" @- ]/ r
  Win32_1394Controller4 l7 h6 e6 \1 R9 X& m7 F
  Win32_BaseBoard  D% t! ?" v; d+ x. i% D
  Win32_Battery+ c6 s1 K1 V8 w, h+ i: z
  Win32_BIOS
: x# o" _8 ?, t2 C, f( ~, h   Win32_Bus
$ Z: w+ C+ Z! W! ?   Win32_CacheMemory
0 O3 o9 {# e4 U9 ?   Win32_CDROMDrive
( p5 Q; G9 A* a   Win32_CurrentProbe
7 m8 S) r4 N' ^1 z- w   Win32_DesktopMonitor
3 y  w; q0 g9 v1 X9 ~   Win32_DeviceMemoryAddress; ?2 O4 \" h- ?- K1 o0 _& l8 T) P
  Win32_DiskDrive% Q: l4 r6 I: q8 O6 i% |
  Win32_DisplayConfiguration
& ~2 G, n4 w2 Z0 l   Win32_DisplayControllerConfiguration
" n/ r6 L' H3 \, \& C+ N" g. S- w+ u   Win32_DMAChannel: j/ U; s: y% a1 b& U
  Win32_Fan
8 }+ j) `; _: K0 V; v4 l   Win32_FloppyController) j4 X* \9 w% y
  Win32_FloppyDrive9 m, N! C* `7 @+ G) T
  Win32_HeatPipe
( {4 x. g# Z5 H/ f# Z1 S4 a3 u, B3 w) d   Win32_IDEController6 [( B; P1 I9 B7 S0 l
  Win32_InfraredDevice- a5 a5 z* u- k, c
  Win32_IRQResource! X6 y( T! F% K( O8 ~
  Win32_Keyboard( K$ m8 l1 U! v% X
  Win32_MemoryArray
. S/ B% i$ p& ^: P: v# C2 b1 l; g   Win32_MemoryDevice( q8 G0 Y& m9 m1 r+ l2 |4 p
  Win32_MotherboardDevice" \0 H: g9 z* G& O* F4 e: H& }: m& P$ r$ c2 A
  Win32_NetworkAdapter
( W* U2 p: i' m4 a4 K0 ?& ^. R   Win32_NetworkAdapterConfiguration
. H: U( P  x/ m6 t1 a& J# ?/ a   Win32_OnBoardDevice
9 g0 l, u7 m" y   Win32_ParallelPort& R+ Z, ]4 y/ R+ ^# X/ O/ u
  Win32_PCMCIAController
# I2 |9 W7 M4 w5 F   Win32_PhysicalMemory- u0 }8 G* H: _. U! P3 U/ \9 O
  Win32_PhysicalMemoryArray( w# ?) c( Y6 @+ u2 r2 c1 D0 ^
  Win32_PnPEntity" c8 P+ ?( ~# P* F+ D) |+ W
  Win32_PointingDevice7 j; C7 [# B; H/ w6 M: O1 [5 F3 e% v
  Win32_PortableBattery; Z. R: c# w+ N% p+ n
  Win32_PortConnector
% |& i* ~) _$ c   Win32_PortResource' j6 u7 F3 f4 s, z6 s: e* z3 t
  Win32_POTSModem
0 v' Q2 i, P) _. i+ }   Win32_PowerManagementEvent8 _+ x: }4 W& n2 O5 V* K& T
  Win32_Printer
" ~# C2 E2 Z+ t7 n; T; T9 h   Win32_PrinterConfiguration* w0 B" H6 J# m% n' m% }
  Win32_PrintJob
/ s; I. x4 ~( L. B" N& @/ N) x0 [. B" S   Win32_Processor2 U# h& ]/ {5 n6 L
  Win32_Refrigeration+ }! f- p$ t: |! H3 o8 M
  Win32_SerialPort  S, _. Y4 `( G5 [4 Q
  Win32_SerialPortConfiguration6 F+ U. [+ p! h  a
  Win32_SMBIOSMemory
5 R: z# z  P4 F4 ~$ z   Win32_SoundDevice
: O$ U( r) P# q8 n; P   Win32_SystemEnclosure) E+ ?$ Q* ]7 [
  Win32_SystemMemoryResource" w7 e7 X! F/ J2 u- b3 K# m( `
  Win32_SystemSlot
2 U5 m- e/ A8 x   Win32_TapeDrive
. o/ }+ y9 T: O9 Q2 Y6 s2 `( a& M   Win32_TemperatureProbe: v' P% S+ K9 f, w
  Win32_UninterruptiblePowerSupply
( J- e$ D; ]8 D% Z! W6 Y/ y   Win32_USBController+ n, X" W7 k* d2 |
  Win32_VideoConfiguration
1 u+ @) K+ Z0 d4 ^% P( F   Win32_VideoController% _) k3 b5 ~1 W" M
  Win32_VoltageProbe: l+ @  Y8 `2 l/ F

, L8 y* S" {# L+ J2 `以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-10 21:58 , Processed in 0.019900 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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