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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
6 |4 g8 t, P/ Y/ m1 G. {( A8 Y

! G5 a* g4 {; W1 W. j--------------------------------------------------------------------------------: w: M( ?, v7 R* s1 E: A
WMI: Windows Management Instrumentation (Windows 管理工具)& m+ h8 a) o5 T2 z! k; j% b* R7 F
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 & K- d* R' s/ }1 i, X% r1 S! u
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
3 e& m" u# ?" y   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 7 @" B) b& v% L

* _  {5 L- ?( P: c' r. f9 ~2 E--------------------------------------------------------------------------------
& k' ?/ N' Z5 b: c& A3 p8 pBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
+ }5 ~6 h3 K) c$ F, h
) k1 A6 R. z# c# N--------------------------------------------------------------------------------  s3 F) f2 X+ P$ ?: e2 V& x4 o
① 初始化 COM 接口:
8 q) }- x+ ]: ]+ j. W: F   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
% \7 v7 q0 }8 ]8 T   这两个函数在 #include <comdef.h> 里面定义。
2 A/ K  v8 X3 y3 U+ ~) a, I1 }
② 获取访问 WMI 权限:
8 d* X  Y* I1 I- T   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
1 c$ @0 A- e% E& ?7 ^9 a   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
1 ], w$ w- f$ B5 ~6 |$ ~& n+ m' r, ?" F
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
, @9 |" U3 k  `6 ~+ `& m   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。  i! o' b! w4 N) T- n

/ h" B" L3 l5 i9 A$ e- Kvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
/ N9 A6 d+ P  f/ L$ t7 t8 l& I{
3 P: h" V( U" ^7 B6 A4 @  IWbemLocator *pWbemLocator = NULL;( j# C4 {/ R# q$ \
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)8 L! a+ `+ C1 s" C* C3 o
  {* O1 f9 n; C' g1 ~
    IWbemServices *pWbemServices = NULL;* f* i/ X: d% X* h) h
    WideString wsNamespace = (L"root\\cimv2");/ y2 g) ~, x5 v$ I5 U3 L, e5 E
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)8 A3 O5 ?4 g. _9 a5 I
     {6 |, I$ P5 e$ M
       IEnumWbemClassObject *pEnumClassObject = NULL;
& h2 f  W8 H1 n% i$ X        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
4 e: i/ N0 e$ M$ D; o' U% M9 `        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
& Q, |8 r) I- x9 E: U3 s         {' Z( y+ j* v4 P7 x+ l" r
          IWbemClassObject *pClassObject = NULL;
- r, S) ~) B* P5 C# y- P4 s           ULONG uCount = 1, uReturned;
, @; G' w7 D  i- w9 E+ C* T           if(pEnumClassObject->Reset() == S_OK)
# v. ^/ C, b' p            {2 b3 J. M# r9 L( K
             int iEnumIdx = 0;# b6 }9 V8 }; E6 h
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
2 ^+ S$ C$ J- Y8 z9 m               {$ }+ b" i* h2 W; e5 F* D2 r% j
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
6 n6 x" U. M- b* R2 `. Z! d3 Y- U6 G8 g+ w; V5 C; T' q
                SAFEARRAY *pvNames = NULL;
