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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
" O4 d9 u: |$ F$ t* l9 T+ s% e- [( s5 H
9 ~7 v/ O7 E6 G' @
--------------------------------------------------------------------------------
' F3 R* x% d. P6 X" H: T. jWMI: Windows Management Instrumentation (Windows 管理工具)
) O" \8 X. u% ^3 Q. M+ L0 B   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 5 U# z: t" g! Q* M2 C( p
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
6 Q' l4 J+ ?7 ]8 T8 A$ V3 O$ X- I   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 6 u+ p" y' P( F4 b

( T' f" W% k4 [  E& n0 G--------------------------------------------------------------------------------* S  l# `/ B6 r% c
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面/ j% E$ r4 w5 T/ p3 w
$ f! W/ s( _; _  `9 @
--------------------------------------------------------------------------------- r! s$ n( Y/ P: h2 k5 i
① 初始化 COM 接口:+ T6 t4 }& u$ z8 C8 F' \  \5 a. }
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
: X5 K4 J" Z* p' O% q   这两个函数在 #include <comdef.h> 里面定义。2 K4 }& q' q: T! i  J( M: O1 Q8 S3 q
# u9 _7 c/ E( p2 q. ~) m% F& w! k
② 获取访问 WMI 权限:
7 T% b$ L; I5 s% X. D: t2 k0 e   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
7 V: B: R4 }1 }4 `0 R( A   如果这个函数返回 S_OK 获取权限成功, 否则为失败。/ e8 {; T+ y# P) M) j  z$ J* A
4 l' i4 P) f) D4 s
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
6 E/ K4 I9 z5 i% o- P   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
" v! [. x2 X; F# P
+ d$ a6 X6 O4 q7 f: p6 cvoid GetWmiInfo(TStrings *lpList, WideString wsClass)' J  ]/ K2 H4 s" C
{; @1 y/ @+ \9 W: J) \4 H: i2 l" g( i
  IWbemLocator *pWbemLocator = NULL;$ u+ z. |' ]. W* \3 o' {2 _8 i
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)$ _5 `2 Q  P5 E& p+ `7 z; y
  {
2 E9 k' Z! V  y& G: X# f     IWbemServices *pWbemServices = NULL;8 s/ m: r& N: m( V
    WideString wsNamespace = (L"root\\cimv2");
, ?# X  R: s* o! F5 Z: D9 _! f/ j     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
$ I1 n  |, e; k" k- r5 j  [      {
) T! y5 w+ `5 ]; C        IEnumWbemClassObject *pEnumClassObject = NULL;
" J# s/ C! h, F4 ^- G- ?        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
4 F. @6 \# x( {: y        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
2 ]( E4 P& P/ V. [' F         {
- ~& X4 D  f8 i' {4 x9 s3 d% A, `           IWbemClassObject *pClassObject = NULL;3 N/ R: }, p) u! d4 L1 Y" N% X
          ULONG uCount = 1, uReturned;, }. ~! s" t) e" t- ~+ w
          if(pEnumClassObject->Reset() == S_OK)
$ v& j9 G% T; q            {/ x8 c' o9 e- F$ Q* f" a% f4 Y
             int iEnumIdx = 0;. K+ C+ W- S8 Y8 D, x& |. K
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
! p0 k6 x7 q9 }0 B5 E2 S               {) o6 M( y* K2 }' U# c# b2 u
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");& A+ r* k1 X: u

, n! J/ b7 X2 ?5 e                 SAFEARRAY *pvNames = NULL;9 }: }5 h# _* o( u
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
" x! W' }# [7 V9 R  c                  {+ ~( [$ y6 j4 M: f' t# H
                   long vbl, vbu;, j+ h( r8 j* S
                   SafeArrayGetLBound(pvNames, 1, &vbl);
* U* n3 t$ j; `& y. m9 h, Q                    SafeArrayGetUBound(pvNames, 1, &vbu);
6 r% q' Z$ G3 g2 C                    for(long idx=vbl; idx<=vbu; idx++)
* f1 u3 L: C, w                     {
5 S7 o! E$ O) e' e                       long aidx = idx;& Z% X* x7 @3 q- c
                      wchar_t *wsName = 0;) n8 M6 }( T. X
                      VARIANT vValue;
4 v) [% d" i$ I, V: J' X5 \7 t+ {7 Z( F                       VariantInit(&vValue);3 e& G' H1 C# z- T' @8 H
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
% B6 b0 q9 j  J9 @  q" _: Q7 G- t
* p& [* l9 {, g! H  o: Y                       BSTR bs = SysAllocString(wsName);
5 G4 c. u+ u) c# x, S. i' w8 Q                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
6 S) _8 o+ T* E3 f+ c) f7 s2 [                       SysFreeString(bs);
9 l7 L' K- t+ i) G" P# I4 x
! T' W/ J& r' ]                       if(hRes == S_OK)
. u+ W5 U8 S- k1 e                        {
& i" e' N- t, O0 z  Y                          AnsiString s;2 q( w) w1 L" Q* U( Q3 G5 K
                         Variant v = *(Variant*)&vValue;% e3 _  q& S; d! G% a+ A  g  |
                         if(v.IsArray()). L; _4 G/ Y! |; m6 i
                          {3 O' H+ d/ c6 ^) Z
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
# m8 j& [1 H7 b                              {- J- L& z/ ]  Z2 V* Z
                               Variant a = v.GetElement(i);4 v3 u  p0 R7 H) X! q1 ?' b  ]8 g
                               if(!s.IsEmpty())
2 u2 e/ W0 _, t' d. |+ W                                  s+=", ";
8 T) P1 A$ B  {: K5 X; K                                s+=VarToStr(a);5 P- j% O0 X5 T
                             }
. D  }" |% G+ _: |, P                           }
% B+ A$ _* M" V( A- ^                          else
: ^! w: B* R: u6 x5 D                           {8 T) a! Q5 |+ E0 O
                            s = VarToStr(v);
+ p4 I5 J. B8 c) @' J3 D                           }3 ~, R* w% {4 b" I
                         lpList->Add(AnsiString(wsName)+"="+s);. C* [" F4 R9 V; n
                       }) k0 t4 I$ R4 z0 C* y9 q
- R" y* o0 ]  W7 x2 s. |. `8 I9 [' L
                      VariantClear(&vValue);
3 H! A# l+ d7 o1 T# U                       SysFreeString(wsName);
+ c" m: o+ D/ L: k                     }+ W  F- f% w' E$ i- h/ v' R
                 }/ w3 N. ]) O. b) C1 b
                if(pvNames)SafeArrayDestroy(pvNames);
