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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)5 S& ?' F9 z! ]. t. {! G7 k
% U  o2 u' a) p* w4 |. h2 N8 M. W0 k( M

2 h4 y- D$ S9 A, y# n; a0 {--------------------------------------------------------------------------------+ I- h" Z4 j% P6 H& U  \
WMI: Windows Management Instrumentation (Windows 管理工具); C/ _; E; z0 r4 ^+ @3 w0 N
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
! f0 A- Q, m: X1 Y$ ?$ I4 n   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
# I3 _; ~' `  B) f7 K   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 + r: F; A4 N( x7 K: R3 c% H

7 a' i* I- N) m2 `) \--------------------------------------------------------------------------------
  g5 @: v' R5 y5 w3 `7 j7 \9 jBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面3 k5 C6 f& i. L

  A2 O$ W% H; M. F1 W--------------------------------------------------------------------------------
9 S& R1 g  D: N& r① 初始化 COM 接口:
* v4 P- B8 g9 c' r/ _   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
6 o# D* o$ g2 v8 R   这两个函数在 #include <comdef.h> 里面定义。$ q+ n  [" n8 u, v
* C6 `$ D3 k$ z
② 获取访问 WMI 权限:
4 o$ n7 N& q5 ~   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
% p3 ]' J4 W% |   如果这个函数返回 S_OK 获取权限成功, 否则为失败。( Y$ v# @, I  t7 G( ]7 j

( C! F. ?# B3 L6 }; r③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
  z! i% Y" ~( w: t# L/ ?4 W% J   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。9 H: ~# B) G; z; O" d+ ]  H1 ]

0 Q3 u( D5 A8 x0 [. Z3 W3 bvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
# k( n7 w( C& _{
  v, N( z, |5 _  }: ]  m4 ]+ j  IWbemLocator *pWbemLocator = NULL;. v" ^4 U  c4 ^, O; R6 O
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
/ N: M7 m2 d0 Y   {4 C# i) _# ^" w& H5 K
    IWbemServices *pWbemServices = NULL;( L/ g4 D# T* m6 E: h
    WideString wsNamespace = (L"root\\cimv2");% C( w* B% G# x/ Z
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
- ]& S; h5 v/ G' u! Z9 p: W      {
* C& }- a9 |* R( y. y        IEnumWbemClassObject *pEnumClassObject = NULL;
  u9 e+ C9 O1 i0 H# @) f3 A; B        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;: t6 Z/ b4 K& [4 E( s
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)5 i& m8 [: s. A  u. d
        {
4 E) T9 f9 E8 V+ a; n           IWbemClassObject *pClassObject = NULL;
  u% W% g3 g5 @; U- h           ULONG uCount = 1, uReturned;
1 T* ~) w* h3 ]  E$ `/ \/ `           if(pEnumClassObject->Reset() == S_OK)
, B: D2 ~5 A+ n( U9 K" ~            {
% @, @2 |, D) T& Q              int iEnumIdx = 0;
% i' a2 P& w- }% G5 y4 J              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)6 z' `- w7 v' @: R, v" P" R
              {: U" x7 F$ l2 x3 s6 r
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
) b0 y* G3 v, M2 f+ E4 j+ V1 N4 H' a* ?: q
                SAFEARRAY *pvNames = NULL;
