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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)1 h, a2 M7 T  F; p  }

9 K& w$ F: Z$ D- Y# r1 l7 [0 W1 p7 A% r7 S" ~! S' k  o& B. l
--------------------------------------------------------------------------------( X( x* K$ V# ?4 i% p
WMI: Windows Management Instrumentation (Windows 管理工具)5 i2 X: M% P( Y% i/ O
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
$ r" c* `% L3 V; m   利用这个工具可以管理本地或客户端系统中几乎所有的信息。; p; u$ z! \6 P5 R. a' c$ [
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 - g) |( R5 o1 U$ l# }% @+ k

7 y. w" z7 b( {* w--------------------------------------------------------------------------------
" `2 m: {' S9 S, [BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
3 e$ [; }8 w" q8 B/ ]( K% P: A  e" T% t  t& P, H0 Z
--------------------------------------------------------------------------------
" h" s! Y( F1 a" k. p: K" V# e7 \① 初始化 COM 接口:
3 V; m# ^1 U: i   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
5 b- d, Q4 g/ o2 c  f$ t8 A   这两个函数在 #include <comdef.h> 里面定义。
, e) m# A2 \6 \4 P/ z2 ]' |; y$ M7 _2 T+ e- ~8 ^% c
② 获取访问 WMI 权限:
( B4 Q( K& S4 A   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);4 y, U* ~0 w1 T- [+ t
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。; ?7 {1 F  O& l; R  ^% u( L

8 o  {  y0 S% ]& S6 G2 R8 U2 M③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:$ |% R2 }& @0 F1 [: @8 _
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。5 F& P+ k+ |7 n6 b# l2 X7 U$ E: ?
  W( x  @$ P' S4 d. o, \+ R8 `3 R
void GetWmiInfo(TStrings *lpList, WideString wsClass), b* f  o$ @9 Y
{4 ~+ H" X3 Y0 X& r4 [/ R+ T& x
  IWbemLocator *pWbemLocator = NULL;4 D. B- U6 a# g. X, y
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
$ t0 L( f. j: B5 J   {
& i+ q6 q2 |8 j3 }     IWbemServices *pWbemServices = NULL;
2 J) H& z7 B1 Q4 f3 n) B! P% M0 W     WideString wsNamespace = (L"root\\cimv2");
4 W% w+ h% i5 c( O     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
) J: S" Z( W: |0 G      {/ q  \8 J) h) z; N; T* ^) Q
       IEnumWbemClassObject *pEnumClassObject = NULL;* I9 m3 o# [8 B; B* D! G$ \
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
- q: K$ z3 C3 ?        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)4 O, r; P/ E1 q1 r5 R. \$ F
        {
% W6 G6 s; i3 `* U2 j           IWbemClassObject *pClassObject = NULL;
) D. Z9 a6 f2 m0 T  R! a' `4 {           ULONG uCount = 1, uReturned;1 T# n: H/ H' u. U/ [9 X" M
          if(pEnumClassObject->Reset() == S_OK): ?% d) Z1 ]& }! R0 K
           {
' o& T/ _! o5 E+ b              int iEnumIdx = 0;
) D# a5 B4 {% Q0 a* R. }+ b7 }0 Q              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)8 w! {+ K: t/ w# N' F
              {% N. o: n1 @/ j* ]6 F
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");, o* ]+ Z. U; F, N( Q/ W9 K) X
* }, B+ N  U( `8 q
                SAFEARRAY *pvNames = NULL;5 M' a  q: b/ R% c$ P" [- ~
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
, }; r: f$ V' b! o0 D' G' ~                  {2 ?# F. d; ]$ _/ a2 n' ]
                   long vbl, vbu;
, X+ d! n0 j! h. X+ z                    SafeArrayGetLBound(pvNames, 1, &vbl);
  r; m9 u+ R3 R+ \0 Q1 L                    SafeArrayGetUBound(pvNames, 1, &vbu);
4 B& H/ S/ G9 s4 F) r  x9 L                    for(long idx=vbl; idx<=vbu; idx++)  \" A8 a( R2 O: S; @- c7 [2 |* M
                    {. z* O- j+ y3 `" M" }2 z
                      long aidx = idx;
5 }' A& u3 P# c                       wchar_t *wsName = 0;
/ I' V  c. o7 r1 J& S% z# Y                       VARIANT vValue;
2 Z- D2 b2 L' U. M1 [( g) W/ V6 d% Q                       VariantInit(&vValue);& e$ w8 h3 u( p. ?
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
& }# v, E) t6 h* R/ ]3 A/ e
) e% w9 a8 L4 z6 j1 A                       BSTR bs = SysAllocString(wsName);* I* O( V! }8 o' q  Q" G: V
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
8 ]1 S, m$ V* p" ?$ v( I                       SysFreeString(bs);
& \8 a' H: y2 {+ u% y' _: U* F# r
. W, Z% \" F( {- O, t8 Y                       if(hRes == S_OK)
2 q5 U2 P8 l0 M% z                        {
/ V! v) A) c3 B# ~- O; G                          AnsiString s;% K% A. O3 h- ~( h& [7 H7 J- K4 `
                         Variant v = *(Variant*)&vValue;: e+ ~' M8 \# A- f* t
                         if(v.IsArray())
