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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)6 n: G' ?$ M/ A
( d! _3 V) N4 e7 U
* n6 j& ]9 W0 m. t( }8 W% c
--------------------------------------------------------------------------------
- t5 E$ L8 {$ wWMI: Windows Management Instrumentation (Windows 管理工具)
; O/ C1 Q2 k6 f4 ]- x   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
7 B# M1 x% L- T- D. V# \   利用这个工具可以管理本地或客户端系统中几乎所有的信息。5 A7 ~1 ?/ Y8 o# b3 }3 }" }; P
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ' t  n  D: q' j. P2 P: Q
. O4 I/ a8 u+ A% Z" i0 C) n
--------------------------------------------------------------------------------- f. {. u9 f9 b
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
, m& O& x) d. ?1 l. o$ q
3 Q5 o" e# _7 ^1 n4 ?6 o--------------------------------------------------------------------------------
* F/ P( @, E8 C/ |  Y3 d① 初始化 COM 接口:8 o; _. ^+ c' E1 B6 e
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
9 n1 M8 B4 K& K" V- B   这两个函数在 #include <comdef.h> 里面定义。3 x0 H4 L4 D& e2 W
; T, m# r% ~9 q: {3 ]9 t
② 获取访问 WMI 权限:
0 D7 l9 E0 ^0 }+ E% W   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
$ R9 i9 }1 @8 D8 U) Q   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
* B! _8 c/ n& A, j* q, g. L. s0 O9 m- I3 H: w5 G0 L
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:, g. V6 \  I  S- V1 n1 N& M
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。+ Q4 ~3 ^( `2 t' f. C; r

" d6 h6 s1 w9 K( v# A( t; bvoid GetWmiInfo(TStrings *lpList, WideString wsClass)9 x3 d" t, p4 u! y0 X! \' k# K
{
* v& h" C1 r+ m  IWbemLocator *pWbemLocator = NULL;# e# I0 ~$ `  ]( a8 j! r& L
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 S, k6 t  n: w! |. L* O5 c6 X   {
$ J& m- K1 n" M$ u9 W! T5 M     IWbemServices *pWbemServices = NULL;; C3 w# T( `' E& r2 m
    WideString wsNamespace = (L"root\\cimv2");
% c7 Y( R# s5 J6 }* S+ P0 K     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)' S; Q- \% U$ N; s: R
     {
0 l7 Z( x1 d! b; r$ Z' i        IEnumWbemClassObject *pEnumClassObject = NULL;
: O' a4 O; Z/ i8 d/ S! `        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
5 @8 I& F# ]+ S, _$ Q* f& x" K; S        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK); D- q+ M9 _- ?! Y, }
        {
5 k4 l0 Y0 o+ C& u7 }' Q7 `& r6 p           IWbemClassObject *pClassObject = NULL;4 L: e- y2 ]$ r2 _9 `, O* f+ o
          ULONG uCount = 1, uReturned;& t$ L4 \0 G  T% z5 {- F) v
          if(pEnumClassObject->Reset() == S_OK)
) ~( W, P' l* Z, c  r" [. R            {" _  b( G# G9 z1 O/ n; c
             int iEnumIdx = 0;
, m/ f5 D7 n& q  q0 D0 x6 w              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
, L. J3 ?) [$ ?  @( X               {6 S+ v$ v$ B1 Z$ D2 M( m' `* ~" f1 f
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");% W" [$ K: h0 k6 J2 \0 A
" |* p" w9 i8 S) y$ X7 q: ?" w
                SAFEARRAY *pvNames = NULL;
1 S. D7 l# W/ W" \' y# N                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK), l4 x) _/ K- x4 F* _$ F, b
                 {
9 h6 {9 F1 v+ C                    long vbl, vbu;7 l6 d# Y! }/ s6 w9 c
                   SafeArrayGetLBound(pvNames, 1, &vbl);, [3 o1 R4 D6 V7 t
                   SafeArrayGetUBound(pvNames, 1, &vbu);
, h; h- ]3 W) }# }  K: h- Q( ^                    for(long idx=vbl; idx<=vbu; idx++)$ K% w; g$ D. O% ], ^; f5 `
                    {4 F8 b/ e+ X. F  Y7 k- z8 F) l6 p/ e
                      long aidx = idx;
8 D  ]  P6 m$ T5 @& |                       wchar_t *wsName = 0;8 t" I3 q3 A) U$ C
                      VARIANT vValue;% z* Q' V9 e# b5 I" v7 Q. `
                      VariantInit(&vValue);# a- O- G5 |1 D' a; H
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
- g* O9 k7 E6 w) S) V* E% F/ K) P
' s# {  y: `# A                       BSTR bs = SysAllocString(wsName);
' i  u$ ~8 J% F  ]! M9 k                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);2 \( r& S- h: p8 L$ l8 P
                      SysFreeString(bs);" u! a5 A5 s4 u+ c8 C) |% r

. q; |, z; ^# [                       if(hRes == S_OK)
; a/ x- w2 Z4 [                        {
* w$ g" N) P/ h& J' \                          AnsiString s;
' q  L* u1 _/ M0 X% m                          Variant v = *(Variant*)&vValue;" G$ f% @1 A) f. B. i9 E! @; F
                         if(v.IsArray())
$ p# c8 I5 v1 p  s# @$ T/ w. H+ R                           {' H' _) f$ |1 u- x2 L6 p* h
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)6 e: r: f9 A) }- x  f- h! V
                             {( n4 Z5 z) K- }" ]* W) A9 M  N
                               Variant a = v.GetElement(i);
: R: M6 ?* i% l% q0 ^: T                                if(!s.IsEmpty())% J/ |* w5 N9 U1 @" n0 c
                                 s+=", ";/ I8 |' W- G, x6 ~7 R/ f% J, R
                               s+=VarToStr(a);$ k5 N3 X5 d* c" _) n) n7 C
                             }3 y* m2 G# `5 ^# g+ r! F$ C0 U* N
                          }
" o# f2 C+ S, D                          else
8 ~/ {6 ]2 T1 z2 y, \                           {. \" h0 b  E1 B7 o
                            s = VarToStr(v);
- K+ x# k2 @( N/ Z                           }
6 F. p( w' M8 T& K: T                          lpList->Add(AnsiString(wsName)+"="+s);
* K: E. |6 Q. A$ J! n  E7 r' w/ y' r                        }
! s. B( H- M  _3 k) \+ W
# D! u& `+ B& l7 h- ~$ T3 i                       VariantClear(&vValue);2 s0 K6 R. O( q
                      SysFreeString(wsName);
& i* K. W1 Z0 F! D) X* k3 Q                     }
2 x8 U, M% \+ F                  }. L9 d0 \& P  c3 e8 ]7 q" j( a
                if(pvNames)SafeArrayDestroy(pvNames);0 s% l9 T6 D7 J
                iEnumIdx++;  B$ d% h; c# E- y7 R) o
              }" p& L$ i: Q# ]8 Z
           }0 j$ l! \4 I' h: S. z9 E1 E
          if(pClassObject)pClassObject->Release();& y& I4 Q( P& d8 p; K5 l0 U3 P
        }