3 L7 e, q- v4 I1 z  A9 o                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
8 J0 M$ j) `. H2 m  W                  {
  j( z+ Q, v3 C( N/ y+ D3 ^0 K                    long vbl, vbu;& b5 [/ R8 [6 {
                   SafeArrayGetLBound(pvNames, 1, &vbl);0 U  S9 W8 K# H' ^/ |
                   SafeArrayGetUBound(pvNames, 1, &vbu);
* {# F# u0 A6 k                    for(long idx=vbl; idx<=vbu; idx++)1 _) V; s" B- A1 i5 \2 Y7 [0 C5 b
                    {
9 ~1 D- x% X3 a# |4 \                       long aidx = idx;
7 _6 F( D' T8 @6 Y                       wchar_t *wsName = 0;
0 P: z' {4 b7 o0 Z- ~" Y                       VARIANT vValue;
% R8 ~' ~7 A- V4 K4 v                       VariantInit(&vValue);
) r2 h8 O. ?" v7 o                       SafeArrayGetElement(pvNames, &aidx, &wsName);
/ |1 d0 y$ P; Z# U* D) J6 s- @8 f$ N6 L/ k" n% M
                      BSTR bs = SysAllocString(wsName);8 j( b) Q+ c0 b5 I0 |9 V: z
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
9 B2 w; c/ A5 q                       SysFreeString(bs);
1 a9 C" ?3 i! e+ ]! g
' r9 j7 U" J5 e  n% g- C                       if(hRes == S_OK)
* ?( I5 y+ [- \9 W                        {$ f  i3 w1 A- t" W5 E; e
                         AnsiString s;4 {; C# z1 n& ~1 m7 y5 x) m
                         Variant v = *(Variant*)&vValue;
9 E' d! P. _( e$ G' T2 o                          if(v.IsArray())' l" y7 M2 o+ p, I" X: F0 C5 p- Z
                          {! z* P) v6 F& ^5 q: R' z; u
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
, n4 g( C. B( H( u                              {  @+ s# r% d2 V7 R9 N
                               Variant a = v.GetElement(i);1 t; T5 F2 P+ p; g/ l5 b% s
                               if(!s.IsEmpty())
! P/ A! L% \- o6 X3 q                                  s+=", ";; u' D$ _7 R* L! n
                               s+=VarToStr(a);4 I' k, ^6 \3 k5 D& w" Z* v. \# ?
                             }
5 n2 @0 H2 j7 ~                           }. |9 i7 {0 |0 |! r7 _* V* {
                         else
! v5 v) H  Q8 P( s3 ?, j* {                           {
& j: L4 W# |1 `                             s = VarToStr(v);- ~& [# K* c  n0 u
                          }- F& [; D2 Z( G7 a
                         lpList->Add(AnsiString(wsName)+"="+s);; q0 N) n( }$ P3 P
                       }
5 ~1 u5 Y* L6 c7 I
! ?$ U6 w6 V; _, h& {0 `$ k% ]                       VariantClear(&vValue);; f8 l8 {' Q" \, K* K
                      SysFreeString(wsName);$ s! v, L/ V" @7 C* T
                    }
8 n/ b$ v: d0 |7 z                  }3 q1 t' m4 l% Q- `9 F6 {
                if(pvNames)SafeArrayDestroy(pvNames);! |/ Y8 m* B! O, e6 Y
                iEnumIdx++;
0 K: D& o9 o: G# }& W$ ~" W' r               }8 q9 x/ f, t* e: U# h$ b% h
           }$ e( R7 f6 }) l5 K  j; E) ^
          if(pClassObject)pClassObject->Release();: x2 b$ }! C+ y, j/ B) B1 @
        }% M  b8 E! T* I9 x
       if(pEnumClassObject)pEnumClassObject->Release();
