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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
, I' Z' |+ e2 \4 P- Z
0 k6 h. g$ ~7 f' R4 M4 T# z9 h& X$ J$ w* U, K8 l
--------------------------------------------------------------------------------' y/ G  Z/ @# S! z5 x/ }
WMI: Windows Management Instrumentation (Windows 管理工具)
- `$ O: C7 G: |   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
5 j* }2 ^2 I* s& R% ^& w   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
! i" R7 D& F8 H4 D! R% \" }* ^9 m( e   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
/ w( ]  [9 M; s7 D+ H' T) ]% @- K
--------------------------------------------------------------------------------8 s  G1 p6 Z) L; y, s+ L  U
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面9 o6 ~- `5 ^/ |3 \# {

/ ^" t, L* f/ n4 K--------------------------------------------------------------------------------/ g6 Q5 `8 H6 h
① 初始化 COM 接口:
; [( I: q- @" A! L1 y. U   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
* E1 P& Q7 M- \( e; Z4 C   这两个函数在 #include <comdef.h> 里面定义。1 U  r; @( j1 R( M1 l; |2 h$ f6 l' }
3 n9 v" ?7 }# J' f
② 获取访问 WMI 权限:. A& g; T: f, N7 H
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
' P& M( F3 @7 F5 b' l  q' e   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
; H& K. q6 \- W
0 |  N+ o. X+ X1 C# c# t5 ]8 z③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
0 l+ W- ~- d$ s' P+ [4 V   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。) F( ^0 \0 e# f% r7 S% J
! `9 ?% n5 ?2 f4 g! G9 I
void GetWmiInfo(TStrings *lpList, WideString wsClass)6 @* G2 q8 i8 g" S% W9 a! V1 M9 I6 Y
{
' g; C$ z- y$ o/ _5 Q  IWbemLocator *pWbemLocator = NULL;
1 h1 j$ M! T) L- k  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
" c) }9 N( y( r( p: W   {" U! z: @) ~5 _8 M. H
    IWbemServices *pWbemServices = NULL;
: ^6 ?4 Q" Y/ |  x8 ?     WideString wsNamespace = (L"root\\cimv2");* o8 H2 c5 ^: L; q9 A$ L7 U
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)9 ]1 k$ q  Y1 s- D; u' C' \
     {( R# q& i0 |  |& v' _
       IEnumWbemClassObject *pEnumClassObject = NULL;
3 e9 @- X0 b8 u; j7 w2 r        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
7 M# o6 j( f. p5 x7 D        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
4 h9 e. g% r; _8 ], \% w         {" z, x: g3 |$ r3 D& S
          IWbemClassObject *pClassObject = NULL;
  _7 T2 W# f: i( ]           ULONG uCount = 1, uReturned;
) U, u# [- _  }. v; c" t           if(pEnumClassObject->Reset() == S_OK)
& @) c) R+ o+ h! M- |            {
/ v$ k# l. F4 L$ x              int iEnumIdx = 0;# |8 Z& s" D! A$ Y2 Q% \9 j
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK); g+ n% Y% }; t& L
              {
% z5 x, m. U0 @4 X                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");! N. s/ A2 l, o( c" s2 w: L
9 n$ w: c( T- }4 k
                SAFEARRAY *pvNames = NULL;( k4 V) L0 |/ z1 J) l0 s
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
- N& O# \" b3 E4 ^3 ?, [2 |                  {) I5 |% Z6 g& X- c3 [' O
                   long vbl, vbu;
" w; ?' I/ M# K, v, i  L6 e6 {                    SafeArrayGetLBound(pvNames, 1, &vbl);
& T* _9 N$ n3 w- ]) l$ R                    SafeArrayGetUBound(pvNames, 1, &vbu);! c- y8 |9 ]* P' P3 d
                   for(long idx=vbl; idx<=vbu; idx++)
- J" o" D/ @. x* |& Z' V                     {1 W+ }0 V; |% n4 Z& B
                      long aidx = idx;, A  G; {! {3 p, M) F0 t
                      wchar_t *wsName = 0;
1 d' J4 M0 E& _5 \+ ~                       VARIANT vValue;+ r. z) c0 W" u+ y+ L
                      VariantInit(&vValue);$ R$ B& M6 i6 Y2 `% g' `- v+ q! x
                      SafeArrayGetElement(pvNames, &aidx, &wsName);- e) P) n9 K7 Z* Q

, S8 d/ w& s" e( C  f                       BSTR bs = SysAllocString(wsName);: `. y% F/ ^+ h# Q7 k  t  x
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
: {5 N8 N: G/ C% ]  q& X" `" V                       SysFreeString(bs);
# m* N, m' u/ {- Z5 {6 P* O: r5 Y8 i2 O: l9 `+ Y
                      if(hRes == S_OK)
  A4 K  e2 Y  W/ |                        {
: u/ x( [+ O- d) B; ]. e) c" {                          AnsiString s;
, r$ X) j& M" r& ]                          Variant v = *(Variant*)&vValue;
+ R1 i6 s7 P# u                          if(v.IsArray())
* `4 G6 L% ]! N: [4 L                           {1 t! t& S# |# }% o
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)3 A5 d7 b, r% V: k* v- r8 Q, n
                             {! \* A/ m. g9 q
                               Variant a = v.GetElement(i);& w4 `; ^! b4 q( N* |- P
                               if(!s.IsEmpty())
0 }+ x5 N; H6 K. n                                  s+=", ";7 _9 A) R: a2 ^
                               s+=VarToStr(a);