4 t0 |" X/ |6 V  ?$ ^: s% I        if(pEnumClassObject)pEnumClassObject->Release();
0 b5 o) p4 c/ l" b      }" G& P! P5 y9 A, O% s% Z. C9 G5 |% j
    if(pWbemServices)pWbemServices->Release();! c1 V& A7 k& {+ Y
  }
, G8 f9 w+ q2 ?% n4 C  if(pWbemLocator)pWbemLocator->Release();
0 a6 p# }) O% D# B2 J/ l7 Y}% }( }( m9 B) m1 j# w
//---------------------------------------------------------------------------
3 T: p, R1 @* N: e% |: f
* m9 U' G1 C& s# M1 k// 通过 WIN32_bios 获取 BIOS 信息:$ E6 T: i7 _# U! d1 z1 R0 ~
void __fastcall TForm1::Button1Click(TObject *Sender)2 H, T$ H- ^, G# U" l
{6 g, T) b9 c- p# ~. Q2 j
   Memo1->Lines->Add("================== [WIN32_bios] =================");
6 }, z2 Q+ J) W$ v. n    GetWmiInfo(Memo1->Lines, "WIN32_bios");
+ n9 M6 U( v7 `0 x3 H6 g    Memo1->Lines->Add("");1 t! z% w4 y) [7 v* ]- Y
}* q4 a. H1 Z+ }

% ?0 _* c) v% e# X; a3 u' u, n--------------------------------------------------------------------------------8 N. @5 R# I1 P* g) v

, \; }  M5 C; Y, IWMI 可以访问的信息类型有:
8 h8 P' f2 ]8 k6 F, j, F$ y   Win32_1394Controller
) z9 _3 ], }. G% N   Win32_BaseBoard
; f; I. C4 ^+ d% t8 A, ?8 G   Win32_Battery6 Q: i! u8 G  b9 d7 c/ X
  Win32_BIOS$ a+ w' b/ b0 ]) ?. ]3 @  j1 ?0 c
  Win32_Bus
- _6 z" @+ G9 ]   Win32_CacheMemory
" ]3 g! Q5 M) r5 B1 x: H   Win32_CDROMDrive1 i6 Z7 G6 z+ u% U
  Win32_CurrentProbe6 p8 i$ _5 s+ E& v" `
  Win32_DesktopMonitor
! Z8 B! z- O' T1 `. Q, e+ @2 U2 k   Win32_DeviceMemoryAddress
5 K/ i5 I! x$ x2 g  h   Win32_DiskDrive5 X, F4 W/ |9 ]3 @5 k
  Win32_DisplayConfiguration
