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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
" }2 [% U3 w1 ?; Z! W
' Q2 x4 E7 x$ Y' L# s. b2 Q. G
7 h2 h# v: x8 o/ w1 M7 X--------------------------------------------------------------------------------, t7 f$ Z# H: ?4 w6 ~: Y
WMI: Windows Management Instrumentation (Windows 管理工具)
6 m, j( [8 F9 x! n" _   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
( P) L: S5 L! y1 N' l3 ?5 W   利用这个工具可以管理本地或客户端系统中几乎所有的信息。, ]+ H/ H# G6 U
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 , p; V+ _; ?. g2 j& ?/ b! J
$ [( b* h3 O( L& k. e& x( P
--------------------------------------------------------------------------------
2 M# i7 o$ ]  c0 ]BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面& C5 F' b2 x1 a: Y
  }, Q7 C# ~: k# d/ {4 s2 H) g
--------------------------------------------------------------------------------2 R3 W4 h' `6 N7 o: m2 J
① 初始化 COM 接口:
7 v9 k7 V" V" D* q% ?   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
3 ~" _$ p/ k$ T. I# _  r& U   这两个函数在 #include <comdef.h> 里面定义。
) d" ^6 H; A1 z% {: a5 U! ?% |, @+ a& I& i9 ^
② 获取访问 WMI 权限:
' K: }& y; Q+ ?   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
, C+ q4 A" B5 I; ~% @   如果这个函数返回 S_OK 获取权限成功, 否则为失败。$ L, A1 e3 E5 u( I+ k

8 c  c5 \4 v! `9 B3 C; z# w③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:: |/ I$ d5 v$ j7 |7 X2 i- K
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。' z5 m2 d) z) g

, [8 n( w, Y8 i- J7 m7 C3 v+ dvoid GetWmiInfo(TStrings *lpList, WideString wsClass)  f' j0 @5 L$ \: K/ s3 J) p" u  [
{
8 {3 X# s2 ^' ]: F* W- V' D  IWbemLocator *pWbemLocator = NULL;
8 h0 e! w% H5 Q: s  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
" N* ]5 ]( {; X& P/ i% W) ?, X# o   {& ?9 `  T( i; k3 a* e3 X
    IWbemServices *pWbemServices = NULL;
2 `" N0 k+ K& S     WideString wsNamespace = (L"root\\cimv2");, G, U- t3 N* p7 h1 P* E
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK): b6 z# I+ V! u; v, r: O
     {
2 \; ~, E" g, B  k% q        IEnumWbemClassObject *pEnumClassObject = NULL;4 ~8 [  V& J2 Y2 Z/ {8 [4 \/ Y+ x
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;* Y! `  m& O9 g. t
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)( G( H: ~  M( ^& E' ^
        {, Y& m- h9 e& L, E& V' x5 B8 d5 w& e
          IWbemClassObject *pClassObject = NULL;
& [! {2 V& x0 n* j' ?, s/ r           ULONG uCount = 1, uReturned;
- T# @4 |# i# _3 f           if(pEnumClassObject->Reset() == S_OK)
. g$ {- X; o8 g1 j5 v! n3 ?" v            {
1 ]5 Y1 p. G, A, a. ~- R5 g              int iEnumIdx = 0;2 J) L: C; X; q( |# _: R! ?
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
% }% E" b8 s& g5 x* j; u               {$ _5 `! [% \  [2 n
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
. f* }8 m% Q( F
. ~( a) U$ T4 f4 _+ R! H) m                 SAFEARRAY *pvNames = NULL;
3 ~, a$ Z! p# U6 ]: V1 w. r# u                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
1 y7 B2 c. j1 V5 a* S                  {' U' Y/ k2 F/ L4 w: Z/ h2 x
                   long vbl, vbu;
" @3 u6 Q% F* ]* N& k+ V: T                    SafeArrayGetLBound(pvNames, 1, &vbl);
% Z1 ^/ k/ I7 L" {) ?: a                    SafeArrayGetUBound(pvNames, 1, &vbu);6 J/ x/ s/ S0 o0 q1 T
                   for(long idx=vbl; idx<=vbu; idx++)
2 D4 U* n  G4 J+ j3 i                     {
' C/ D8 G7 I  c) i1 m3 C% `                       long aidx = idx;/ ?- W3 ~* B% `& W( m
                      wchar_t *wsName = 0;
3 F1 L) {/ D/ D& {. V0 ?                       VARIANT vValue;
: Z  d- h) t$ s4 z$ {  s% w1 k                       VariantInit(&vValue);
0 o% j; Y& Y$ x5 F! h4 c                       SafeArrayGetElement(pvNames, &aidx, &wsName);
: _. H  M; \- U" g) W  Z+ S$ o" Y& y: d7 q/ ]
                      BSTR bs = SysAllocString(wsName);! O/ s% G# t  q# l
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
  E- v/ u* Q" `3 j* d                       SysFreeString(bs);
' U" X2 _" P" @& W5 R
# U6 _# B/ Y' X) I# q8 ]5 p                       if(hRes == S_OK)
1 k" U5 _* y6 |/ @: U1 g% T# i$ F; K4 \                        {3 N2 v* r) }% }. X5 p; m' d
                         AnsiString s;0 v0 ]% ~5 @4 O; P9 Z8 w
                         Variant v = *(Variant*)&vValue;& `5 L: O0 U! E: D: Q, ^# _
                         if(v.IsArray())
# J. W' C/ T8 ^* h% Q6 U                           {
, X) Q# B& l  |  Y                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)! G* h! P& l& e/ [
                             {) D2 r5 I  l: P! T3 C; ?1 B0 w
                               Variant a = v.GetElement(i);
! h+ C9 w7 z2 R( H6 V3 j                                if(!s.IsEmpty())' k& m7 f1 _& Y8 f: E% a
                                 s+=", ";
6 a- m+ a& |  O                                s+=VarToStr(a);) i; ?7 ?; `/ Y: F. S
                             }; H7 ]/ [9 p* N! f- Z" h* d: A
                          }
  f; E( ~" z4 z                          else
7 v- l& I% l) J! r5 g" R4 f                           {
- H$ m& h( h5 n% ^                             s = VarToStr(v);
5 f4 W4 D" P2 N- y' J4 l                           }* |/ w4 r& W4 g/ K) P/ ?& A( h
                         lpList->Add(AnsiString(wsName)+"="+s);
) I& l. \$ X1 k, }( ]                        }& C9 `0 x" E: W$ p

: ], U0 x0 {) g5 j2 d8 {                       VariantClear(&vValue);
- [8 h9 c3 s6 s! d, G9 C                       SysFreeString(wsName);# t3 b& X; @2 ]8 T6 R4 I) Y
                    }
6 T1 r! ]/ K+ t. \9 k2 a+ H  O                  }1 L5 S; K& a* u, G: q) @/ `
                if(pvNames)SafeArrayDestroy(pvNames);0 \9 U% {. C9 Y" A
                iEnumIdx++;
" g& s) z0 `% |0 r0 c               }
" F1 D1 P$ r  I( I7 E            }
  D' s! {: v" C" g* W3 p# s! O           if(pClassObject)pClassObject->Release();
: y& u) v6 g) p- O5 |: v' B         }
3 y: k3 a: G: H8 }1 c% W        if(pEnumClassObject)pEnumClassObject->Release();
* }, M; N0 S6 H* F      }
! T, ^, \1 J4 d* s     if(pWbemServices)pWbemServices->Release();
; y' _. f% g/ _+ w   }
5 C6 |. ?6 S0 _( k! K5 c+ H3 Q  if(pWbemLocator)pWbemLocator->Release();5 m1 _9 W! A/ I2 A! |( R& M
}1 B" z1 d7 D: H1 h; q
//---------------------------------------------------------------------------
. k9 L- F# {; \6 h! m2 G
  K+ [$ S# b0 o0 d// 通过 WIN32_bios 获取 BIOS 信息:5 I4 i8 @& _" K+ }5 X# |) r
void __fastcall TForm1::Button1Click(TObject *Sender)0 r( `+ \+ g1 S6 |
{
4 [" |. A+ h/ @7 N: `    Memo1->Lines->Add("================== [WIN32_bios] =================");
4 M' ]+ e  _1 S4 t; W% n    GetWmiInfo(Memo1->Lines, "WIN32_bios");
" p; g9 H  f: Y+ p2 z! J2 a    Memo1->Lines->Add("");" h9 n! P& z  y* I9 Y7 ^
}
- i7 Q9 Q  e2 R. l( T# X1 x3 F" T1 n$ u+ U$ z0 f4 U6 a7 l
--------------------------------------------------------------------------------
- ~; d  X( m/ a( T; m8 O1 W! f! k% L$ @, L
WMI 可以访问的信息类型有:6 R( [3 ]' R) i5 h9 s  r
  Win32_1394Controller4 N) ?+ S2 C' q* j
  Win32_BaseBoard; E3 Y* a# J7 a( f# b
  Win32_Battery' n/ {( Z( N' a3 x
  Win32_BIOS
' ~  k7 U  y$ n  z, d. d- {( m   Win32_Bus
1 M) y3 [0 ?1 e: W# h   Win32_CacheMemory
9 U6 J: O& b: l$ S) ]1 x5 {( E   Win32_CDROMDrive
2 y7 @! {& _9 N, o0 E' G   Win32_CurrentProbe# ?1 b, s# Y7 y0 O3 z- Z4 w  r
  Win32_DesktopMonitor' s* |: A, D0 ]2 d' X0 Q& p
  Win32_DeviceMemoryAddress) v- D# i4 H7 \5 A/ d( H
  Win32_DiskDrive# g' j# v, Z( ~3 W+ f4 h. ~, X
  Win32_DisplayConfiguration
9 K. W$ i9 L* I( Z% v' x: l   Win32_DisplayControllerConfiguration# g5 |9 |9 z# Q; q1 @- x# v
  Win32_DMAChannel
7 L/ K# s* q2 U8 Y9 v   Win32_Fan
; K; `2 T5 Y% E   Win32_FloppyController# z, p7 r1 p9 X4 p
  Win32_FloppyDrive
$ c0 l1 w1 p5 v& y   Win32_HeatPipe
6 o- S2 b( `! E$ k/ F   Win32_IDEController
9 H( q/ X+ p* G* |6 m& |. y   Win32_InfraredDevice
- {3 B9 L! ]2 C# _+ ~, ~( M   Win32_IRQResource
. o! L+ E, r: a- c1 ^1 i8 ~   Win32_Keyboard
- ~' }, v0 R- p0 J! K   Win32_MemoryArray
3 s" h1 S% E2 L   Win32_MemoryDevice4 t6 p) M8 e3 |! a, G
  Win32_MotherboardDevice
3 w7 x0 D- X: O9 K; _# \5 c2 G+ m   Win32_NetworkAdapter
$ s# B+ E; R7 Z$ Y4 s% H   Win32_NetworkAdapterConfiguration9 e- d9 @& u# B+ n: ~+ T4 F+ v' Z2 j* w
  Win32_OnBoardDevice2 I0 }6 G6 m5 R/ F
  Win32_ParallelPort
2 A7 m4 ~  W- t, L( E   Win32_PCMCIAController2 q7 p$ ~1 a# H; F2 e
  Win32_PhysicalMemory( u: n& q4 X# x. d. B
  Win32_PhysicalMemoryArray7 k+ O% J0 Q" F* [" h( u
  Win32_PnPEntity
  r: u9 n% n8 |4 h9 t7 i7 F   Win32_PointingDevice+ U( ^$ F6 M& \% @
  Win32_PortableBattery( J- A* v' n2 r! c: |
  Win32_PortConnector  Z* k1 M6 C# A8 M! T4 S
  Win32_PortResource
' _9 W( ~2 C0 E# r   Win32_POTSModem
& F: V' a9 H( z$ `( D2 u   Win32_PowerManagementEvent1 a& G8 q0 ?  p
  Win32_Printer
; M+ u0 E& [) z0 v& l' \9 E   Win32_PrinterConfiguration3 G9 Y- P! z4 I  U: t0 j1 z
  Win32_PrintJob
5 D  m% q6 v: E   Win32_Processor. M( m8 O& |+ L
  Win32_Refrigeration
4 a9 K4 e3 g/ L   Win32_SerialPort3 |3 T+ M6 J; P0 f7 j; W
  Win32_SerialPortConfiguration
5 E8 ^% h( T/ u6 O; K' i! H   Win32_SMBIOSMemory" v6 J- F0 q, r0 p4 k
  Win32_SoundDevice+ p) P8 v% z6 ?6 T7 }2 w
  Win32_SystemEnclosure9 J& o- ]. J( i1 ^2 Y* L$ P
  Win32_SystemMemoryResource, r# e+ h! A+ G  s4 h; x
  Win32_SystemSlot2 x. J7 W3 G) Z% a) K  H+ j
  Win32_TapeDrive) t" Q4 J0 y( `# ?; P2 T8 |2 y
  Win32_TemperatureProbe
. i4 z# X$ y% C( B# p5 Q: w   Win32_UninterruptiblePowerSupply
; S5 _* T& j! ?  Z% T% n   Win32_USBController
7 D* ]. p- I8 N( G6 C& E' |   Win32_VideoConfiguration+ S1 [5 Y: h- v# }) T% `* ]% Z
  Win32_VideoController2 n, U" S! }& \' C
  Win32_VoltageProbe% w( r, ?# r6 ]: _. \" S
" @) X, i8 w4 r: u8 ~3 ~
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-14 13:46 , Processed in 0.021065 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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