+ F: M$ U" S  J, E5 Z* ]                 iEnumIdx++;0 Y/ _( E7 q. y/ v
              }6 H: P% g  N" p  x9 P5 I0 n0 g% A
           }7 T! i" g" P' V& O
          if(pClassObject)pClassObject->Release();
3 Q. K6 f5 h2 Z# S# g# F9 A7 K1 F         }4 O: M# \' E/ E3 Y, j
       if(pEnumClassObject)pEnumClassObject->Release();; q* `/ @. S' s0 M& f: A# r
     }+ h; K- R4 G0 A: v
    if(pWbemServices)pWbemServices->Release();8 {" O8 f% {8 Y9 {$ A% Q! @# O
  }
" o- P0 Z6 M* ^) x5 [5 s- q  if(pWbemLocator)pWbemLocator->Release();. ?( |0 {1 c: P% ^7 E
}
( \0 L# @  ~9 j//---------------------------------------------------------------------------
8 h2 f: A9 i" u7 [- ~$ _
% Y3 g, y. G5 h5 T) M* O// 通过 WIN32_bios 获取 BIOS 信息:
) e4 G9 k2 H% X( \9 Y& y. Avoid __fastcall TForm1::Button1Click(TObject *Sender)3 x+ k9 _2 m( d" b( n3 Z. y5 h4 y
{) q7 z+ L4 Q# D4 s
   Memo1->Lines->Add("================== [WIN32_bios] =================");! s; [: p: j/ ?& ?
   GetWmiInfo(Memo1->Lines, "WIN32_bios");- W  {8 `) q3 y2 C6 E: }
   Memo1->Lines->Add("");
& D) J3 ?- O: D$ J}! @- U$ g  p  s7 W7 X: u3 l3 E
' x5 M* y7 V2 d) `& r
--------------------------------------------------------------------------------3 q  n' u6 g* y2 X; S* ?4 G7 J
' g# ]) M; a- h7 V
WMI 可以访问的信息类型有:7 H- \: \* p% B
  Win32_1394Controller1 @! F2 b, i) Q6 s4 ?! S$ Q
  Win32_BaseBoard
