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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)1 }' Z- L# Q6 T$ ?! p# c3 k
) V8 R4 h8 H; Z8 {4 y. x& `( E

- s: N$ b, L, ^/ j, ]4 }--------------------------------------------------------------------------------
/ ?8 I3 u( @8 ~" ^) E5 R2 l, qWMI: Windows Management Instrumentation (Windows 管理工具)
7 g( \) g3 ^* R% ?3 c1 Y2 q; N   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
- r! `. W4 k' Q! q3 u7 |* D* _   利用这个工具可以管理本地或客户端系统中几乎所有的信息。4 {3 Z, z( h) X
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 3 e( @; y" _- m, A4 z
8 V) Y- X- {0 d/ g
--------------------------------------------------------------------------------& X+ x( {) n& d. R4 @
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面2 m& v2 I; {. `$ I
) |  V. p" @! K5 P" t
--------------------------------------------------------------------------------
- N1 s4 d" g; N; F- O, a① 初始化 COM 接口:' O3 V" r0 ^6 w& l9 Z+ [; H. y5 `
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
( F. Y% e% O/ `   这两个函数在 #include <comdef.h> 里面定义。
( k5 D/ q5 K. T( U8 h% {
1 E' D5 V  r: n% u  M) d3 L! Q② 获取访问 WMI 权限:
& p( @# U/ \) P( H% Z9 R   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);' B% r8 y! Z9 `0 [+ \
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
) |  y6 R% V' P) |# m: r- y6 j, ?; A5 f9 r% b% K7 i
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:+ S6 b( ]0 j9 S! I7 B
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
7 D/ z1 r5 d, E8 [, {/ t, y$ N6 o% {, j( |4 D
void GetWmiInfo(TStrings *lpList, WideString wsClass)3 s1 W4 Y% q6 L) O
{/ W& W/ q( H/ X  U7 e" n. W
  IWbemLocator *pWbemLocator = NULL;; G. \5 m: S$ G1 e, n
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
. W  A5 {5 J' [   {
9 n% e6 O7 L, h& _0 Q     IWbemServices *pWbemServices = NULL;
5 X  O; P( P! J  s2 ~     WideString wsNamespace = (L"root\\cimv2");
% T8 A  X9 _8 _     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
& n( t3 k/ b/ b; `, B0 s5 @      {* @1 e& p" \- _) W; x
       IEnumWbemClassObject *pEnumClassObject = NULL;+ t1 j0 b$ B) I4 B1 i  C% G) i$ x  t
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;4 G- @' @- x8 x  Q, l
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)8 t4 u4 B" N5 Q% W% {- k; X
        {
6 h2 ]3 {$ q7 ~: y/ W           IWbemClassObject *pClassObject = NULL;4 W( R5 [2 @' c) V0 t
          ULONG uCount = 1, uReturned;: a5 X% P& \4 ]' r7 u% J& c
          if(pEnumClassObject->Reset() == S_OK)2 a2 t/ u0 H0 u9 F
           {
: G* q+ n) v+ ]. a' T( z  U. G0 n& W/ a              int iEnumIdx = 0;* o" H% Y7 Q: o' W* a
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)/ Y. a4 z) f3 \$ \6 S# D0 x
              {- B2 @9 z% i; h# O3 H3 r
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");4 v4 L/ h5 F- U8 P7 f* ]

6 F/ G) ?! `0 a* k: _1 e7 ~                 SAFEARRAY *pvNames = NULL;. s( l% I) i) B0 F* s& u
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)4 Q* w; V$ N/ m4 Q
                 {+ P. a$ E. U( p8 o. F+ z( s
                   long vbl, vbu;# t. u5 z' f# ^
                   SafeArrayGetLBound(pvNames, 1, &vbl);2 P0 y; u- E; H4 X- ~
                   SafeArrayGetUBound(pvNames, 1, &vbu);
. a0 p7 V9 r8 s* l9 T. z$ `                    for(long idx=vbl; idx<=vbu; idx++)
- X6 G$ g6 w6 m1 I* }                     {" d, F+ O1 R) y: g
                      long aidx = idx;. ]/ S5 g% k  Q! n" v/ c" v
                      wchar_t *wsName = 0;2 [* J. R& P- R. B: K( o
                      VARIANT vValue;
. Y7 Y: k  i7 s$ D; @                       VariantInit(&vValue);
" H' O2 A% g. B/ d8 x4 z& w: ]                       SafeArrayGetElement(pvNames, &aidx, &wsName);
& z3 e: x2 r1 y6 I4 l7 Y4 O
& [, |1 S) K* Y3 D& E9 b                       BSTR bs = SysAllocString(wsName);
/ G* n. L* g0 i! X# Q" @                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
: c8 J  ]7 S) ?4 h9 K) _                       SysFreeString(bs);
! I, \/ B! A) a3 E4 R
+ Y$ j+ x& O' Z                       if(hRes == S_OK)# M3 }# l" O- F( {) o. X, p5 n0 S
                       {2 A: K- a1 Y/ ]% u4 q
                         AnsiString s;
1 R4 x  _3 ]0 t                          Variant v = *(Variant*)&vValue;
. Y' `7 R8 h$ k  C% u% R$ [                          if(v.IsArray())
- N# T& \) \% h) A0 v$ w                           {
9 V$ V; C" t4 w9 K# w                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)3 P# f5 ]' ]$ p% t: e
                             {$ v: V0 q4 t8 W8 y: J0 A- }
                               Variant a = v.GetElement(i);- p0 T7 s4 A7 _& e
                               if(!s.IsEmpty())
/ c5 ?# z8 G- ~9 T& ^  R                                  s+=", ";
. V) m4 |1 r0 r3 j& k2 g                                s+=VarToStr(a);! p) K* U( F" Q: H; a
                             }
( o+ k+ i, I+ p! i& u                           }
( \" O3 X, j" f! q( y0 Z  [1 |                          else# j5 f$ f  V6 j* u3 h8 D
                          {4 m/ X: C9 w% Z$ [* R: A9 d2 }
                            s = VarToStr(v);
" w- ?- T* S  H+ Q9 T                           }
- N; o6 P9 y" \* ?: ^                          lpList->Add(AnsiString(wsName)+"="+s);
9 I  I0 i& d; R- W# E; a4 X                        }- x9 o5 Q# r  A  t3 y: W1 a: t

( A) D$ G( u$ K2 i                       VariantClear(&vValue);: b1 ?3 x7 l8 D/ q- @6 x% A
                      SysFreeString(wsName);
2 Y' P2 S- R8 c1 w5 ~  W                     }
& [# l! r& y; a# X' E( e$ G                  }
8 u3 X$ M+ j" O+ j; n) j' w) h                 if(pvNames)SafeArrayDestroy(pvNames);
6 A+ ~0 s) _3 O6 J+ h5 r6 p4 ~                 iEnumIdx++;3 {, p% V: E8 E5 k' \
              }
* i7 J* g# m' x% ]            }* K7 F/ v  V( t
          if(pClassObject)pClassObject->Release();3 \. }( E/ L& v  k
        }
/ \2 H+ s3 D2 i! y, h  h5 `; M        if(pEnumClassObject)pEnumClassObject->Release();
. z6 Y& |9 e: J* T4 p' \1 g      }, y. R( n* z5 R; f1 m
    if(pWbemServices)pWbemServices->Release();7 U; \+ v( ]) U) |& {
  }
" ]# s9 \) v! G9 S9 a! B4 C8 o  if(pWbemLocator)pWbemLocator->Release();3 s& R$ ?9 E! k3 z# q, v# h, u
}% F: W/ p5 j" l
//---------------------------------------------------------------------------
3 [" m* n0 o* q7 p- k0 F3 G. R9 Y; @, Q$ b) p! k
// 通过 WIN32_bios 获取 BIOS 信息:
/ d5 C# Y2 q9 l. ?4 tvoid __fastcall TForm1::Button1Click(TObject *Sender)
/ `' W6 @+ P: Q{
+ q( H' g- L: m4 I    Memo1->Lines->Add("================== [WIN32_bios] =================");
$ J+ g- ?; h: {4 ?2 g    GetWmiInfo(Memo1->Lines, "WIN32_bios");* x3 C% x  `) ^6 {
   Memo1->Lines->Add("");
3 x# X" p- \- l5 e+ |7 s: @. Q}
1 M+ ?; M  B. g" s4 n, j9 `: J3 x; `' S% U* }  W: c7 G
--------------------------------------------------------------------------------
* f0 O  K+ J5 ]$ M2 Y0 i  B5 n' K: z% L1 r
WMI 可以访问的信息类型有:
1 n6 D9 n" N9 z5 X   Win32_1394Controller
1 J! g+ z! |0 b/ a4 Q# Z   Win32_BaseBoard0 }8 W& Q4 D, r9 |; c
  Win32_Battery
  G, p+ _* s8 N2 c" o2 p7 I" o% C   Win32_BIOS/ C0 X" m* u' X' n* {/ j5 ]& \
  Win32_Bus
* D8 G7 L$ M6 D& ~7 ~   Win32_CacheMemory
; l6 z' i& `" \1 K   Win32_CDROMDrive
# E3 m- r; N7 D   Win32_CurrentProbe
9 J/ t# Q1 G$ \# _   Win32_DesktopMonitor* S- v8 @. ^; B& p
  Win32_DeviceMemoryAddress$ _6 t5 r" `' e" B4 x1 ]- M
  Win32_DiskDrive+ U) C( m( o; M
  Win32_DisplayConfiguration
2 _' S* W1 N: M   Win32_DisplayControllerConfiguration  `  C; z9 S9 a- G* [2 u
  Win32_DMAChannel
4 R% j) R* Z4 {9 S0 n8 G   Win32_Fan
) E9 f, U% s/ K: e8 E& W/ k& i   Win32_FloppyController
! S  t% j: K  E- z% O   Win32_FloppyDrive* i" p6 k- ?7 J) p: _
  Win32_HeatPipe9 _7 M( |$ q1 G& c
  Win32_IDEController5 X" ]$ j& d$ E* V/ V  ^
  Win32_InfraredDevice& t  H. U& _8 B% t
  Win32_IRQResource( z" E$ _( K: e
  Win32_Keyboard
7 c' Y7 i( d5 B   Win32_MemoryArray: |, g, S+ e! q: r0 t! d1 Q1 t/ Q
  Win32_MemoryDevice4 Y4 Y. b9 R4 m7 g- I4 I
  Win32_MotherboardDevice
. ^9 R- Z4 t- G: U( f9 `   Win32_NetworkAdapter
- b6 t& i  q7 L* X0 S8 o   Win32_NetworkAdapterConfiguration4 [( @: z. C1 K4 q5 x/ [& \& j: S
  Win32_OnBoardDevice8 M5 M7 m9 C9 ^
  Win32_ParallelPort
- |7 Q* f5 `( q0 }   Win32_PCMCIAController8 u2 t$ A6 b. n, s2 u6 q* M  L: `3 z
  Win32_PhysicalMemory3 b7 K% @- y. \5 i! B9 t9 ]
  Win32_PhysicalMemoryArray
/ e( [, e1 T4 p- j. }5 e   Win32_PnPEntity
  z+ L/ [1 W) |" k+ w2 `   Win32_PointingDevice
  I) ~5 P- N3 n. @- @' _   Win32_PortableBattery: G' {( D8 C2 o. ?0 C/ p
  Win32_PortConnector% n8 a! ]# _8 L+ M& T
  Win32_PortResource+ Y/ V) L' ?# h4 x
  Win32_POTSModem4 J3 W: F( h- D( G
  Win32_PowerManagementEvent
6 U: f2 N! o! j   Win32_Printer8 c5 u5 ^& O7 ]& K
  Win32_PrinterConfiguration
; k  E) V4 I: p  K& H   Win32_PrintJob
+ s" G" O9 {) \% H) `   Win32_Processor; O! q7 T( j3 o: F" t# a6 @  e6 Q& D
  Win32_Refrigeration$ d6 L) B% Y9 x* c5 y
  Win32_SerialPort
/ h% z2 d" _# p0 k8 x% D' J   Win32_SerialPortConfiguration
: I* A$ [$ b( @+ W) E0 n   Win32_SMBIOSMemory; r1 x9 _; T! W" |. q( n
  Win32_SoundDevice' P$ ]0 D+ `/ P: j+ `, [
  Win32_SystemEnclosure
3 p& i# x) [4 L2 `% e! Q   Win32_SystemMemoryResource
  {/ c- _1 l3 J9 ]) [) o   Win32_SystemSlot3 Y4 _! K- V. X. p9 n
  Win32_TapeDrive
( U* K- E4 n/ X& ^   Win32_TemperatureProbe1 J1 c) |1 r4 D2 j  g( d  q5 N
  Win32_UninterruptiblePowerSupply7 R4 S$ J+ @5 R1 a
  Win32_USBController$ z! F9 F! d3 F( B
  Win32_VideoConfiguration: {0 C- J( \  X
  Win32_VideoController9 [9 j. E; k6 ]; R  k6 A+ t' x6 N
  Win32_VoltageProbe( q1 O' {/ o0 u/ m
* R2 R5 z4 R9 [9 u. V
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-14 07:39 , Processed in 0.021782 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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