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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
" u) n6 H. w9 |4 g% G9 t0 \
: s% a8 z% G0 k" r
- z. p0 B- _& A$ J4 m--------------------------------------------------------------------------------
8 `& u+ P0 E, }3 u8 A2 g9 hWMI: Windows Management Instrumentation (Windows 管理工具)2 l+ O' L4 h3 m/ _5 _1 e+ t- ?
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 1 n- `5 o3 q( c8 s. J7 T7 v
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。/ c6 W" w8 L+ ]+ P
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ! \6 B. Z. x  b0 N
' B4 O9 b9 ^4 M4 h# u! {# t9 N
--------------------------------------------------------------------------------
( Q1 @& a; P, I8 NBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
7 |: _: s( B# I! I5 y; E) k( H1 U" G
--------------------------------------------------------------------------------
* S: |, T0 d  ]9 I+ n; {. X① 初始化 COM 接口:7 M9 Z0 `1 z. {8 D: A
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
% Y& h& H! w% s7 Q5 ~& Y. m   这两个函数在 #include <comdef.h> 里面定义。
: T: q9 t2 W" A5 x
& `% m, ^8 D/ j- r5 K1 T② 获取访问 WMI 权限:; t. K0 \9 S' ^
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
* C/ |2 U) g* V: e8 E   如果这个函数返回 S_OK 获取权限成功, 否则为失败。0 \/ W; j9 |' x( a: V8 C

: S* v3 t: S) l- G; g. @' n# G3 }③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
. I* V3 [* V. Y- z) J7 g$ _   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
) F- @% m  C+ m! _8 G; H/ s3 ~4 A9 r2 d  @
void GetWmiInfo(TStrings *lpList, WideString wsClass)
, {* `9 O4 D/ D{
: ]! J5 C! ?5 Z0 b% s# E, S: s' L  IWbemLocator *pWbemLocator = NULL;! ~6 C5 {" [, F2 L+ H, F* {. L% l
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)  ^, Z$ P/ N0 t5 Y  n6 w
  {9 k! O+ K- ]! ?! ^% a9 A
    IWbemServices *pWbemServices = NULL;
# ^) {9 Q* {& B3 J5 C     WideString wsNamespace = (L"root\\cimv2");
3 X( T& F# p* Y) J% F& h& D! z     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)6 _( h  J2 ?& q# N; a
     {8 k. u6 A( }% q/ z( j1 R3 c( l
       IEnumWbemClassObject *pEnumClassObject = NULL;0 [6 Z. M' G8 t* G( ~- k
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;8 _$ m* h- U: |0 M7 |& d
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
! C) |- _  j6 J& H! @         {
0 |2 @8 h* y% v- ~) a6 h/ D- w           IWbemClassObject *pClassObject = NULL;8 e9 d) s' b; i: F1 B
          ULONG uCount = 1, uReturned;/ u  f3 j- [# ]1 {. x( S
          if(pEnumClassObject->Reset() == S_OK)
5 u  u6 ]& o' s, p, g            {
$ c0 L# A+ b" x2 d) f8 E              int iEnumIdx = 0;
) G& @: D. X9 S9 ~) w              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)2 j4 h0 m! D9 ^3 w" r, R
              {8 {6 `, V8 U1 F* t2 C6 g, g
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
6 q# H" {6 [% D4 w5 U) t+ X, [' R, e+ d% l
                SAFEARRAY *pvNames = NULL;- u- g. E/ {) T
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)# Q7 O' ^! _( a( L2 f. [: u+ d$ O! u
                 {& R! A, S  D: b7 N4 ^  K
                   long vbl, vbu;
9 }- H7 K; m) g9 P( I4 ^; u' p* Y: O                    SafeArrayGetLBound(pvNames, 1, &vbl);
: X; `6 I! H+ S                    SafeArrayGetUBound(pvNames, 1, &vbu);. B6 v" D8 X0 m+ d: b
                   for(long idx=vbl; idx<=vbu; idx++): @8 F' W2 a6 q
                    {' x& K: P; D/ ?3 ?- E& S
                      long aidx = idx;+ Y1 U4 n- y2 P% j
                      wchar_t *wsName = 0;
' Z8 w2 K' A/ @; t9 s% Q- {' h                       VARIANT vValue;# [, R9 @- N- B+ g  ~5 i4 q
                      VariantInit(&vValue);$ Y, P* `3 t# P- ]* ~: S7 L6 q
                      SafeArrayGetElement(pvNames, &aidx, &wsName);3 @3 ?7 d- z7 }1 O: C