/ P2 E9 `# K3 K6 o; Z' z+ Z                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)" X6 d# @0 q3 m  B! e5 @* N+ x+ D' h
                 {
0 D, u, M* N( f) u9 f0 A                    long vbl, vbu;0 v; z9 R+ Z9 [& d; k. g
                   SafeArrayGetLBound(pvNames, 1, &vbl);0 _" f7 Z4 s# ?7 C
                   SafeArrayGetUBound(pvNames, 1, &vbu);8 v; \- [* I" K% z4 N% o
                   for(long idx=vbl; idx<=vbu; idx++)5 }, |$ k. i2 W- `* U: v$ J' e
                    {
( p1 V4 L6 [5 k, G& l                       long aidx = idx;
+ m4 ~2 q0 B  W, Z                       wchar_t *wsName = 0;
( Q- |  E. A) j2 c* E                       VARIANT vValue;
: q0 X7 @# e. |9 O4 o- D( j3 j2 f                       VariantInit(&vValue);: @9 ?2 D6 }- b) ^4 ^. \
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
* b+ h) }( C  i/ `. G: E' P) Z
* d# V1 i3 c" q4 p                       BSTR bs = SysAllocString(wsName);( y' i: F% D+ d. a
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);# J. A: K, E: D$ O6 D
                      SysFreeString(bs);0 i  y" i' J2 X7 b+ F

" J( n0 y0 ^3 _6 c                       if(hRes == S_OK)
/ m& U, z1 O$ \( e/ ~                        {0 u  s$ ^5 J0 C
                         AnsiString s;* y8 i8 {9 ^4 h; r) n
                         Variant v = *(Variant*)&vValue;
7 l3 |3 f  r" q3 h3 i; B                          if(v.IsArray())
+ {4 @7 ~1 P) `6 `- A/ ~/ s  |                           {7 ~7 `6 w9 P" n5 Z& Y1 G' c, T  p0 V6 B
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
: t( d' _  f2 V( S2 b6 [                              {% l# h; |9 I( a1 Y
                               Variant a = v.GetElement(i);% _! h6 `7 G6 s1 q' B. j
                               if(!s.IsEmpty())
( ?! p/ u. u! y# t: [' y8 |                                  s+=", ";
0 ]+ O7 ^. m& @$ @7 I7 h' v                                s+=VarToStr(a);
2 w7 _1 ^' |7 ?& R0 ?0 w/ O  y9 D( Q                              }4 }& n/ L( S. l. F, r
                          }
/ {% x* E8 w* a7 J$ F                          else, ^0 f1 l1 s" y6 O1 g
                          {
* |- `4 ]- a0 M* Y$ _                             s = VarToStr(v);
  O1 ]& K7 d0 ]$ o; G4 c                           }
# s  k" \) t1 I5 J  |                          lpList->Add(AnsiString(wsName)+"="+s);
6 b3 j5 h, F* G. c+ Z                        }
6 }5 y3 P+ H2 H! e; J: ]3 P; u0 R3 M: N( ~
                      VariantClear(&vValue);, p3 B* s3 N' U; A# K. _
                      SysFreeString(wsName);
# ]; k9 f& S; t. R( s9 v( r                     }
3 W3 B, ]' x  O6 J9 S3 b                  }- [/ T: b* r) ~
                if(pvNames)SafeArrayDestroy(pvNames);# |" f, h) B: ~$ J# J
                iEnumIdx++;2 X: j. I$ L& A- f; A( b
              }
! C- s0 F3 D1 W* F% J, S8 A- D2 w; V            }
7 G" B: K9 X8 Y- e8 g( x           if(pClassObject)pClassObject->Release();) d+ e& H( C* R
        }3 K# H1 C6 y- Z4 g* J+ l
       if(pEnumClassObject)pEnumClassObject->Release();2 [7 J+ C* A3 G7 W5 [
     }& g( j$ \/ X, H1 Z
    if(pWbemServices)pWbemServices->Release();
. v8 D! K2 l6 }/ f7 R  Q   }
; G% d. u; J) @  if(pWbemLocator)pWbemLocator->Release();
5 |2 I% z. e& c) J, W3 K4 o}
6 \/ w! |6 `( F+ N& y& J+ Z//---------------------------------------------------------------------------
  D% F$ k  g/ |) R  b+ W2 Y: E0 ]! Y9 `' o0 g; U