; l2 y/ J% C! Z                              }
5 k. O" v/ D% n7 \2 [  Q                           }
" g4 q/ C+ l+ j! P                          else
# n1 I0 m+ H7 e! j( F9 ]                           {$ j3 r$ G% Y0 V
                            s = VarToStr(v);9 V/ R( I4 y3 X& D4 n- S4 E& ^: ?
                          }9 ^1 l6 y. n/ t, P' h0 y3 |
                         lpList->Add(AnsiString(wsName)+"="+s);& g6 k& c$ u. b: |( ]: k( S
                       }
$ L& g# M5 y% G: w+ y: s* f& c- V$ Z& i; {0 }, m+ W! c
                      VariantClear(&vValue);
+ Q" H0 b+ o& M( }- D) p9 y                       SysFreeString(wsName);; F$ E' j) O4 T7 K
                    }; L! F& P! i" |2 s/ ?
                 }
0 q' R3 f: x  E# E                 if(pvNames)SafeArrayDestroy(pvNames);2 d( H: M" ]9 G
                iEnumIdx++;
. m6 P  j! F* m3 r/ T; p               }& b3 C9 W& g' w, B5 i2 l/ h
           }+ V( G' O. [* I: A
          if(pClassObject)pClassObject->Release();
3 E0 P2 H: A( R& R; Q         }$ w+ z8 w# ]* {$ C3 E( X) r
       if(pEnumClassObject)pEnumClassObject->Release();- @! y3 T9 X) h/ R8 ]
     }
2 W3 b! P! l2 F& s2 e1 ^     if(pWbemServices)pWbemServices->Release();
$ X/ v; v# }" V; p4 W% q6 m( W% ^   }
2 w: e! D* m  ?  if(pWbemLocator)pWbemLocator->Release();
: Q+ [2 |3 o4 }! O6 e5 H}9 F/ j2 L+ s. |; v
//---------------------------------------------------------------------------; C7 X& v0 H; e- z# M% u