+ K( O" x& e  z8 |9 u  N: z   Win32_Battery
5 U* A% ~% ]) M- A$ z- Q$ q   Win32_BIOS  O& @2 d# c4 h- _% c
  Win32_Bus' p: p1 A, @& g; G6 N' v7 n
  Win32_CacheMemory5 V/ b( G. d# C9 F+ O
  Win32_CDROMDrive
8 ^* W" f- z; z) s: n   Win32_CurrentProbe
+ R# ~9 t( ~3 j5 g' z+ y   Win32_DesktopMonitor% M2 w0 A$ u+ r! A# N& C
  Win32_DeviceMemoryAddress, P8 t$ U' I( G' X! O
  Win32_DiskDrive1 S. r/ G9 S8 s0 S/ t) y) x# B
  Win32_DisplayConfiguration: o/ o4 K5 ?9 D, d
  Win32_DisplayControllerConfiguration1 V& z) O5 Z3 Q: s, G5 r
  Win32_DMAChannel
, t5 G$ c1 [* }  T   Win32_Fan; ?/ X/ h3 @. T
  Win32_FloppyController
, O: _: V7 r# \4 X   Win32_FloppyDrive, J' N9 r* s- U% ^
  Win32_HeatPipe
+ G% A4 x) e8 @( D   Win32_IDEController
) ?7 u( v- j6 ~7 S   Win32_InfraredDevice
0 [5 x" O4 @, c" A. {7 l   Win32_IRQResource& L) c% q& p0 o# W# Y
  Win32_Keyboard4 z6 v* b" y- Z9 ], v
  Win32_MemoryArray0 e6 j7 N) g) ~7 c
  Win32_MemoryDevice2 v% y: G; T" H5 [: ]! k0 y
  Win32_MotherboardDevice
  i7 ~9 M' a% d) c2 G6 e1 ~2 K   Win32_NetworkAdapter
  q- ]1 T- @+ a2 ]  W0 w4 m   Win32_NetworkAdapterConfiguration% W5 f1 h5 [( e3 y8 m6 |% Y
  Win32_OnBoardDevice2 _$ h6 y9 x6 w7 @. I
  Win32_ParallelPort
: E6 {/ W1 Z3 A  `$ Z8 [! `- k   Win32_PCMCIAController
7 J, E6 K, _" d$ [   Win32_PhysicalMemory
% z) T) s4 r% s   Win32_PhysicalMemoryArray' B  |: }1 n. {8 D4 k1 c# }
  Win32_PnPEntity
7 d) B7 r1 w1 e2 b  ~   Win32_PointingDevice& L- J$ _4 _" w6 K
  Win32_PortableBattery
# K$ Q6 q3 c' `8 H' B" L   Win32_PortConnector9 }  O) R( z* a1 m4 v6 L+ M
  Win32_PortResource
, |, J) @$ F1 f7 k' @& N5 [; G   Win32_POTSModem
0 [! t+ J+ t9 O. H   Win32_PowerManagementEvent+ \7 O- o" E2 [# t" |8 M4 e
  Win32_Printer
- b; b- O2 @9 a. o) k/ \: Q   Win32_PrinterConfiguration) [% A- P) {4 u  E
  Win32_PrintJob8 A$ O" N4 H5 t5 y1 q8 b: X" p
  Win32_Processor
7 x  |* w4 o4 C  L   Win32_Refrigeration. w  p5 W' h5 K- g+ j
  Win32_SerialPort
& L6 C7 d1 A( E: E3 j0 v   Win32_SerialPortConfiguration
( r. N  o- `* h* r   Win32_SMBIOSMemory3 b7 t& G7 z: D$ R! K
  Win32_SoundDevice3 ^' e; X& H% |  j- x  i
  Win32_SystemEnclosure, L5 Y7 y9 g( A) D' @9 O9 L: J$ p; G& T
  Win32_SystemMemoryResource  c* L9 p) U) f' I" ?7 u
  Win32_SystemSlot" D$ [5 B; m. w0 ]' }3 H" T
  Win32_TapeDrive$ L5 F! N/ m6 Q) F& F
  Win32_TemperatureProbe
, `7 X% B; L0 R8 `/ V5 n! Z   Win32_UninterruptiblePowerSupply
5 _, V" U" Q9 Z! Z5 I% ~1 c' m1 K9 x) X   Win32_USBController
7 Q" ~9 T- |" w$ f; S   Win32_VideoConfiguration/ J( x5 R: M0 \
  Win32_VideoController. q2 C! ^, ^1 b) _" O' t& D  u
  Win32_VoltageProbe: F4 D4 }  P: y8 e6 {
# l1 K9 h- [9 N$ A9 W+ S3 K2 J1 w* B
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:22 , Processed in 0.018930 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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