7 \' x( m& Q( K                       BSTR bs = SysAllocString(wsName);
. m4 d" H4 O5 E2 M; z2 {; Z$ R- t                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
$ ]% z( I" t2 t* b                       SysFreeString(bs);
9 ^9 C. l3 `4 k9 `7 J5 ?8 V0 Q0 H
                      if(hRes == S_OK)
* y9 u- i, i9 X; C- U% @                        {
+ T$ p8 G" L7 R5 a                          AnsiString s;
: e4 z: [- b; M$ Z- U                          Variant v = *(Variant*)&vValue;
: _. s3 @0 E* h7 |; }- l  W                          if(v.IsArray()): n# n: o2 U( x+ `1 f* P6 R# H
                          {! l. y# A$ }  Q$ \$ \3 Q- p: W* l5 S
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
4 r# Z: H) o( ?) m                              {
- H1 r5 D5 A9 }0 {; F+ P                                Variant a = v.GetElement(i);
  u2 I6 n8 o4 o4 c$ u                                if(!s.IsEmpty())
5 w. ~# P& }  H4 j  P0 N                                  s+=", ";
3 K2 L: @, Y% R. M0 b2 f5 O                                s+=VarToStr(a);
  g& w1 }" w4 r0 h+ d                              }3 A+ b* ?# F# U& |9 g3 U* ~
                          }" H/ K0 C* _2 p  q
                         else( Y$ X9 H* q+ u' j1 o6 }
                          {: H; ]5 c/ ]1 z1 D! H" g
                            s = VarToStr(v);
1 b# i+ |! Y. G# l                           }
3 T: j4 S& m* _" p) N                          lpList->Add(AnsiString(wsName)+"="+s);9 P8 S. a( G2 N% j6 R) L
                       }) U. r% Y. a* x
0 m! ]1 J  p6 Q8 B! \7 J/ h
                      VariantClear(&vValue);. \+ h2 X$ g/ B+ `+ Y
                      SysFreeString(wsName);# Z$ V8 |7 y; T: x2 Y( a
                    }7 i2 p9 S7 |3 s* A
                 }
8 I1 _& f3 Z- r% z2 K( s( j* D                 if(pvNames)SafeArrayDestroy(pvNames);
: G  S1 N9 n3 b1 ^$ ?  V+ w; i) p                 iEnumIdx++;. g* t' j8 q, c. ~5 C
              }9 K2 o$ q! y; q4 [  ?# |: x: G
           }+ D/ f- {/ G) X  `1 i
          if(pClassObject)pClassObject->Release();, V6 A+ A: g2 U7 {1 U$ s
        }
4 ~* d9 ^7 j& u! X8 R        if(pEnumClassObject)pEnumClassObject->Release();( Y, A' r$ Y8 U" h: v* z
     }% _/ x5 U7 d! x9 Y7 Z
    if(pWbemServices)pWbemServices->Release();/ Z8 z+ w8 }8 W/ l% C
  }
