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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
9 G) ^6 D& z. G( n, a1 b& b7 O3 M& N

* Y- A0 l# l  e# v# j--------------------------------------------------------------------------------
% `( ^6 R6 v0 Q5 n1 r$ ~WMI: Windows Management Instrumentation (Windows 管理工具)7 i$ F; a3 M4 k, q
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
& t  `  W9 A* P/ E- D; M, U- `   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
, d5 S( `( w7 d6 V! m  ^, F   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
1 [& @! W8 B7 z5 R$ \# Z, _% Z1 H9 V$ F: v
--------------------------------------------------------------------------------
3 K7 q- {: ?9 ]6 d1 l. U$ tBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面' B9 {8 U! R7 i$ W7 r# l, q

5 z1 `+ S; |' y0 R8 F--------------------------------------------------------------------------------
# ^8 [8 m# X# e2 o① 初始化 COM 接口:
" S; E' a1 e" j, u9 Y" e+ |8 o1 ~   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。! D% Q7 y; @/ |
  这两个函数在 #include <comdef.h> 里面定义。6 Z+ Y6 U2 O% O& c+ c* f7 G6 b

- t3 [2 W% b' K4 Z' H, A# L& r② 获取访问 WMI 权限:- m, E7 y$ W4 r, Z, |
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
8 a3 ~( n) L9 z# l0 l   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
1 m. @- g0 \+ ^& N/ i. x: I( V2 b% u8 z
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
3 }: a2 K* p: v$ R( }5 }% K+ {1 Z   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。2 X# e" L& y' o  W
! {$ X- V7 S) B& I# B0 v. K3 \5 H3 _
void GetWmiInfo(TStrings *lpList, WideString wsClass)
0 R) D3 h' f1 v2 D. X: ?{. S9 m9 n! ?) ]/ B. p
  IWbemLocator *pWbemLocator = NULL;$ w6 b4 p; c  D
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
2 ~- j% H! R% w' n# y8 S& _5 L4 T   {
& j; P9 x) X# K' V8 P     IWbemServices *pWbemServices = NULL;/ c5 h% _) B( T/ x2 k  S: h0 e
    WideString wsNamespace = (L"root\\cimv2");
0 i% l2 |% B& {( C' W     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
8 B8 y3 G7 d% \  b8 I  Z( L      {9 `/ ~9 m; \0 A& L/ Z# ?& n
       IEnumWbemClassObject *pEnumClassObject = NULL;5 ^+ z1 a5 Q. m- T$ I' d* h' `' z; h
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;7 K" Y# o/ V' X1 i6 ?, ?0 H& A" G
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)) b' v1 _* W9 d4 ~0 y
        {
3 U4 ]- r; y; Z1 F& V4 o           IWbemClassObject *pClassObject = NULL;
& q- R9 ^+ J. V           ULONG uCount = 1, uReturned;
: Q- d, Q- I4 d, `: d9 N. D           if(pEnumClassObject->Reset() == S_OK)9 P2 \% J" k5 l. `0 ~' v
           {
  |% E$ i1 I( \9 u) K1 s. @              int iEnumIdx = 0;' \5 e+ F3 u) h2 T9 f; X+ z5 k, w1 q
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)( a! B* {  S7 f* J4 ~) \
              {
8 X+ ^  [! N$ k) r% R/ a                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");' A2 D8 H# [2 ?! k0 {+ h! ~

( B" v0 l" ~4 y- G5 D                 SAFEARRAY *pvNames = NULL;
) k- r3 l; c( r# P6 e/ {: w; Q3 ]                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)0 P5 `8 k+ S8 \. q2 s
                 {
5 q' j+ z# K& V( Q& J                    long vbl, vbu;
$ j- Q$ f. v/ ~5 ^8 @3 F1 o                    SafeArrayGetLBound(pvNames, 1, &vbl);# s' h& M0 Y: B( m
                   SafeArrayGetUBound(pvNames, 1, &vbu);
, ~) u) h2 u/ s. g5 \1 w7 `. y5 E                    for(long idx=vbl; idx<=vbu; idx++)
! K5 {: p; k9 [* @                     {( c) z* A7 [7 @
                      long aidx = idx;+ y6 u* [# P; u% i8 N4 z2 D/ @) l8 C
                      wchar_t *wsName = 0;
  _" A0 `2 g+ P5 k3 n                       VARIANT vValue;( D% A( Q, p, y0 d: A  g$ q( F
                      VariantInit(&vValue);
4 X" v9 N6 E  n" H                       SafeArrayGetElement(pvNames, &aidx, &wsName);
2 y" W6 |0 u# N" u* u( v; ?7 @$ Z4 K8 [; p$ H1 B
                      BSTR bs = SysAllocString(wsName);
& T9 {7 \8 L" Q  a- `. C                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
8 H5 t  p( J/ ], {                       SysFreeString(bs);' L) J2 {) c( C, _! n4 H0 J

8 u3 ~; T( p2 K9 F) m6 X                       if(hRes == S_OK)' U9 C; X* o. Y2 [( q, E& d
                       {/ t4 A. i9 q$ c9 v( @
                         AnsiString s;
  H% t. v0 d' d1 f% j  @                          Variant v = *(Variant*)&vValue;
$ R5 q4 r4 Q4 k3 B- [, b' H# m                          if(v.IsArray())
3 n8 n* g! d: i$ @4 m                           {
3 A6 a7 g. b. C+ W' `0 [" z                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
8 F1 i6 r9 {2 S; p                              {
! U5 {1 ]+ Y1 z                                Variant a = v.GetElement(i);
1 S+ a( p6 f* D: A  u  O' i                                if(!s.IsEmpty())+ }2 Y* S$ O2 h+ W& X
                                 s+=", ";: S$ t/ n7 @7 v
                               s+=VarToStr(a);1 E8 P3 l+ `$ J8 H
                             }
7 u. a* @0 v* g                           }
+ S; y2 T9 H% |% S6 G. b                          else
, S' Y5 P( A1 ^+ W4 A/ Q                           {
' m& H, q# D5 l  L% S5 o                             s = VarToStr(v);6 Y+ R3 \! }6 _' s
                          }
* P) f0 ~  x% s; ~                          lpList->Add(AnsiString(wsName)+"="+s);
( h% G0 n2 u& L9 A/ U. J* m                        }
* m' g# T% |1 R( w+ p$ d$ }9 u! C/ P8 Y- V
                      VariantClear(&vValue);8 W& [7 _9 x7 S8 k
                      SysFreeString(wsName);8 i4 Y1 ~: i! [  N( A* b
                    }( R" a( v+ e7 o" Q5 d1 W1 T7 c
                 }
2 j  ~( I7 \1 _" {# y3 C0 i) K                 if(pvNames)SafeArrayDestroy(pvNames);. P  k5 _4 e3 c' N
                iEnumIdx++;
" e) L) [( _! n; ]               }! |3 h( c% L. q& w" L
           }
' {+ ]) Z% i! N: \4 Z' g, H! v           if(pClassObject)pClassObject->Release();
5 x7 v9 c6 z2 ^2 M3 N$ m+ L% \         }) b- p5 _$ e! @% ]) s9 x- k$ {
       if(pEnumClassObject)pEnumClassObject->Release();1 x4 N+ Q% v1 w" ~& ?2 r& {
     }% n3 B6 ^, p* l
    if(pWbemServices)pWbemServices->Release();
8 X- i$ C/ N6 {( \" g   }
# y5 _' c) Z7 X" \% [4 H- p5 e  if(pWbemLocator)pWbemLocator->Release();
7 j& O% g# {, R+ \  F}
" @9 [2 ^- K+ _: C2 P4 h$ C2 F//---------------------------------------------------------------------------
" Q: d+ n' P6 b7 {/ _% S9 {8 z1 T' E" Y
// 通过 WIN32_bios 获取 BIOS 信息:* M8 C' d6 P! y, {1 S
void __fastcall TForm1::Button1Click(TObject *Sender)
5 |# d1 [2 v9 S6 ~( g8 s+ x{
8 I. Z* B2 f( E8 F0 e. s) x$ s    Memo1->Lines->Add("================== [WIN32_bios] =================");7 {2 n4 Z  N1 O; k0 l1 X9 j6 b
   GetWmiInfo(Memo1->Lines, "WIN32_bios");% J  d& f9 Q6 I% ?. ]
   Memo1->Lines->Add("");
2 g( `6 ]( m0 P}$ f" b% G7 @. F
& y% G+ s. Y* n. p3 t
--------------------------------------------------------------------------------
' `- C1 j( }8 B/ F: P$ w2 C- q; i6 q5 p  ?8 ~
WMI 可以访问的信息类型有:2 E" X4 |2 i$ F7 o6 L6 X! _
  Win32_1394Controller" d: U# p' [+ i# A8 l) S1 U  O
  Win32_BaseBoard
, a/ p, t  ?6 t% o7 g6 T0 I: p   Win32_Battery0 m0 _. [7 _2 M- F) _
  Win32_BIOS3 D( M, q3 `+ ^: Y/ l2 ~( o
  Win32_Bus
$ k. V( R* v' Q5 h+ v   Win32_CacheMemory
( n5 T5 H/ d  H4 G& Q" t   Win32_CDROMDrive
0 ?) r+ E/ E2 Q   Win32_CurrentProbe
6 a/ U" k7 ]' ?  t# C   Win32_DesktopMonitor, |8 Y- w7 }8 R9 [; T
  Win32_DeviceMemoryAddress
8 t" \: [6 l1 c- t, i( X   Win32_DiskDrive. s4 m( k+ ~, m5 k( c3 Y5 g) P  {
  Win32_DisplayConfiguration0 w* F7 }, D+ P
  Win32_DisplayControllerConfiguration
4 [2 f9 _/ H$ h: }% i% D7 l   Win32_DMAChannel
" c" \- w4 c7 e3 y9 p0 r   Win32_Fan
# H9 \, j3 G0 c2 r7 L5 Z( d4 {: l   Win32_FloppyController
0 S3 D; [) i8 E6 z( p   Win32_FloppyDrive, B0 B7 Q; M' [
  Win32_HeatPipe
6 I* V3 ^0 g3 M4 u" u   Win32_IDEController1 q& ^% ?5 [4 k
  Win32_InfraredDevice
% J" L1 @# C& z$ S: F  I2 |7 T: O! o. @   Win32_IRQResource4 b6 T. D+ ?" L) G8 e* K
  Win32_Keyboard4 A, f* y0 B  s) ?! v$ |$ T
  Win32_MemoryArray  o+ v- t$ z  f, H' m
  Win32_MemoryDevice9 H8 k2 b! L1 C$ Q, A) N
  Win32_MotherboardDevice" D* h0 @$ s) R- G  y) z& E
  Win32_NetworkAdapter' }" R- g* T9 E! C. i3 V
  Win32_NetworkAdapterConfiguration% M7 ~( f' o: j9 I) L- D+ M
  Win32_OnBoardDevice
& a9 v* X; P% V& M/ w# z   Win32_ParallelPort3 n3 h; h: B9 M" L/ S
  Win32_PCMCIAController
& ~( `5 Y8 _, N7 g   Win32_PhysicalMemory
3 Q6 K# W- o2 x) X! i$ T; u* ?# h% ]   Win32_PhysicalMemoryArray- B' l4 }6 _' g: ]/ N. E: B
  Win32_PnPEntity
! q( I9 I% A5 P# k# W# S1 F+ ~   Win32_PointingDevice
# j( j( B6 i/ @2 u   Win32_PortableBattery
$ S% e% b4 ?5 c! h8 U   Win32_PortConnector
; m8 U- V: K8 X2 L9 Q' H   Win32_PortResource% T0 u  k, a$ ?2 `; c  I
  Win32_POTSModem+ Y, J% W' B  p. @$ Q* z
  Win32_PowerManagementEvent
% B( J5 _. b, c* F& g+ O5 N   Win32_Printer
, `& k4 ?7 {' T5 N   Win32_PrinterConfiguration9 Z/ o9 @+ M7 b! Q' q4 k
  Win32_PrintJob
: F  n7 ~: l6 b* ]" h* r$ y" i- N   Win32_Processor
0 d5 Y+ {& u8 c' ~' J/ p! w2 r   Win32_Refrigeration
& u! u: |' d6 b% G   Win32_SerialPort
. j& o* X2 g3 J/ g& F' ?   Win32_SerialPortConfiguration
/ J7 O( I& i6 ?* {- v- k; E1 x   Win32_SMBIOSMemory
4 H$ Q+ M# K. i( d1 H. l! E$ n   Win32_SoundDevice7 `. j+ K6 \/ V0 v" |
  Win32_SystemEnclosure
( X6 s) j/ i0 ~7 j* Y! t( K! h   Win32_SystemMemoryResource
( @8 y7 S7 ^( }/ p( m- @3 ^9 J   Win32_SystemSlot/ f4 e8 c/ ~2 R& }
  Win32_TapeDrive: W8 c) A- r$ b$ Y8 Q
  Win32_TemperatureProbe) G0 e. B" e* H. m
  Win32_UninterruptiblePowerSupply. K( B0 ?6 v6 ]; _7 P( S* G
  Win32_USBController
- b/ m0 k% {6 P& N# G7 h   Win32_VideoConfiguration8 ]) H/ Y7 P7 [; i
  Win32_VideoController' J: T& c, O9 H
  Win32_VoltageProbe7 |- M/ s# `1 X7 @+ A
  c7 M  A" q) E: \
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-24 14:28 , Processed in 0.018473 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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