0 I& k* F, ~( V; p( l- `7 t1 a$ Z9 S      }
- l, r) J& s6 q5 W- K1 |+ R8 o     if(pWbemServices)pWbemServices->Release();
! ?! j; O6 ^# G; x% J- P! Q8 h, U   }! g1 q2 V( @8 _! V. l! ]
  if(pWbemLocator)pWbemLocator->Release();
8 A# u$ q2 w" A' V& D, B  ?}
, L  E( q% A# f- V9 W4 ]//---------------------------------------------------------------------------
7 x6 ^( d( Z7 D$ T
! P: e$ ]3 t2 x) Y* n) Q  _// 通过 WIN32_bios 获取 BIOS 信息:
0 z* ]8 U: H9 ?2 Z3 hvoid __fastcall TForm1::Button1Click(TObject *Sender)
( x" z  a; Q6 O/ U* H2 y{0 v' ]0 S" H" S, a  O- m* X4 k* @
   Memo1->Lines->Add("================== [WIN32_bios] =================");# T7 f& |% E- O) [( k. h: t( o0 Y
   GetWmiInfo(Memo1->Lines, "WIN32_bios");$ J. Q& I2 a& q' Z
   Memo1->Lines->Add("");
0 \6 W9 X3 [" V6 X}
% O% N& K* [- }$ ~% }* N' @$ f1 k% @+ d# x! w3 \5 I
--------------------------------------------------------------------------------% ^9 R# X# @: t! e1 [
2 ]" W  R3 L7 y4 G
WMI 可以访问的信息类型有:. g4 U/ F& X5 `2 K# L; _
  Win32_1394Controller' G1 h3 O3 G" F& Q# {4 `
  Win32_BaseBoard) g  e: d5 G- q  v1 |
  Win32_Battery3 n! _/ ~! o' ?% Q
  Win32_BIOS3 [  r7 N3 V: C) X- y
  Win32_Bus! Q7 _- I  c0 ?( Z9 w. W; J
  Win32_CacheMemory1 g, s5 \. Y, e: |1 t0 [# \
  Win32_CDROMDrive
$ S6 L4 M8 q% n   Win32_CurrentProbe
5 h! r3 K5 Y/ t! j' n& V3 z   Win32_DesktopMonitor
2 l# _' w) C  Z" X   Win32_DeviceMemoryAddress3 X  z7 d" i% u( f& z0 ]" c# @4 V) v
  Win32_DiskDrive- m# u# C( f# u! t
  Win32_DisplayConfiguration
: ~; H2 z# Z2 [3 Q' M   Win32_DisplayControllerConfiguration
3 Q# h" }$ l4 {+ p- N   Win32_DMAChannel# `6 o* N6 z2 R' q7 z
  Win32_Fan
! ^: S& c6 P2 ?- X2 @, }   Win32_FloppyController
# X9 |7 ?" J- b. @   Win32_FloppyDrive
5 p% W, |7 W1 f+ W" L' e4 E   Win32_HeatPipe
9 S$ K+ w. O' H   Win32_IDEController
9 e& A1 u7 r& z; h* d* f   Win32_InfraredDevice" S! B, l: b* J/ U
  Win32_IRQResource. s6 X; J0 m- u  T
  Win32_Keyboard
- w% W1 w( F' [8 X. c   Win32_MemoryArray( L, w" n, C: W6 d% B0 }
  Win32_MemoryDevice
) o. ^. w' X, e% [# e5 [9 a# q! f   Win32_MotherboardDevice
2 u2 w/ L0 p2 d% A/ z+ T2 W   Win32_NetworkAdapter
. S$ ~5 J# h$ ?3 v   Win32_NetworkAdapterConfiguration
+ v0 u4 V8 I# j6 |+ _# [   Win32_OnBoardDevice
- Y: A, Z# l4 _3 o# o: M! W   Win32_ParallelPort
9 q# x' ~* T7 H7 F0 T   Win32_PCMCIAController
" h- R0 z; W. b& s; R0 A+ \   Win32_PhysicalMemory
& m& C. p0 x& N$ P- l6 ]8 U1 N   Win32_PhysicalMemoryArray6 u6 j9 U$ t; ~, n4 d" J
  Win32_PnPEntity
  L" n  L1 w9 |1 Y8 Z   Win32_PointingDevice
5 R( V, X" N9 K- V   Win32_PortableBattery" t1 A) |$ I- q( P
  Win32_PortConnector
% B5 ?( {& V, d% B2 M2 S2 Y6 q   Win32_PortResource' c9 ]# W6 V2 o; c
  Win32_POTSModem
; U# @, k8 `, g   Win32_PowerManagementEvent; X( x) F& M8 ~2 K
  Win32_Printer4 M& Y. x/ j/ x9 h1 `1 i5 a6 E
  Win32_PrinterConfiguration
+ O( b& z& f* r7 k" f   Win32_PrintJob! M9 S0 d$ Q- j. C2 _% e% }
  Win32_Processor- x& g  ^$ u3 i! ~
  Win32_Refrigeration
/ r9 l1 V7 X  ~7 |8 U   Win32_SerialPort3 r8 U6 ^3 e  N" p: I
  Win32_SerialPortConfiguration
* H1 _( p# Q, ^3 L8 E) ?   Win32_SMBIOSMemory
$ p3 C" f3 u7 o5 X' {8 e, ]# W- f   Win32_SoundDevice3 ^2 x! ?6 J  Z) _# T
  Win32_SystemEnclosure
+ b0 e6 R+ d1 l7 g6 q2 m: c7 x6 o   Win32_SystemMemoryResource( d5 t& h" `2 _5 [5 o) C. D7 O; d
  Win32_SystemSlot
; {5 G6 j6 t& J% u8 ~   Win32_TapeDrive
/ z+ B& Z7 Y1 G   Win32_TemperatureProbe
( z2 T6 `' [+ H/ P* X- q   Win32_UninterruptiblePowerSupply
  G/ O/ L$ g! P4 q! b* A( {   Win32_USBController
9 J7 m8 L( o4 h8 ]   Win32_VideoConfiguration
) {& Q! l% d; j( N7 D9 J0 j   Win32_VideoController
8 k* |6 _  B# o7 r1 E' q' S1 q; t" b   Win32_VoltageProbe( F# {6 f  M1 w/ `
4 H6 s# u' S0 X$ Y: k8 a0 J
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-28 14:21 , Processed in 0.017181 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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