! m* [: r/ }6 U9 O6 J! h   Win32_DisplayControllerConfiguration6 y0 B3 [1 c& F/ u
  Win32_DMAChannel+ g+ n. O, b  m8 x7 F+ j6 C3 S
  Win32_Fan
2 U9 S- L* e* H& n& B   Win32_FloppyController
2 z+ J2 f' M3 d4 P2 E6 C  g4 t   Win32_FloppyDrive
/ X+ \/ }$ ?8 X2 g/ K   Win32_HeatPipe
; C- t% S2 K0 y) d" ^4 v% N   Win32_IDEController# K% u; i: w" {7 ^$ x+ d
  Win32_InfraredDevice
/ g. p/ o" R3 s% T0 _+ Z$ t   Win32_IRQResource
% l5 Z8 B7 c' |& s) L& H   Win32_Keyboard
4 K* r) `0 E* o   Win32_MemoryArray
9 S, k- H& v) B, s   Win32_MemoryDevice
1 E# X* S# e) u; p7 z   Win32_MotherboardDevice
$ R1 B( x- y4 [$ j# Z   Win32_NetworkAdapter6 b. u* h( C' ~  N, U1 G
  Win32_NetworkAdapterConfiguration
% i- n. t9 t. G$ z& @' o& V   Win32_OnBoardDevice* [. u3 j# u# d+ o& R& e
  Win32_ParallelPort% [" V+ i/ _( |' r
  Win32_PCMCIAController  X* q, a, a1 A/ S5 ?. x
  Win32_PhysicalMemory
$ d- @  F; O5 z* o- p  o1 P' F   Win32_PhysicalMemoryArray
3 o' T. c  t: _, R/ \   Win32_PnPEntity
9 z) h. Z2 C: d& a   Win32_PointingDevice
1 K9 c3 D  K# d  D3 U( v+ C* Q' t   Win32_PortableBattery8 w" z- v8 w* O$ d2 [" S
  Win32_PortConnector
, J6 ^' q& l4 R: o. B5 T. ~   Win32_PortResource, L" W3 N/ I5 e, f: b% d
  Win32_POTSModem
6 P! `, U: F" \) G8 m. j& Q   Win32_PowerManagementEvent1 d6 S/ ^% h" }' ?3 z
  Win32_Printer( _/ R$ t$ k3 n
  Win32_PrinterConfiguration3 v5 h0 u8 Z% h& G2 v2 Y0 L
  Win32_PrintJob
0 ^2 g, P4 X$ P; ~2 D   Win32_Processor+ ^" U6 D5 p; o  u" a1 C" N( z
  Win32_Refrigeration
' S: g, ^3 W$ d- r+ Z   Win32_SerialPort  E8 E2 W) \) C  T; [) E6 N) l
  Win32_SerialPortConfiguration; a3 b* E, Y- H- M
  Win32_SMBIOSMemory
9 C- n. P( x1 E. Q* k   Win32_SoundDevice4 V& j2 c# v& s3 x) l0 `
  Win32_SystemEnclosure' C( S2 I5 e9 x
  Win32_SystemMemoryResource4 j1 k! s8 N7 H2 _! q: i
  Win32_SystemSlot2 |  Z! q3 ~2 B1 w" g" y6 q
  Win32_TapeDrive
- m: W: m" T0 I7 b3 e. [# g$ H   Win32_TemperatureProbe0 C% r' ?( r0 {0 G' Z
  Win32_UninterruptiblePowerSupply+ ~& _1 i6 g& e( J' c0 h- m, p* ]
  Win32_USBController
, d4 f" q, D9 B* b   Win32_VideoConfiguration
# z8 w  D- T# w( y   Win32_VideoController- m$ J8 ?/ G+ P: I
  Win32_VoltageProbe+ t, D) @# e# J- m( v. e3 Z2 s

  Y3 G: B& E5 t# y以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-20 00:40 , Processed in 0.021548 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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