' m4 \3 w+ l' X- G                           {, _9 l6 j* y3 J, A" j
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++); v$ I( S8 m9 ~) D+ X& }
                             {
5 \5 a. X# s) M" D$ o$ {                                Variant a = v.GetElement(i);' h$ v' [$ f6 x5 Y) \
                               if(!s.IsEmpty())2 b, l+ U* V& g" E4 l' Y6 Q5 f- c
                                 s+=", ";
2 R' ~6 r6 z9 E( }                                s+=VarToStr(a);! G4 y  H+ y  g+ x! L* P! I2 A
                             }
* d. Y1 q5 U# C# s; Z5 T5 Y                           }
" e5 P" s* H7 R0 g                          else$ f) M* p; e0 D3 }0 s$ u
                          {1 B% x0 j2 f6 Y$ r& y
                            s = VarToStr(v);
. n& {0 a" _: u7 }4 g7 M6 t, m  {) s                           }1 s3 C0 U& R# N1 ?% I: {9 d
                         lpList->Add(AnsiString(wsName)+"="+s);4 T* ^' S9 z0 t+ h$ d: |- v  d
                       }
& E& i  x. H0 ?4 g6 C. ^
! T; C( x7 D' A# n+ T" v                       VariantClear(&vValue);* Y9 s+ n3 L  O$ J1 z0 l1 T
                      SysFreeString(wsName);
/ W1 q7 C7 M4 y  `3 M2 M1 G                     }# b5 q: u$ z. ^/ b+ W! x
                 }% K0 ?% Y( o: S" v+ x3 O8 O  q1 A2 B
                if(pvNames)SafeArrayDestroy(pvNames);
. X: f! M3 a2 C4 Q0 D* `                 iEnumIdx++;$ n( m- M( q& q4 X$ q
              }
! C1 D, R6 J* T+ G# W            }) b. f. u: K7 ^. [  P" }, c0 r: l
          if(pClassObject)pClassObject->Release();& H2 q4 m+ a4 G$ u9 G/ R
        }
# B$ \% X7 z8 T5 d( M        if(pEnumClassObject)pEnumClassObject->Release();
( q# T* m2 Z) l* v7 A- n      }
* v$ y7 [  T, ~- \4 O9 L( U     if(pWbemServices)pWbemServices->Release();
9 `2 g# N" R+ a   }
! r1 H  B. s# V& @; _  if(pWbemLocator)pWbemLocator->Release();
6 M; Z4 k. O$ a  C% R, \8 O}' ]( }" X; I' y5 R7 T
//---------------------------------------------------------------------------
) i* T) m3 Y+ P3 N+ u( d3 S# w; F: O$ s. g; Z
// 通过 WIN32_bios 获取 BIOS 信息:+ Q! [& e' ]; h& K
void __fastcall TForm1::Button1Click(TObject *Sender)6 @3 a0 b5 U/ E) k, t) z
{
! H. w! B9 M4 V# z  h9 K    Memo1->Lines->Add("================== [WIN32_bios] =================");3 y: J. {4 E. C: ~$ U% `! ]
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
; `4 }- `& S  j: W& n- g, R    Memo1->Lines->Add("");
1 b  J8 k! d7 z}
( M( _/ d) b+ @# d+ A) E+ D
6 z3 h4 j% U! U4 t  E  P--------------------------------------------------------------------------------
$ _$ c* Z9 I! L
( f, N7 J% e7 }' s0 o) ?* LWMI 可以访问的信息类型有:
: B7 X& K3 ^3 z   Win32_1394Controller: u) V1 U. H5 {6 i/ J5 N6 ?
  Win32_BaseBoard
& i, z' c6 F8 k8 m   Win32_Battery
3 {+ ]' ~  K  P8 G   Win32_BIOS) K/ O/ ]( s- P3 q% j; }) B$ T
  Win32_Bus4 k! b2 w+ V+ P7 |% Z
  Win32_CacheMemory9 R& C9 j7 @2 F% Q
  Win32_CDROMDrive2 ^/ q# j7 H1 |: L  F) B1 D, u! Y8 M
  Win32_CurrentProbe
) j( H6 H; v% o   Win32_DesktopMonitor3 \. p, K4 Z4 x) C' G+ ^
  Win32_DeviceMemoryAddress. P- d2 Q5 s" ~/ n9 M9 I
  Win32_DiskDrive
: [" }- }' h; ^1 d' O# [% {   Win32_DisplayConfiguration
" D$ Q6 z! r+ S   Win32_DisplayControllerConfiguration% M+ p2 S, C1 e. @+ n
  Win32_DMAChannel
, A! a, [; z  A6 A   Win32_Fan
; ?; D" t. b) ]3 P3 P7 E7 m   Win32_FloppyController. I0 u/ C( R) ~6 R- C
  Win32_FloppyDrive
, Y7 r# `- m7 x* M: g2 P* N, a   Win32_HeatPipe3 @2 h! |& z. k8 f% s
  Win32_IDEController$ S; ?0 W2 r* Z. V
  Win32_InfraredDevice
9 R: c% E: r+ K  A, @! V   Win32_IRQResource5 q0 ]3 T8 s. `$ j+ M& W  ]6 I, t
  Win32_Keyboard7 P" Q2 \# v5 u! w# e7 G
  Win32_MemoryArray/ H( i! G% y4 o$ I: @! B
  Win32_MemoryDevice
8 r9 n, d' D3 z" c. M' {   Win32_MotherboardDevice
& S5 G) F3 F; s1 @# D+ F0 m! ?- F9 F   Win32_NetworkAdapter: G) M( d5 q% C/ |" {, Y* e
  Win32_NetworkAdapterConfiguration. Z5 d% n+ P  c4 `9 n3 _
  Win32_OnBoardDevice
  p1 Q, e, c9 t% ^# _$ ^5 z3 U6 N   Win32_ParallelPort% A! j7 E( J" H# u' c
  Win32_PCMCIAController0 }4 |& G; Y; a
  Win32_PhysicalMemory* c) R; ^) y3 Z# ]0 B
  Win32_PhysicalMemoryArray
) B* H* R  [- Y9 K' N& h   Win32_PnPEntity
$ d6 X  u7 \8 U2 z  _( R5 _/ I   Win32_PointingDevice
0 J7 y. z, L2 }/ {   Win32_PortableBattery
8 X- R& R: x& d0 e; G3 q   Win32_PortConnector: `. X+ \- V- _" V4 C0 [( h
  Win32_PortResource
  U- p1 ^0 A: B0 e; V# E   Win32_POTSModem! L- P0 r) s" h9 N% D5 u
  Win32_PowerManagementEvent
+ O$ H2 @0 w) U  o   Win32_Printer9 y; ?2 m$ v3 U( n9 A
  Win32_PrinterConfiguration
! \+ V4 A3 L6 n& D   Win32_PrintJob
" F4 f/ y3 Q* b, _   Win32_Processor
: N7 Y: h9 Z0 a( j+ e) d   Win32_Refrigeration
# O. [6 |5 L' V2 e" m, {   Win32_SerialPort- ?, `/ c% d) Z
  Win32_SerialPortConfiguration
4 d2 [2 b) V4 Z; c! N* y   Win32_SMBIOSMemory
2 N% q; m/ \; M   Win32_SoundDevice
& c6 @  M" D/ I3 M3 M' q   Win32_SystemEnclosure
/ U7 R  x- U/ x; V; z   Win32_SystemMemoryResource7 {7 N0 j9 A( z* T" U& {
  Win32_SystemSlot
5 R" Y  ^/ K: f# ?+ O" ], ]   Win32_TapeDrive
2 T) X9 _9 x! j$ E   Win32_TemperatureProbe# F- y, h9 h  a2 G% Q5 t
  Win32_UninterruptiblePowerSupply
0 [! }& `5 g3 g( A% J3 D4 u0 K   Win32_USBController+ T7 F4 @4 o- m* R
  Win32_VideoConfiguration1 j1 a( z6 F0 \# W# B. a
  Win32_VideoController! L5 j$ j+ b, o
  Win32_VoltageProbe9 o' `+ G* m; a8 E6 r* }! A

4 ?9 d6 y2 ~# u- R7 h0 |以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 00:56 , Processed in 0.020085 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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