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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
. c" u/ `1 e# ^& L
  [) L8 C) Q/ d4 X1 Y6 m# h! d
0 v3 t) Q3 f1 `/ G8 M* b) j' @6 `--------------------------------------------------------------------------------# K5 a5 A6 _" Z5 r* r
WMI: Windows Management Instrumentation (Windows 管理工具)7 P! H+ Q( f, b, N# F
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
7 M& ^. k& w; j1 z7 y, \   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
( P# L4 Y! B& [7 b' g+ H9 g   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
) a. W9 n' M: C# U% l  ]- \& [1 x2 X8 i/ x1 ?& G* c
--------------------------------------------------------------------------------7 _, m( l6 k& E: ?
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
1 R2 h1 c  l) j7 U+ K& `, ]% s5 U. H( j) Y- ]% H
--------------------------------------------------------------------------------4 `+ E. s3 s; B" T
① 初始化 COM 接口:: j% G7 B7 h* h9 s2 }+ K, d4 Q
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
4 L/ |, E* w8 d0 R6 ~   这两个函数在 #include <comdef.h> 里面定义。
3 O6 Z+ a$ A7 [1 T# ^5 A
  Z/ x6 c7 f) e② 获取访问 WMI 权限:
. i: z& z) s1 [) h  o7 u9 u# i   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);. n; H; T+ z  p5 M& c  t# s
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
9 m/ x8 k" R) X% W
/ Q, ~9 H/ T; n- d/ ^7 `6 m③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
4 l+ O0 E" z1 y6 q% ~+ I   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。2 Q2 a$ C0 Q% N9 A" |

2 N8 m& `$ r  U& I0 bvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
. f% j- d1 m4 Q5 X+ O  b3 e{
' m$ f- F2 F7 u% G, U" |  IWbemLocator *pWbemLocator = NULL;
2 q, i4 c/ \* C) k3 T  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
( A0 T$ b- G. s/ L   {0 |7 L% C4 \9 y* K
    IWbemServices *pWbemServices = NULL;4 {5 y  H2 |+ y: o( u4 t
    WideString wsNamespace = (L"root\\cimv2");1 p( O; S4 _- u( K
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
: J% v7 \% A* ]; z      {
% j( {# e) p! k2 K" g5 W        IEnumWbemClassObject *pEnumClassObject = NULL;7 N1 O5 M1 o& `; ^1 D- W8 k
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
- F6 d1 B- |& C3 r        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
/ |; |# T4 l- q         {
) V$ [' z; F& P1 e2 S. l! O           IWbemClassObject *pClassObject = NULL;& {" g/ T$ i- a0 [: D/ k3 Q
          ULONG uCount = 1, uReturned;: I9 i4 F& Y9 V* w# |
          if(pEnumClassObject->Reset() == S_OK)* ]/ K/ x0 Q" L3 R' K/ u
           {
" _  g: z. a! z: f/ i              int iEnumIdx = 0;# n+ G3 B7 V0 G3 V; z6 V; A
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
0 E" @/ M: r& J, ~3 x& l               {9 X8 E- {3 M! {; |; b8 n4 _" v* g* V
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
) B8 l% l  o/ B/ Y4 g
- H, }! E; i# V9 I# N                 SAFEARRAY *pvNames = NULL;  T, x; d" K& w4 D* h0 c
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
8 w5 }% x# n: E                  {% p4 P+ v, T; D7 w( P& p
                   long vbl, vbu;# w, M+ M  s0 m" ]
                   SafeArrayGetLBound(pvNames, 1, &vbl);
% [! V) A8 ?; b& n& `1 `! u                    SafeArrayGetUBound(pvNames, 1, &vbu);. x7 F1 a; Y: ~3 C* u! k8 r. h
                   for(long idx=vbl; idx<=vbu; idx++)7 Q1 S# ^1 o5 [  L& v$ B
                    {) c: C9 ^( J0 m( \( R' N# ~, R3 O  `& C) o
                      long aidx = idx;
1 p- u3 m7 ?4 X, z                       wchar_t *wsName = 0;0 u* }# ~; K: _- N% ?
                      VARIANT vValue;
/ m7 I) U, c, V                       VariantInit(&vValue);
+ G% r! z8 ?8 l& V                       SafeArrayGetElement(pvNames, &aidx, &wsName);" H/ G! Z/ |. e: O3 j* ]
: N7 o) b: F. M& h4 Z+ M+ u$ i9 y6 b
                      BSTR bs = SysAllocString(wsName);5 U: c6 L. C2 D3 S2 ]! L
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
9 ^' y+ X+ k2 O, t% I                       SysFreeString(bs);
0 M( u9 h' P6 T: \; H0 r. l+ |
) J' T# X4 R9 e" F$ T; R) y% K                       if(hRes == S_OK)
# n. y; ]: g2 F" a6 K: ?% D                        {( ^# I" r; w' {- [* O- q
                         AnsiString s;
1 l$ ]' X0 M  q$ ~+ r                          Variant v = *(Variant*)&vValue;( o- I4 O+ ]1 h# M! z5 M
                         if(v.IsArray()): {, |' O9 p! Q
                          {
4 s4 y. ~3 q: I/ b                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
8 H. X. P' k* q                              {
+ Y: D3 w, r, @% n6 B0 }- H) h( C                                Variant a = v.GetElement(i);( v3 q* z: }3 i4 B- t. [% s- P  N
                               if(!s.IsEmpty())
% v3 g& O+ `, V& V; u2 U                                  s+=", ";
, E- E3 G2 N0 F8 q                                s+=VarToStr(a);1 F% d2 }7 H+ V' t
                             }
8 x5 u% q$ X) v. n& O                           }0 f1 H, F0 W! u( R/ h* h; g0 D9 e; e
                         else1 K: M  t8 v5 Z* |5 M  z
                          {
' ~% {$ Z% l3 {                             s = VarToStr(v);
( _5 n/ k- q+ @2 D1 E& l7 v4 z                           }
0 f/ x5 N) S8 ^" {  b                          lpList->Add(AnsiString(wsName)+"="+s);
5 Z  g) ^+ e7 Z' P+ W: {' f                        }
. L: q0 s9 b$ a6 L; t% K4 o
( k5 b  l5 x. W- O$ F                       VariantClear(&vValue);
# j" e7 W' _7 d6 H; Q" P; @                       SysFreeString(wsName);  B  v' ~0 V$ a3 f
                    }
8 x/ Y: ^/ ~5 y- O- \                  }5 g- z9 ~5 f  j7 L% B# O( `9 W/ l1 @
                if(pvNames)SafeArrayDestroy(pvNames);4 G8 ?8 L3 Y( o; l+ @4 W7 j; C
                iEnumIdx++;% o* t$ t) ~+ D+ u1 L  t) y
              }
+ m( r1 h' K- w            }
# y9 B2 v8 ?" Q% t  y           if(pClassObject)pClassObject->Release();, y& s3 C4 d3 f/ i4 g( w! D' U
        }
2 S5 Q; P# Z; i0 y7 x/ I2 c4 f+ w        if(pEnumClassObject)pEnumClassObject->Release();
9 \4 @" B/ q1 q9 S, X" U      }' H0 S" t  Y( x. x3 S6 `1 z
    if(pWbemServices)pWbemServices->Release();
+ C% ]7 k! w) H   }
: V3 g! Q; p" i' ^. n9 k# w- l  if(pWbemLocator)pWbemLocator->Release();/ h/ b# ]  B4 N/ q8 d8 Q! q+ ~
}1 @2 r: S, S& W# t! H9 }4 W0 y
//---------------------------------------------------------------------------
) i* N0 ]/ f7 T* j1 m( U) ~  t5 O2 ?& X, Q5 C/ @
// 通过 WIN32_bios 获取 BIOS 信息:# y7 o& i1 K& @' m; G
void __fastcall TForm1::Button1Click(TObject *Sender)# v( Y# F9 Z* j1 o
{; ?' W- ^5 E# q* R$ q; L1 A9 I
   Memo1->Lines->Add("================== [WIN32_bios] =================");
* F. g/ W" f% A0 l4 N0 n    GetWmiInfo(Memo1->Lines, "WIN32_bios");- n9 S4 Z4 C3 A5 \' P
   Memo1->Lines->Add("");
1 `  _2 @3 U3 B$ a5 _}1 d* G) c) f# v' g5 i/ Z  \& r4 c

+ ]2 T5 h) g8 g7 I5 Y* L% q--------------------------------------------------------------------------------
9 N; R6 ]; \  J- w' G# G: F( P9 k# I+ M4 X% K! C$ L
WMI 可以访问的信息类型有:6 e# o. ]: Y: D; [& U
  Win32_1394Controller, U$ e( ]; q: Y
  Win32_BaseBoard/ n3 C! }4 F; W* c, I
  Win32_Battery" F: u  X+ _, R( C' G* `
  Win32_BIOS! p7 `2 [" K9 N( L% G  v
  Win32_Bus- S/ P, ^- \& ]: r; v' j
  Win32_CacheMemory3 Q, e, P- ^; K  F5 }$ _6 O
  Win32_CDROMDrive
# z0 O9 ]- W' F. A1 _  u: w7 d   Win32_CurrentProbe
4 H& k( N# Y& G) \1 X6 M) S+ S   Win32_DesktopMonitor) V& [; r3 \1 q9 d& E: [  [+ v
  Win32_DeviceMemoryAddress
! h" e  a) c/ j, e. z% D( R   Win32_DiskDrive3 N8 I8 \& n7 R; ~: ^
  Win32_DisplayConfiguration
* v: J6 Y+ S7 [  h( h   Win32_DisplayControllerConfiguration0 v' w$ p( i' \2 E$ I7 V2 t9 t
  Win32_DMAChannel
+ Q/ ?- t  M5 N. \   Win32_Fan
4 V( b: r* _# j6 |) T4 S: }   Win32_FloppyController
2 C! U1 Z7 Y# A# ~( \2 U# R0 J3 z   Win32_FloppyDrive  |6 o3 P" Y7 X" ?& p. k' T, C; [
  Win32_HeatPipe
' z+ \7 |* z" F   Win32_IDEController) [+ q. x  }! K! a' C
  Win32_InfraredDevice
$ h9 G0 I, s1 E6 x6 d8 s   Win32_IRQResource0 S  u1 ]% A$ g& Q" J% s
  Win32_Keyboard% m. T0 _4 K3 f3 E9 E* F# J/ v
  Win32_MemoryArray$ ?3 ]( }  a1 [% @' b/ \
  Win32_MemoryDevice  _# Y; Y  q) A+ M; w( V3 p
  Win32_MotherboardDevice4 s% ?$ q3 O, O. n" x7 }$ O8 U
  Win32_NetworkAdapter
% a" B! c# ~6 `# C3 J   Win32_NetworkAdapterConfiguration# V# A+ B" h: _1 ?
  Win32_OnBoardDevice
  f: b# X4 m2 r; m" t9 _   Win32_ParallelPort
* x- |) h- {  Q5 `   Win32_PCMCIAController
1 x& ~4 |+ c$ h" h( e& s* Q   Win32_PhysicalMemory
+ g- m5 ~5 {+ M- |9 B0 }% I) [   Win32_PhysicalMemoryArray
; t% p6 I9 b; E   Win32_PnPEntity8 _0 x& j' G( x3 T  I& y3 h! P
  Win32_PointingDevice0 v: \0 g; C/ I2 N5 `
  Win32_PortableBattery8 h" N: I& r+ \' v% z
  Win32_PortConnector
8 N; e& p2 d& \7 G/ u2 u   Win32_PortResource7 ?1 F. w9 t% D& z
  Win32_POTSModem
  c! p. l4 T. z5 n7 |9 j   Win32_PowerManagementEvent. N, j' {$ S4 z* L% E9 V
  Win32_Printer, @! E' {( Y( z2 D
  Win32_PrinterConfiguration
8 K/ [; w6 @$ `7 O& H! Q; i   Win32_PrintJob
. G- s9 l+ ^, _  f! p5 h5 Q   Win32_Processor, S7 g' R  [! \* w
  Win32_Refrigeration
" f! `# z9 k2 I) r   Win32_SerialPort
/ C, w$ \2 b( u, I& C/ Z   Win32_SerialPortConfiguration" R7 f* x4 S# I5 s3 v
  Win32_SMBIOSMemory0 f" a  @: }2 t0 t, W; z  e1 b
  Win32_SoundDevice
8 M* G- N* y6 p& |$ `) `3 j   Win32_SystemEnclosure
' D! w' A# X- x7 i5 ?   Win32_SystemMemoryResource2 a# X, E8 G. w* |
  Win32_SystemSlot4 a. |( P7 s4 O
  Win32_TapeDrive& k* h8 C9 A( R5 Y4 M
  Win32_TemperatureProbe
; |+ \7 P% ~2 Z; i   Win32_UninterruptiblePowerSupply
  Z1 B# ~$ l/ G/ @# q) ]5 O   Win32_USBController
) {$ n' Y' a8 t/ c2 ~   Win32_VideoConfiguration- ]2 [6 e% [# `; n
  Win32_VideoController
4 W& E8 U6 {) e) d6 A0 g$ Z, s0 T   Win32_VoltageProbe
. B% Y! }5 {& S7 _1 R- X9 H; O. X( c4 V
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-10 22:53 , Processed in 0.021217 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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