0 {1 J( H1 ~- D3 a) X  if(pWbemLocator)pWbemLocator->Release();- L% L  ^8 f1 s9 x4 W
}
. H+ ~3 V8 u+ f8 J) l! j//---------------------------------------------------------------------------
$ k0 \+ N$ b& t) f' H7 ?4 O
$ r, r' Z1 H( B; w// 通过 WIN32_bios 获取 BIOS 信息:. d# }: }7 E4 a0 A5 [
void __fastcall TForm1::Button1Click(TObject *Sender)1 b+ Y8 C% ?; V* m* g+ H& n- H
{
* }4 r' @9 P5 {( Y/ ]    Memo1->Lines->Add("================== [WIN32_bios] =================");! c. e' @2 ^! j& U; {- c8 ~9 w
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
( n# v% z, e: H- l& A, }    Memo1->Lines->Add("");) g/ f* P9 t8 J! d: B: p* B2 f
}
4 C4 W. G1 l  Y8 H' B  ^
  T$ W9 V8 C5 A6 I0 A" h* s! ]--------------------------------------------------------------------------------
" V$ _7 h" L7 }- W
! i6 A! B: x7 [7 q1 @/ {/ c" GWMI 可以访问的信息类型有:
- u$ i* y+ u" J2 M   Win32_1394Controller9 L0 M- _# L! V  }
  Win32_BaseBoard0 M) s5 z1 H3 H' A! U4 S6 h
  Win32_Battery
/ K% N8 p8 {3 e& z$ i! M, N   Win32_BIOS6 {# v% c( p9 E+ ~4 Q6 N" N
  Win32_Bus+ l0 I% u9 A7 l0 T8 N/ X  I3 N, A
  Win32_CacheMemory
( |6 f8 u. M( a) k/ {   Win32_CDROMDrive
' k; D( |& k. {   Win32_CurrentProbe( V3 |7 e* u$ |8 m  s
  Win32_DesktopMonitor
, b8 X% Y  x4 Z! O" o. f   Win32_DeviceMemoryAddress5 a4 ^* }0 T8 u1 b2 R* B
  Win32_DiskDrive! R7 d) o6 [; C  g" W( B2 A' W
  Win32_DisplayConfiguration1 j1 Q) ]) z6 O# ?; U) ?0 s6 n
  Win32_DisplayControllerConfiguration* ~2 S( q3 I/ W5 u
  Win32_DMAChannel! i$ y0 v3 Z9 I& X$ e$ q# A
  Win32_Fan
0 R8 J& G) o9 l3 |3 x3 w# N5 i   Win32_FloppyController
2 `/ F3 t3 e  M# C# k" ]! B   Win32_FloppyDrive
8 ?  z3 M) m/ J! }- G. i5 f- w5 K   Win32_HeatPipe) Y5 P9 {) y2 i+ R# D
  Win32_IDEController, t/ t4 L) x/ j- R9 Z
  Win32_InfraredDevice
* Y7 t8 o- r+ I* u1 o. e   Win32_IRQResource# M$ W* f* V9 h% w& ^; Z& B
  Win32_Keyboard! u! {( g( z& t  f7 t
  Win32_MemoryArray
4 r& b% P8 r% h9 ]) Y  j( @# q( B3 m   Win32_MemoryDevice2 K8 h; F6 Z6 r2 H7 P, V
  Win32_MotherboardDevice
7 @3 ~* G* |" V   Win32_NetworkAdapter4 t  Z* P4 F; ]0 H3 ?5 Y
  Win32_NetworkAdapterConfiguration( w1 j& H& Y2 n
  Win32_OnBoardDevice7 B# E. l) v: z& u8 i8 w+ a- \
  Win32_ParallelPort
0 }) H& R  P( t# Q" d+ ~4 H! t   Win32_PCMCIAController
/ K$ E- i3 C4 e  K0 Q: m/ U8 n   Win32_PhysicalMemory  o/ l& ]0 X% |! f" m
  Win32_PhysicalMemoryArray
' V6 j  r- v' k  e4 x" u0 L   Win32_PnPEntity: o3 g: `1 _* W9 E
  Win32_PointingDevice! I9 t# ^7 u  K0 |" H' Q
  Win32_PortableBattery
- Q" X* j0 G; i   Win32_PortConnector# m' s, t/ s0 z$ b
  Win32_PortResource0 A# Y# S% u# h6 P
  Win32_POTSModem
( B/ B' y2 M: x, B   Win32_PowerManagementEvent
, G! r# m& w" C- a   Win32_Printer
# r, u5 t1 z( P2 k$ P   Win32_PrinterConfiguration
2 W7 c; f) S9 y1 g  J! u   Win32_PrintJob
; I/ v9 f. W# b+ q$ ?" @- v& I   Win32_Processor
* H+ S) J/ D0 U# u   Win32_Refrigeration9 q% k% i) \: T
  Win32_SerialPort7 ]) G+ M- X5 M; E
  Win32_SerialPortConfiguration
( V" w6 C# r" Q! e; V/ j' {- ~. Z( k   Win32_SMBIOSMemory' A' T9 u% _! u
  Win32_SoundDevice- _# d' n, J8 W* v# {- w! P7 `5 D
  Win32_SystemEnclosure
- C: N1 O6 b& e: _/ M1 w1 q8 i. m- g   Win32_SystemMemoryResource
7 L" e7 ]2 K8 t6 s+ }3 ~' I   Win32_SystemSlot
0 M# [9 {% P, I5 e& W   Win32_TapeDrive
9 o/ o9 M' p# o   Win32_TemperatureProbe
6 Q7 m3 a5 u7 n( C5 k; A5 f9 t; m, Y   Win32_UninterruptiblePowerSupply  R# P2 d& P8 C, }3 Q& e
  Win32_USBController
4 d* L' S$ i" M% a   Win32_VideoConfiguration
5 G1 V% l0 C+ `' I# p. }3 M   Win32_VideoController
0 _8 a4 I2 ~; W5 L   Win32_VoltageProbe. P" e; L* ]" U2 J' \
8 B6 ]3 d8 m8 b' U8 [( I9 }$ ]
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-6 04:12 , Processed in 0.018521 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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