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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)! ~! c- }7 D9 S, }

, U0 y; E7 a) n8 C  U0 F: O, d
--------------------------------------------------------------------------------+ s  t* `$ l9 u2 b
WMI: Windows Management Instrumentation (Windows 管理工具)
& U  `+ u/ j+ }6 @% ]& y: i   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 9 N$ p& N& O. Q: R; E# o
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。# q8 F8 L! ^  x! t
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 1 u9 {7 `0 l0 `( e, V- E$ v. h6 R# v* z

7 n! j! ]5 X$ x+ T: E; o--------------------------------------------------------------------------------
' U! s- j: r# H) iBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面$ Y* |9 y9 e$ L/ |7 G

" e: ], \1 ]- t9 @8 D+ q--------------------------------------------------------------------------------
( i% K3 ^, o- h1 U6 H① 初始化 COM 接口:% p3 _5 o. f3 Z: F
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。8 d) s+ V! h# k& O+ u
  这两个函数在 #include <comdef.h> 里面定义。! Z6 P1 G' Z0 {9 f

6 M3 [1 x( U4 K& C! v0 t- w1 Z② 获取访问 WMI 权限:
; d% [* y* i# D   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
3 |1 Y$ E$ t! x4 R   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
, ?, Z0 q0 l+ S: {4 K. c' w( H3 N  O7 D/ t/ P! F5 |4 y
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
& h8 l$ x6 ]0 Z" V" U; n# b. z* K" Z   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
$ q7 X" b) M8 L; q- q4 D5 \0 c" }1 Y2 O+ [! _4 q# T
void GetWmiInfo(TStrings *lpList, WideString wsClass)
$ Z  }  ^+ \$ {% |{
8 z, ]1 I& b! w- h  IWbemLocator *pWbemLocator = NULL;
" D7 {7 e. P- d1 U5 g  P  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)+ U. i; Z8 E* d) s2 q
  {
' H5 W' i+ F- R- a3 _% ~& T6 \     IWbemServices *pWbemServices = NULL;2 G$ t  K' k, L" @7 K! b  V
    WideString wsNamespace = (L"root\\cimv2");. ^+ e% p6 E1 F! }) I
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
: B. e: U# F1 E$ X. k  G1 o      {: e4 P& Z. b$ u  b0 e
       IEnumWbemClassObject *pEnumClassObject = NULL;# Y% t. x2 }9 f# e9 Q9 m& r
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
4 j. ?3 I3 Z+ }6 d+ w& k. i        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
" D2 }$ ]( W3 M$ @  T/ V; |         {. Y# q5 ]7 G0 I( j
          IWbemClassObject *pClassObject = NULL;# q% F0 \- d) y' k6 H
          ULONG uCount = 1, uReturned;, F  B+ K1 f# C; J
          if(pEnumClassObject->Reset() == S_OK)
: Z+ f9 g9 F* p3 n5 \( `# U8 a# Z# ~            {2 X6 a# N) B9 w! a  F5 d
             int iEnumIdx = 0;% J/ G; v0 V8 v+ e# l  w
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
2 S6 D0 v5 W4 R" u               {
/ G( r- \  u  c2 {' S                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");# U/ ]$ ~/ u! n' C$ C
0 @% J+ F9 a  u0 b  s6 s
                SAFEARRAY *pvNames = NULL;9 f6 i# F( e8 k2 o0 T9 ~- p
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
" D% z3 B# k1 L3 P" ?. r3 Z7 X                  {
' d; N0 j$ f  @% ~                    long vbl, vbu;
: K% m6 A# v% z+ ?2 A( B                    SafeArrayGetLBound(pvNames, 1, &vbl);. A+ ^& t! F& }+ N0 q
                   SafeArrayGetUBound(pvNames, 1, &vbu);/ ^2 c8 J2 @5 X! n0 u$ ~
                   for(long idx=vbl; idx<=vbu; idx++)4 w- R' E8 u, R1 f) A/ S
                    {
' o3 q1 X! l6 l, R1 J7 n2 ~                       long aidx = idx;+ m8 p0 D( a, Q: S! k9 F
                      wchar_t *wsName = 0;1 m) h9 b. C, r  `' ]; _
                      VARIANT vValue;# K% U, t" M9 d. Q
                      VariantInit(&vValue);& Q; @0 Y) p3 v* C
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
$ V) `- v9 }0 T$ z( f7 U4 m) y4 f1 q, [# q
                      BSTR bs = SysAllocString(wsName);6 U. M2 G. E9 b& T9 _4 y) @' W8 o
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);( L* I+ U, n- }; \5 i- r
                      SysFreeString(bs);. O, @. D( s1 M# {$ z

. Q/ o$ ~- K9 e2 @                       if(hRes == S_OK)
+ V% v2 L& C8 y9 C0 h6 x                        {
2 p+ X1 o& l/ G. n" H6 E                          AnsiString s;7 a& q3 b2 {9 v8 J9 ^
                         Variant v = *(Variant*)&vValue;- R3 z+ Q* f7 Z' d
                         if(v.IsArray())7 m: L, ?) Q7 ~/ a8 I. R) C
                          {0 r* D5 a! b3 X; q
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
3 _4 g# r. {3 d* p  O) A                              {
2 r& c4 y3 J  o# u                                Variant a = v.GetElement(i);
9 \- {# d  e( f" l8 v) x                                if(!s.IsEmpty())( g- ^: ]' T$ j" j6 J
                                 s+=", ";' u0 N% Z7 p8 Y; `' f
                               s+=VarToStr(a);
2 }- C  s% w2 k3 `. p( |4 j                              }7 _; t* }4 }7 e% C3 J
                          }, r, t; R6 a7 x$ t
                         else
: T0 z" B! ^: t9 E                           {$ O6 a4 B# Z$ o$ I  p6 S3 e$ ?# P5 d8 ]8 A
                            s = VarToStr(v);* u9 L+ C; f& ?! H& u  t! U8 l9 {
                          }
  z# h3 ^& S+ J" ^% m0 J6 v8 K9 a                          lpList->Add(AnsiString(wsName)+"="+s);4 T, I# P! w6 |
                       }: |6 s% M  `8 D4 N2 X2 o