// 通过 WIN32_bios 获取 BIOS 信息:: \, |5 K9 y8 k
void __fastcall TForm1::Button1Click(TObject *Sender), N0 U5 }' G  ]5 g% ~- r
{2 H- L7 t5 i& F! o' c
   Memo1->Lines->Add("================== [WIN32_bios] =================");1 X. T- E% Q  S) N( T7 s
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
5 q6 L1 D! F& A' n    Memo1->Lines->Add("");
1 Y8 N* P5 f6 j% V" V6 J- K}3 H! Q. O! c6 U" g4 T) ^
2 V) o8 d; ^- t
--------------------------------------------------------------------------------! j3 w1 X: W6 p" h. w
- T% }3 _( Y  J8 m3 h3 ?
WMI 可以访问的信息类型有:( x. d" ^+ u+ e& Y' I) x
  Win32_1394Controller$ {' m/ ~% z- d
  Win32_BaseBoard
& I* O0 a6 E3 ~* D9 O8 y/ I  f( |+ j   Win32_Battery3 E' l  S. ?) f4 T) Z) r; A% f
  Win32_BIOS
: n: l+ E- n1 J- _7 e3 X   Win32_Bus
0 k7 |- p6 z6 n& G8 P! ^+ _   Win32_CacheMemory
; H$ j: C( f4 T7 \6 C# I/ p   Win32_CDROMDrive
+ Q' c7 z; ?# l5 e' {1 ]- U   Win32_CurrentProbe; i7 e1 d; x, L7 a& r
  Win32_DesktopMonitor0 G+ R0 E5 S2 Z  l8 [, J) L$ i
  Win32_DeviceMemoryAddress# }; y. O& r' I+ N
  Win32_DiskDrive9 V1 {( [5 n! r/ t) w
  Win32_DisplayConfiguration9 v+ e% v; [" j) }
  Win32_DisplayControllerConfiguration
) f& p% \9 X# {: }   Win32_DMAChannel8 @) \6 _& H8 z' O* `! m
  Win32_Fan
0 @7 o0 h, m( j% T6 y   Win32_FloppyController9 x6 s) {2 {: W! X- J+ O# `5 ?
  Win32_FloppyDrive1 G# O( z6 n$ c% f+ o3 J
  Win32_HeatPipe
- U2 \( y  H5 ^5 {7 n# R   Win32_IDEController
$ h! `& U5 \) ^   Win32_InfraredDevice  x( T- n; a, j6 d) R) l
  Win32_IRQResource
' M& R( X: I1 ]$ ?4 w1 ~' y   Win32_Keyboard; H* d' S0 `& }7 Q, Z$ n
  Win32_MemoryArray& v" P: ?. b( a3 R) S0 s- o
  Win32_MemoryDevice
& {5 W' ~" n6 a+ Y   Win32_MotherboardDevice
! o( i. v- t: G0 Q& o, d  F   Win32_NetworkAdapter% I. y  a! K2 r5 ~* P$ b+ z
  Win32_NetworkAdapterConfiguration* f. \6 Y* @! v% I2 s7 ?, n
  Win32_OnBoardDevice
) i& Z! w1 k# j8 a$ y) q; v$ W' @   Win32_ParallelPort* _4 V- V- {8 M/ `% u  r% C/ v
  Win32_PCMCIAController
  V! g0 V) E! R# y7 k  p; h   Win32_PhysicalMemory
' O. j8 W( k& ~5 i   Win32_PhysicalMemoryArray; ?* C; {! j3 a2 B
  Win32_PnPEntity' d/ a4 G: T8 ^' f0 d
  Win32_PointingDevice5 t# y9 U1 G, C9 K
  Win32_PortableBattery
4 ]0 y7 \7 d* G/ s& Z; M   Win32_PortConnector
. z# h! A2 ?. H" m' p- [, R3 o/ \   Win32_PortResource
7 U2 ?1 N8 ~5 g3 L  w4 Z   Win32_POTSModem: m+ G0 l5 y0 R+ y. Q
  Win32_PowerManagementEvent
* X3 {  a3 P/ p9 ]% E# J   Win32_Printer- O; N( A6 `, }6 |7 ~: C2 z' g
  Win32_PrinterConfiguration
9 O  u6 I6 Y: x* l3 d" e   Win32_PrintJob
5 V$ V" e5 ], p4 F7 z; r   Win32_Processor: a4 `  C& x) @& @/ {
  Win32_Refrigeration# k6 T% U4 o4 L9 U
  Win32_SerialPort
" }) q+ s7 {1 W. s! L   Win32_SerialPortConfiguration
6 _% ?. @3 Q6 c7 i) t' ^2 B& }8 L# k   Win32_SMBIOSMemory
7 ?/ d. _: U' ?8 J0 z% n* s# R6 f   Win32_SoundDevice$ z) c9 s/ }9 ?- M0 R+ \7 y& v: L
  Win32_SystemEnclosure
0 n( z3 a$ c$ P   Win32_SystemMemoryResource
& I7 e% U! K3 B/ N" v  l+ W; |9 f   Win32_SystemSlot
4 Q/ d! I7 O+ A5 ^# B: J   Win32_TapeDrive& f' F2 V7 Z7 }  \* S1 I6 b- u
  Win32_TemperatureProbe" D( E! Z! ^+ y7 x  w% D: V* s! @
  Win32_UninterruptiblePowerSupply
# q4 B& W  K! p; v" b1 m' x8 V: O) I   Win32_USBController
/ H. O: E7 E9 r' B6 i1 o   Win32_VideoConfiguration& I+ K$ l, d% \) N* l' g3 x
  Win32_VideoController
/ r; J6 h- v% `  k7 L9 Y" c* O   Win32_VoltageProbe
$ f( V# E, E( |# S& P1 f6 J, x! l
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-29 16:51 , Processed in 0.022263 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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