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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
- z" n' o. V, o( v: S& x
  ?2 h/ o. T1 l8 k& Q) v1 F& w2 I4 r7 V4 u$ o* `) O
--------------------------------------------------------------------------------
! y6 y4 o3 }7 z9 b! mWMI: Windows Management Instrumentation (Windows 管理工具)2 }; J- o9 [, r0 l8 [& c* U. ]
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
; \1 x2 z: `7 }) ?$ i   利用这个工具可以管理本地或客户端系统中几乎所有的信息。: d% h2 f/ l: b4 G8 U, D7 m
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
  w0 M& s% z$ R/ q( l' ?
8 p3 r' J- k" \) g& P/ I7 V--------------------------------------------------------------------------------4 V" B  {. Z) N6 l
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面3 F8 g5 f2 _1 N% o* _2 d" `5 r
+ o, I& f1 k1 G- D! P" ^: m. `
--------------------------------------------------------------------------------& K$ z$ `8 D5 W
① 初始化 COM 接口:0 m" h# d! c& T
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
/ g2 v: ~4 Z4 G1 t4 e   这两个函数在 #include <comdef.h> 里面定义。
& m% E- C9 K6 u) n1 X6 L. y/ f' N! h8 i$ @+ E; }3 S" ]. M
② 获取访问 WMI 权限:
' d. s# O* T. K   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);( o9 X3 F' |: O3 d5 S
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
( r) H& u3 x* i7 ?9 a6 \
6 T+ ^6 E& V: c/ E③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
; x5 d  `6 }7 E% R   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。+ C& F' |) s) E4 k, M
0 V& K' m. k* g& n
void GetWmiInfo(TStrings *lpList, WideString wsClass)# O' x, g, v& j* V" N$ Y3 {0 G6 D! X+ K
{
- K# X) e' t0 P  IWbemLocator *pWbemLocator = NULL;
( ^7 |5 x4 M2 x( j# T$ X0 E* J" `6 I  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
0 ]7 d+ M$ j3 K   {! u* N' E/ w, t* ]) N6 `
    IWbemServices *pWbemServices = NULL;
( S' t& m6 N1 D8 @     WideString wsNamespace = (L"root\\cimv2");: q" o6 M0 C8 L# B
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)1 s  l# Z7 ?2 X- X2 d0 ]) Q
     {- C$ ~) j/ ~2 [6 Q; [
       IEnumWbemClassObject *pEnumClassObject = NULL;
; v6 _- j4 P& p( C$ e3 v        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
$ M1 b4 z8 K. m5 l5 o1 E2 K) i# G$ _        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)" D) J* u& p3 n8 d! F4 X2 ~
        {* e, u0 v! c' x2 d' A, X: Y
          IWbemClassObject *pClassObject = NULL;, P) T7 a! |& K  L5 ]
          ULONG uCount = 1, uReturned;
, V, R' v8 K* O8 f0 ?0 q' a6 O           if(pEnumClassObject->Reset() == S_OK)
( v9 R) T) \" V* h' X( v            {
( V4 P8 F5 ?. @# q. V  J              int iEnumIdx = 0;' T5 G9 C) f9 P6 r4 ]* }
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
* m& Q5 I) V2 H3 A$ j" m               {/ ^) r% P1 p7 ?
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
3 B% `' m; v" g/ P& B0 i. y( H! z3 {0 G6 z9 D7 x
                SAFEARRAY *pvNames = NULL;
; |% ^0 x  Z* M% o) }$ x                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
4 ]8 s- |6 M' X, L                  {
8 H) \) ]' D( p4 ~                    long vbl, vbu;8 a/ b5 q8 F0 V, c1 Q
                   SafeArrayGetLBound(pvNames, 1, &vbl);1 P- v& ]' l6 m# r4 z1 c
                   SafeArrayGetUBound(pvNames, 1, &vbu);
$ c5 |9 c# @. n" o2 O                    for(long idx=vbl; idx<=vbu; idx++)
$ W! L6 w* ^9 t  i" s. M                     {6 {0 N9 d6 z& P% T" {* i! F
                      long aidx = idx;
9 U* b5 T+ d, K4 s                       wchar_t *wsName = 0;
$ f5 m/ a8 m; g/ _* ?7 E                       VARIANT vValue;9 I" x& w; B* d* A' }* o9 s$ _
                      VariantInit(&vValue);6 f; C" t& u# E( N# c  I3 M( @1 q" S
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
# z% S9 j* t$ z3 W) B
6 C9 [. ~7 @: S( j% i6 e3 d; h                       BSTR bs = SysAllocString(wsName);* U5 D9 E) n8 B' y( r
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
# c4 g9 \+ y! W$ @. B                       SysFreeString(bs);+ ?% `" u( A$ j  R5 s# P& ^
. x4 L4 E- I8 d* q7 r
                      if(hRes == S_OK)& j" Y  M+ d& y* r4 e" q
                       {2 t: k8 H& ?! {' J4 u
                         AnsiString s;1 M! R6 A; C+ F
                         Variant v = *(Variant*)&vValue;
; C4 m2 f6 _' V4 a' M  `( g* h- @* S                          if(v.IsArray())% C# c; y, b4 L5 H# I: G* i% V
                          {9 t+ {# C# I6 z
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
2 ?+ ?  ]& _- i2 p. W) {                              {
, i) s+ @) x, ~; @% ]                                Variant a = v.GetElement(i);
( h3 C& A7 k8 [& o: K                                if(!s.IsEmpty())
2 E; n' r9 K. z' }2 v                                  s+=", ";
0 @, D. P0 z5 k+ i  w# e0 f6 ^                                s+=VarToStr(a);& |) y. K  Y9 g9 j. L
                             }% d9 L' X7 l/ S& ?( @& U
                          }
! u+ L8 `& G% d                          else
7 Z9 q4 q0 w: V5 l/ H2 H8 G                           {
! D5 O; J, A- I$ f3 e                             s = VarToStr(v);* H* W. g! N8 s
                          }5 N* V& A  q0 r' M" s
                         lpList->Add(AnsiString(wsName)+"="+s);9 }/ L# D% j6 D& ]3 K8 K
                       }8 z9 T, p, T1 y; i
( \* G/ ^4 t  M( `+ W
                      VariantClear(&vValue);( s. [6 N5 v' P# I. ~1 U' i' U
                      SysFreeString(wsName);
, {0 c1 k7 X! {$ Z                     }
  V0 W6 `8 e+ E: D) Q" i                  }
+ G: v/ A% z& y; ~                 if(pvNames)SafeArrayDestroy(pvNames);
, b+ \$ J( B( p) ?, r) i6 e" Z                 iEnumIdx++;6 j5 c% Y+ S3 B
              }
. _0 ?8 Z: h# @- m* U            }1 L: M$ {4 p9 Q6 b
          if(pClassObject)pClassObject->Release();
! |: l& k; G2 m) W( Z         }
1 r  R: L; D# r) `) N) B        if(pEnumClassObject)pEnumClassObject->Release();, R% _( o. |& K, A
     }
: Y+ X, w2 Q0 G' Y0 _) d     if(pWbemServices)pWbemServices->Release();
& m  J; {2 _, x+ x+ W8 X6 r   }
5 N1 \( K5 E2 B! A6 B) C* r  if(pWbemLocator)pWbemLocator->Release();
) I6 \, E! a1 o( {3 P}2 O$ u4 @* f4 G$ G  Y3 z6 H
//---------------------------------------------------------------------------
- G( q4 `  W4 G4 Q3 P
' z# z: D/ s% b& c3 N// 通过 WIN32_bios 获取 BIOS 信息:
7 p5 K0 X7 M. j3 f. Kvoid __fastcall TForm1::Button1Click(TObject *Sender)
& J+ y4 A0 }' `: s* f6 M, @& y5 U{
: {! ^, x7 K6 q8 R! g    Memo1->Lines->Add("================== [WIN32_bios] =================");
  M: g8 l, k+ N8 f: u    GetWmiInfo(Memo1->Lines, "WIN32_bios");$ a5 D! k& w; x
   Memo1->Lines->Add("");
  {  z; _+ p: k0 g# Z  v) f/ L}
1 ?" ?, }" o6 E0 D+ y6 I" {9 @0 A
5 ?( z1 p/ {0 B+ D7 i4 t8 V--------------------------------------------------------------------------------
* c$ ]3 x1 B* k9 M+ f! }8 o" ^; L1 a' h* x" h) L' j: C
WMI 可以访问的信息类型有:
$ L# R  \/ d2 H  H; b8 O8 y   Win32_1394Controller0 J; |# c' u& n* z* o& V2 l0 r
  Win32_BaseBoard/ U: h! `! s; J' }% F; X& d
  Win32_Battery
- Z# ]) J" X' Z   Win32_BIOS& j: H' }9 Z2 |* X* q& B9 [; |, I  \
  Win32_Bus& j8 u+ @. O( o/ {( t
  Win32_CacheMemory
- \: I9 r( {/ q6 E7 Z   Win32_CDROMDrive
9 O) m! [; w( N   Win32_CurrentProbe
, G! I! M% m& C, g& x/ D5 J* w( i   Win32_DesktopMonitor
7 W* L; p+ Y( y2 m  O6 }) l, c   Win32_DeviceMemoryAddress  h4 g9 B$ x( W. Q0 q, X" X& g
  Win32_DiskDrive4 z# Q& B5 j4 b, k! a% z
  Win32_DisplayConfiguration
9 Y# c8 F8 e# ^4 U/ V+ o   Win32_DisplayControllerConfiguration
5 D1 V1 ~+ g7 C5 D& u: _: s* h   Win32_DMAChannel
/ b& x5 r- n' O   Win32_Fan
" v( ~! \2 c$ y/ l& q  B& B   Win32_FloppyController; |' b8 P. h0 L, v
  Win32_FloppyDrive+ k4 l$ F* k1 ?1 ^8 F$ |& s, _
  Win32_HeatPipe( F& n* X6 o$ {) Q
  Win32_IDEController& j+ |+ s. h$ W, S
  Win32_InfraredDevice
4 P* o: p% [! M6 n6 X3 X   Win32_IRQResource
5 S3 p4 A- r% I" Z   Win32_Keyboard
' e% d/ `) v8 J7 F9 e+ _   Win32_MemoryArray
! o3 `, J! C  b& |! {   Win32_MemoryDevice
* [5 x" U* n+ g* A1 Z' Q/ A   Win32_MotherboardDevice
! L( h& p" y5 ^' h   Win32_NetworkAdapter3 F1 M/ X5 ^" ^7 i" b, y4 ]
  Win32_NetworkAdapterConfiguration, M/ K, v& E" s  f1 ]( Z( K2 `
  Win32_OnBoardDevice% Y/ u/ E  `8 n0 h
  Win32_ParallelPort
2 y& p1 E2 L- m2 ^+ r   Win32_PCMCIAController
5 O- S7 N1 V1 G: T  V4 }   Win32_PhysicalMemory0 n+ F& u* n+ A
  Win32_PhysicalMemoryArray3 s. N- L% D' U2 O
  Win32_PnPEntity
2 j: ]& R  O8 A/ r/ w7 A8 Q% }   Win32_PointingDevice
. l0 A6 n2 j; [* N* y   Win32_PortableBattery
# m( {. g" a& }4 H! W8 e! I6 H$ C   Win32_PortConnector# ?) i2 ~# l% l( v7 }
  Win32_PortResource
8 M# y; P% u1 D8 W8 n6 D   Win32_POTSModem
% a6 K5 U/ M0 h6 c4 b   Win32_PowerManagementEvent$ [$ ~, i/ q$ |: q5 d7 d" ~
  Win32_Printer/ ~+ e+ R5 V; s
  Win32_PrinterConfiguration' V, }5 I, u" P& `( J; |- O# D5 p
  Win32_PrintJob8 ]* |! b0 H! t: r! Z
  Win32_Processor8 V! s% R4 z6 {* p& u8 x( j
  Win32_Refrigeration
, o! @, k. E4 t" C/ s+ @   Win32_SerialPort( R( c( @& B  T  u; k% A& y/ b
  Win32_SerialPortConfiguration
2 d& o6 q4 F5 f. {   Win32_SMBIOSMemory$ q+ F" p7 V! L% B9 Y) s4 _6 z9 O% x  H
  Win32_SoundDevice  k! L5 _* T) y! `* u; j; {' y1 s" @
  Win32_SystemEnclosure
. O/ N5 z7 @, @, o   Win32_SystemMemoryResource7 h% ~! Y' ^8 E$ |3 P, ^
  Win32_SystemSlot
5 N' g3 I( R% J  ~0 X3 Q   Win32_TapeDrive
* W  S" z% Y/ l3 x1 ~   Win32_TemperatureProbe2 U1 c! s9 [  u8 C+ p
  Win32_UninterruptiblePowerSupply  H% B: ^' {" e
  Win32_USBController
  i# \  U6 I' o3 s: N; g   Win32_VideoConfiguration
1 A* a! t8 [8 ?. J' F; m   Win32_VideoController. L8 `) j% e5 H7 p
  Win32_VoltageProbe
- p0 V. S$ b/ y( l  P) B4 x6 x+ e* K# m: w7 T4 d1 e4 Q8 Q, o
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-27 06:00 , Processed in 0.018552 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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