, u" _. e5 ]* `6 y
                      VariantClear(&vValue);
- E" X" `3 T; q5 K, N* x$ u                       SysFreeString(wsName);
- D4 m) l4 y  z& m* J) g. Y                     }2 j: U9 y3 i/ s
                 }1 d- P$ J; F, p8 T/ ~$ @/ S; ~
                if(pvNames)SafeArrayDestroy(pvNames);
6 X. r9 X7 ?1 `0 |9 ^0 H' [                 iEnumIdx++;) x" u: ?, _+ J6 Q) C, F  H5 h
              }
% R+ O/ b" F$ G3 u$ _            }6 L/ Z0 N! |# C$ G
          if(pClassObject)pClassObject->Release();; Y0 n" m6 u3 x( o* ?" O
        }( W6 j7 s' D; q: @! o. ]" H
       if(pEnumClassObject)pEnumClassObject->Release();: P, G0 B  H# S1 C; u* T
     }
8 J. m( U) t4 ~/ m     if(pWbemServices)pWbemServices->Release();
3 n) J! H* |( W0 n  U) V   }% ?5 Z* Q& z4 {7 b; P
  if(pWbemLocator)pWbemLocator->Release();
" R$ j" A* V3 f, Z! X3 V}9 M4 t2 J2 @" t
//---------------------------------------------------------------------------0 h# e+ u* w4 ^3 \
' q9 G8 k4 M4 r/ k5 {3 E
// 通过 WIN32_bios 获取 BIOS 信息:; r7 e% g$ ^9 L  ^2 c! W6 z4 Y# v
void __fastcall TForm1::Button1Click(TObject *Sender)8 |) L7 m7 K2 R$ j# Z! D) F5 D* t
{# S; n6 w6 Y+ o% q7 B9 _& e0 [. ?
   Memo1->Lines->Add("================== [WIN32_bios] =================");# N) H" G. V5 O! N0 F0 k5 L% w
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
% g8 k* C. {' G# S    Memo1->Lines->Add("");
2 v4 K& w8 P( Y5 P) Y}
; ]1 k1 A  G' {( Q$ r3 L6 D/ @) e) U% W! V' z
--------------------------------------------------------------------------------9 v  }( d  q4 Z; u" q

' t. G4 P2 V5 I% ?% W2 S& G% xWMI 可以访问的信息类型有:6 k0 C6 w7 X  f
  Win32_1394Controller0 W  Z% m) s9 t, X) ?2 v
  Win32_BaseBoard
) ]  A) z$ P, h7 [9 H2 }4 J, [   Win32_Battery
4 }- p+ V3 G% p6 ?$ |: h& G2 m( h   Win32_BIOS/ h0 |7 q. E: G  h1 ?! x
  Win32_Bus
. M  z5 h) h+ A$ ?& y   Win32_CacheMemory
3 ]0 H. X  H! ~( a4 M   Win32_CDROMDrive
, T8 Z- F! q$ K. A2 j   Win32_CurrentProbe
  ]' w2 t+ |: [   Win32_DesktopMonitor; q9 p- V7 S/ ^. E( v
  Win32_DeviceMemoryAddress, {  u2 n8 ~  g: t+ Y
  Win32_DiskDrive) A3 Q: \( W$ x# S) h' ^
  Win32_DisplayConfiguration9 Q6 J' g, U3 Q2 b' d, u9 {
  Win32_DisplayControllerConfiguration
" e+ P$ X5 l7 N   Win32_DMAChannel, i8 C+ V0 Z$ Z2 ^
  Win32_Fan
4 K8 a: [7 G% I8 e( b   Win32_FloppyController, f$ J8 N1 }0 R8 I: M
  Win32_FloppyDrive
( r0 [. H  Q$ u   Win32_HeatPipe0 M% ]0 [" E* d' S" ^" f% f
  Win32_IDEController
6 h* c" i/ u5 E# ^* e   Win32_InfraredDevice4 H; `+ m1 A. z
  Win32_IRQResource
- R2 U$ V1 N0 \  J   Win32_Keyboard3 C7 F. J/ r2 o& t
  Win32_MemoryArray
: h: a/ K0 ~! i, U; u   Win32_MemoryDevice
4 j0 l9 E/ |4 Y& s8 H, ?   Win32_MotherboardDevice
+ K8 z! C1 X- v) h   Win32_NetworkAdapter
- g5 u1 j( X$ y# D   Win32_NetworkAdapterConfiguration  ]2 I/ I% G) \5 d/ B$ B% R
  Win32_OnBoardDevice$ y5 j( Z, S. `* j0 L+ Q
  Win32_ParallelPort
! X/ i: e* @6 b# ?+ T   Win32_PCMCIAController
( G8 d. D! H: C) r" f* [/ m9 m   Win32_PhysicalMemory0 |8 T8 j7 n5 T9 I* i
  Win32_PhysicalMemoryArray8 X, A; G- @  F2 Z$ H
  Win32_PnPEntity
; B0 Q5 `# H/ x/ _. r( r( F   Win32_PointingDevice7 K, R% [; `' e7 [+ N
  Win32_PortableBattery
6 Z' [4 k% W1 p   Win32_PortConnector
+ b* s/ C4 K: g) x   Win32_PortResource' W" y3 s0 g/ a4 e# S% j
  Win32_POTSModem
3 i5 g  _! p1 d   Win32_PowerManagementEvent
4 h% w/ J+ ~8 ^   Win32_Printer
5 ~* S  C7 y0 t) i  b4 P   Win32_PrinterConfiguration$ A" T7 q# U' D2 i  U% Z; v5 e7 E
  Win32_PrintJob
/ Y: ]% H& M8 E; P$ {   Win32_Processor
- Y' ~' C7 S1 Y/ Y: [  r; N( K  r$ a1 Q   Win32_Refrigeration
' H0 @% z9 x/ k$ l7 ^8 m   Win32_SerialPort! ^# Z9 q6 \+ W/ H6 Y; p
  Win32_SerialPortConfiguration: U3 i, ?7 b! ~+ u9 V$ ]* }
  Win32_SMBIOSMemory5 v6 q1 i" H8 W. H( g; K
  Win32_SoundDevice
- x; [7 t6 X9 D- Q6 z0 l) u* n, p; v   Win32_SystemEnclosure4 A( E! G+ T" a& \" n) S" a. M( w
  Win32_SystemMemoryResource1 o/ J0 P) S( i7 j1 `2 s
  Win32_SystemSlot
' r; C* S* A5 ~* Q! P/ w0 d+ q   Win32_TapeDrive6 S! _1 W8 ^7 L4 I$ b6 _, L: S
  Win32_TemperatureProbe
5 T" l9 Q9 a/ i6 w) G/ B   Win32_UninterruptiblePowerSupply
+ l1 f3 {& U6 R" B% e   Win32_USBController
! A7 `  z, m, n0 V% `/ Z   Win32_VideoConfiguration5 J! S# T8 g5 U/ {( ?+ \
  Win32_VideoController
& X8 S$ R! L4 r+ h' Y6 H   Win32_VoltageProbe
' I7 @6 j. }. a3 b; o7 t
3 t& O  @7 j- }/ O0 F, v8 I8 j以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-5 20:01 , Processed in 0.020713 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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