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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)+ q1 w7 e7 d3 s" Y  l
1 J7 c4 h0 H4 N7 `1 X( T
, ^' f$ d1 u9 r  `
--------------------------------------------------------------------------------6 @7 d1 U4 @& a3 j" Z* p
WMI: Windows Management Instrumentation (Windows 管理工具)
0 ~8 b5 R" v" d1 e6 M   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
8 z, _" L( Z- P$ A: W% b8 x5 U   利用这个工具可以管理本地或客户端系统中几乎所有的信息。! j5 P2 |; E5 D5 i
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 . e9 g5 J, o1 e
8 A+ U& f& r! {* w$ |9 T' Y4 B
--------------------------------------------------------------------------------
  @; z; B8 K, Q$ a, ]! g5 BBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面0 ]1 f+ {" |( U# k3 w
) o* \' H6 `' I0 |
--------------------------------------------------------------------------------
5 H0 e- ~4 E5 o6 M+ N① 初始化 COM 接口:
. `2 o! ~/ O8 k$ h! ^   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。: F0 r/ D8 b% t  b2 f
  这两个函数在 #include <comdef.h> 里面定义。6 G3 a, W3 c" a

( H8 [: T: h: g( W$ Q  F  G  v② 获取访问 WMI 权限:" B2 ?7 O0 o# v9 n) e3 D* v' e0 c. W
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);' N- m6 G7 C* v  R) G" @2 D
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
: |1 s% |7 c& a2 i9 {" _2 a8 H. c% ?. w
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
# U# \- T. V1 X$ b   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
2 ^4 S! L. i1 p/ L( B2 @: q6 i+ F8 z+ G* @( c
void GetWmiInfo(TStrings *lpList, WideString wsClass)
$ m6 v8 v1 M# F5 p{' _/ w/ B: M+ p+ [9 `- V; V
  IWbemLocator *pWbemLocator = NULL;: E1 @$ q, A- _6 K/ u5 a' e
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)4 l6 w* _. n+ V8 i% [! {) r8 P
  {
$ x& ~! H' f/ c! S0 t( A, Z5 k     IWbemServices *pWbemServices = NULL;
; k9 r% `9 ^3 O* h# B0 o0 j3 Q     WideString wsNamespace = (L"root\\cimv2");" V/ |4 E0 h; `2 w# a0 U
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)$ F4 J, A1 {7 l. K- U, g9 B
     {7 x2 d- H' D1 \0 a
       IEnumWbemClassObject *pEnumClassObject = NULL;( j# T; p5 k, H5 N
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;% B: U9 x* ^0 z/ x) O( q/ F( d/ W2 v
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
2 ?8 _# t' I$ Y0 ^& N# d         {
% X- O7 y) n  y           IWbemClassObject *pClassObject = NULL;
4 f. v/ W/ j$ M8 X           ULONG uCount = 1, uReturned;- I( W, T% g4 [3 g2 S& j$ _. w
          if(pEnumClassObject->Reset() == S_OK)
. Z2 V. K" {# i+ c            {
6 A7 P% R$ c2 M- g  Z6 y; J& t" ~6 Y              int iEnumIdx = 0;7 E2 O  @' o; H. b# ^" x7 S
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)& K6 o: C% Y: {4 A
              {
* M* F$ d# V" F- o3 s                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
0 `2 f$ r7 r+ d0 \! x$ W! \, `. B( |8 y: c5 Z
                SAFEARRAY *pvNames = NULL;
. i0 g! N& p& y% {2 E                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)2 p& c# R* |5 d( _6 v6 G: Y
                 {/ I1 N6 E: S, T) n7 D( d- Z& P
                   long vbl, vbu;
5 g& w. @6 P( h+ L# f# t3 |# L; p                    SafeArrayGetLBound(pvNames, 1, &vbl);
% ~; s+ z* p0 u% e9 F1 A                    SafeArrayGetUBound(pvNames, 1, &vbu);: s$ q& }+ T- Y! G. m7 E0 D
                   for(long idx=vbl; idx<=vbu; idx++)
: |3 I! _9 y4 B2 N7 r0 ?                     {
5 E( D/ T& ]; S" u                       long aidx = idx;3 v* b9 U2 T6 \- H/ v2 O! z7 ?7 c
                      wchar_t *wsName = 0;
+ u* z/ z/ T/ x& a3 ^; b0 H                       VARIANT vValue;
, s, c. C* e( K. L! V  {                       VariantInit(&vValue);
& N% A( n. B8 u                       SafeArrayGetElement(pvNames, &aidx, &wsName);& a" a6 z" l5 e& \4 W

( {0 g0 S) ?, B; x+ \2 P  L                       BSTR bs = SysAllocString(wsName);
4 t+ m" }, K' u0 D  e3 G                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);7 b; z, ^$ _6 A3 E* U
                      SysFreeString(bs);  `5 d- P$ |6 q

$ Y8 X  r7 c1 Q                       if(hRes == S_OK)
7 o, K0 N3 @4 m/ v* k( s                        {) l7 l5 ]% Q9 u3 ~# o
                         AnsiString s;- g) Z, c& S- h# T
                         Variant v = *(Variant*)&vValue;! @+ V1 I6 G" Q5 X% g
                         if(v.IsArray())8 T8 v8 i* `: f
                          {( i, S8 ^* O. I# ]
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
; `8 u5 l7 {1 j( K; N- H2 d                              {
+ y" D7 b& q7 ^& r                                Variant a = v.GetElement(i);
% U: T9 `" R7 C+ F- U                                if(!s.IsEmpty()). Q* G$ X, k7 W6 ^6 {" @
                                 s+=", ";
/ P$ e/ U5 {, ~+ B) c( g  ~2 R                                s+=VarToStr(a);
  E2 Q; M" F0 `                              }* Q) [" N: j8 V) k
                          }. S! X1 Q- v6 g, K# Q
                         else
& j# U3 e6 T% m; j4 p" Q                           {
+ v" N" D# f# U                             s = VarToStr(v);
" b- Z& I" @" A4 n5 Y: ^/ C2 R                           }1 T0 I$ a6 y( `) `0 h, R7 p
                         lpList->Add(AnsiString(wsName)+"="+s);% a8 Q' L. S& `, {  W: ^% t9 k
                       }
! W6 O8 B. L: k0 ]: P, ^- u
' I5 H7 Q# V: B' C% @5 F                       VariantClear(&vValue);, N; I; ]# d4 |  p9 t! `+ l
                      SysFreeString(wsName);! N0 s8 S7 k& C% z# V( c# C0 Y
                    }# l% m6 @! K) C
                 }0 ]: k* C! I& k, {, c' B. P
                if(pvNames)SafeArrayDestroy(pvNames);1 s  Y% o" R, s
                iEnumIdx++;
" G5 ~9 I% c" h3 {6 K1 B0 t. J: L8 x               }- h$ v- o1 V- \$ y
           }# l# Z" S- }8 ^' `
          if(pClassObject)pClassObject->Release();
) j# H- g7 Q8 b; h         }
1 Z0 d) l1 [$ L: I0 Q        if(pEnumClassObject)pEnumClassObject->Release();
3 _5 z( q4 u9 |. Y2 G* w0 `      }
' Z1 C  N8 L. a/ o     if(pWbemServices)pWbemServices->Release();
! I$ G  Y% E# B, a   }
/ u: ?' {. I0 B  if(pWbemLocator)pWbemLocator->Release();5 Y8 j3 A; A' v; n
}
+ _% q' W7 k' ]0 X2 g//---------------------------------------------------------------------------
) J% m' x0 f2 x; W$ k, y, I: i0 T# d1 X1 p) u9 y
// 通过 WIN32_bios 获取 BIOS 信息:
) d& @/ f5 N. C* [5 E# Vvoid __fastcall TForm1::Button1Click(TObject *Sender)* P3 z7 f' l. }& m
{
% ^( b! t  s( n: I& \    Memo1->Lines->Add("================== [WIN32_bios] =================");
, [) d. Q: ?  t1 a# {    GetWmiInfo(Memo1->Lines, "WIN32_bios");
- H% l7 N- y* R" K: t    Memo1->Lines->Add("");; ]2 n$ T; z2 B' E& C; A+ z
}" f/ G: g- P4 _( h8 z( h
- ^) H" }# y/ J+ o7 N( @( \5 T) h
--------------------------------------------------------------------------------
+ B6 |6 V# l) @0 [) K: _+ b& {7 R, l- c0 Y" U
WMI 可以访问的信息类型有:4 I" J) Q; p! g
  Win32_1394Controller4 _4 r8 f% `7 J- [& i5 S
  Win32_BaseBoard
; w8 Y: K% d$ A9 o- i. {: B   Win32_Battery
7 k' v6 s: m4 ?   Win32_BIOS
' V# K6 c! e1 G0 H# Y  s9 q   Win32_Bus
8 O9 S: G2 a/ l+ [   Win32_CacheMemory
2 p" S4 J5 M& D, j0 n( @   Win32_CDROMDrive+ D# B  [0 g; I: u3 Q9 P
  Win32_CurrentProbe
" T2 e( F5 y& p6 z   Win32_DesktopMonitor
" M' T3 t6 T$ ?2 B0 O   Win32_DeviceMemoryAddress
" U* i( |% [9 c2 h7 O   Win32_DiskDrive
! Z* w3 h) Q% b. i3 T, h   Win32_DisplayConfiguration, i% {# E5 {  o# a; {
  Win32_DisplayControllerConfiguration
% q, O% F+ H; p; o- }. t   Win32_DMAChannel
8 ]# |3 d" h, T* \8 p- P& S* m- c   Win32_Fan( m9 w3 l' u7 k% ^7 C# S* M
  Win32_FloppyController
' F9 H( M$ H! B0 v- E1 a) |) H   Win32_FloppyDrive5 ~" e( Z* U5 y/ Y. c, j
  Win32_HeatPipe
" e; G6 K5 e& l   Win32_IDEController4 h! |7 b0 w" |3 A
  Win32_InfraredDevice
* A8 s/ P- g) Z- X- E   Win32_IRQResource
$ ]+ F  a$ b" p- G* s8 j  {   Win32_Keyboard
$ F" k# k5 s: Q7 V   Win32_MemoryArray
5 ]2 o. }. z% X4 V3 C* k- ^   Win32_MemoryDevice
& t8 P- Y& C# L: b$ g   Win32_MotherboardDevice$ a( B% H7 _7 t/ o! B$ A6 r
  Win32_NetworkAdapter
* a; |9 n5 K6 S) Q* [2 D   Win32_NetworkAdapterConfiguration% M) O: Q, `* n7 S
  Win32_OnBoardDevice
- q$ z' q8 P, i  a' W   Win32_ParallelPort
1 d4 ?( M$ _& u; C   Win32_PCMCIAController
6 T) S2 Y: r, B& B   Win32_PhysicalMemory+ R; F! R2 O1 n: I& N4 i0 h: V
  Win32_PhysicalMemoryArray. W3 y( j' Z* h0 @, P
  Win32_PnPEntity) B: B3 f7 [  u
  Win32_PointingDevice1 b+ ^. B$ r0 V* T2 X$ g3 y% C
  Win32_PortableBattery& l% C& r" c, g+ D# ]0 I: D6 U
  Win32_PortConnector
3 g2 t% m4 J& U7 r+ a7 r4 m# c   Win32_PortResource
) u2 L! C" d# y" r" K4 j. B2 L   Win32_POTSModem
: V; n0 a, D( z; O+ P1 K   Win32_PowerManagementEvent
/ W8 M5 H1 S2 U, S* u   Win32_Printer
( I5 m0 t6 J5 @0 m( X% F  i: i+ P   Win32_PrinterConfiguration& ^6 m0 H/ ]0 E( z  Y
  Win32_PrintJob
6 f& Z5 h7 H  c   Win32_Processor+ {* g! J" e& A; N7 I. f
  Win32_Refrigeration( ^8 Y! y4 `$ k7 @
  Win32_SerialPort
- q) i; ?$ Z6 D# o) y   Win32_SerialPortConfiguration
6 d/ J. q: [4 V4 W2 ^- I1 B9 t4 i  p$ d   Win32_SMBIOSMemory
- l7 G& h$ ^5 D& E" f  v   Win32_SoundDevice
' A1 F  k% K; M9 K" ^  k" |   Win32_SystemEnclosure- a2 n* H- \8 n
  Win32_SystemMemoryResource
6 L* ], N. s5 b8 Z8 F   Win32_SystemSlot
( r- U# E6 J0 H0 W   Win32_TapeDrive
" z7 i1 y' n# m4 j   Win32_TemperatureProbe
) j* Q& \2 E' `( M5 }   Win32_UninterruptiblePowerSupply" g  u# l9 z: m& ~' ?
  Win32_USBController
7 C; Z8 i) Z6 @8 E7 W   Win32_VideoConfiguration# j! X. P6 {9 c  ~& h0 y
  Win32_VideoController3 v. s$ }) Y& m% l
  Win32_VoltageProbe
# j8 }( }; N1 Z6 Y$ j) o0 O& v' v+ v
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-30 14:18 , Processed in 0.018270 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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