- Q% A" Y' Z' [( B7 s// 通过 WIN32_bios 获取 BIOS 信息:, R& S& ^/ Q$ Q  }
void __fastcall TForm1::Button1Click(TObject *Sender)
$ a' I! H' N+ L: I1 v. W1 a{
; R( h* B3 t  u  q6 l    Memo1->Lines->Add("================== [WIN32_bios] =================");0 q0 ], y+ d/ x- A! {/ Q
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
/ d4 k1 N# l& b2 _9 z3 e    Memo1->Lines->Add("");
# k0 ?$ s. W4 {% B7 ^2 u- W}
, Y5 X. ]3 W/ X" ^" |3 v% y) g! I& `
% [7 a1 E# K* a/ K8 B--------------------------------------------------------------------------------
% v; _7 D4 D8 u
* Q3 N5 o9 y9 u& e; z7 sWMI 可以访问的信息类型有:8 c7 _- N% Y8 `6 x
  Win32_1394Controller
  c2 e2 ]9 ~3 z( F( f* `5 I9 G   Win32_BaseBoard' i& E  }4 ^& k" v
  Win32_Battery% ^: t% J1 a6 @/ Z
  Win32_BIOS* \* V' E+ |' A9 o
  Win32_Bus
  x0 D6 ]& v6 K   Win32_CacheMemory+ C9 E! Y. e7 W
  Win32_CDROMDrive
- S: y$ ?3 I# \% v5 Y! E   Win32_CurrentProbe
7 |+ Q% Z" W# c" v% ^6 u- b* W; {1 K   Win32_DesktopMonitor
7 j3 w9 t8 z7 V' Y; H0 h) ~; }: U) S   Win32_DeviceMemoryAddress
" {% [% a/ \+ ~* m   Win32_DiskDrive
) [" ?" M8 j" t   Win32_DisplayConfiguration9 O/ a% O/ N( @" H
  Win32_DisplayControllerConfiguration
: R# t  O1 p! d- B2 }' F   Win32_DMAChannel! v  Z( h# l6 Q/ p
  Win32_Fan2 h  {2 \  g; k0 U) y
  Win32_FloppyController! h& O# Q  }; h. Q$ B
  Win32_FloppyDrive* l& V+ c! V6 Y4 e2 D
  Win32_HeatPipe1 M- E/ ]0 [# j; C- x
  Win32_IDEController3 l* ?- M- O( U! }
  Win32_InfraredDevice1 T0 y6 ^! I4 ?# @1 t
  Win32_IRQResource
% q; B2 {7 Z/ ^1 F   Win32_Keyboard+ G0 B$ e# c$ u( O+ T3 Q" {
  Win32_MemoryArray5 R* [0 Y0 I9 n
  Win32_MemoryDevice
% D. u1 K9 v. w% L   Win32_MotherboardDevice
: z) p+ w/ C9 H9 G2 d5 h   Win32_NetworkAdapter
9 U/ U0 g3 e) s. }9 D' v* \   Win32_NetworkAdapterConfiguration! q- R5 S0 e/ q$ [4 ?- F# D. I
  Win32_OnBoardDevice$ `* F9 d8 `& v+ K8 B* B" {; y1 O/ E
  Win32_ParallelPort- L6 m. h  n0 U# Q) d$ k4 q- [
  Win32_PCMCIAController
2 m7 ~$ C9 {5 e8 z   Win32_PhysicalMemory
3 W7 S/ ^! N  N0 c6 c   Win32_PhysicalMemoryArray( F7 n% u' X5 C  s' g
  Win32_PnPEntity
4 o3 s2 Q/ I# _' g* J   Win32_PointingDevice
: E# B- _3 t2 r3 ^   Win32_PortableBattery# G0 a0 p. c- O4 c
  Win32_PortConnector
( I) u' m; x# I% M* g2 _( ]   Win32_PortResource
8 L# ^2 q9 q2 e5 k% x# u2 R; d6 U+ H   Win32_POTSModem
1 q  q/ {: l/ ]) e   Win32_PowerManagementEvent
7 x4 N( }# G* a" K, m) H   Win32_Printer
; W; k2 a$ ~  \4 ?7 l% t6 J   Win32_PrinterConfiguration. Y/ m  \3 K+ O
  Win32_PrintJob
: y" n5 Q8 s) A) m0 `  y# C1 q   Win32_Processor
; O: O/ Z0 B) a   Win32_Refrigeration
, u4 k" v5 A! p$ T) F/ j! f# y   Win32_SerialPort
1 R2 _" u  g" k8 x4 b2 v   Win32_SerialPortConfiguration
; Z8 M( k, o4 N* e8 \# _6 k   Win32_SMBIOSMemory
- J0 O0 S& c, _/ r. p   Win32_SoundDevice
9 E/ j# U: p+ |5 N2 J8 {8 \   Win32_SystemEnclosure
, Z9 Y5 l4 \; t* [6 z' ?   Win32_SystemMemoryResource5 a3 y$ Z' Y; \" Y4 G
  Win32_SystemSlot
7 ]: n. r' W6 [/ T6 @$ F   Win32_TapeDrive
8 g/ T! k# v" E# ?   Win32_TemperatureProbe' q- z" N, T% H
  Win32_UninterruptiblePowerSupply
  }$ H! E' B  m$ {1 Q% A4 p   Win32_USBController
: i% G2 E5 |8 J   Win32_VideoConfiguration
8 h; T6 c8 L8 j% a   Win32_VideoController4 J( z, H, n( C& m# _! J) Q7 L
  Win32_VoltageProbe& n" q+ ]( @# V  P

: o- g7 N( Y& d6 h) T) X1 F& ]/ E以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-5 13:33 , Processed in 0.021002 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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