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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
  I2 m& s; V4 `1 `) @
: B& L. ?: _1 p. ~$ C; {6 W/ B# b0 @/ q
--------------------------------------------------------------------------------5 u' X0 n0 ?- M0 H( o7 O
WMI: Windows Management Instrumentation (Windows 管理工具)
7 |: u' v* C! k   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 3 [* M7 r0 U7 a7 s, k5 h, D
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。( _" p  d! e: B9 H/ E  \; o
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 2 ]* F2 I; p2 t3 y* J! p

' B+ S+ S: C2 x  x5 l--------------------------------------------------------------------------------5 r/ W9 F% ]  M; N0 j
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
) {2 N' W8 K3 n
1 f8 D; u( a) U( p--------------------------------------------------------------------------------
" A( N- S9 C# R" E① 初始化 COM 接口:
( E* Q1 Y0 G; `  x7 s; R   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
/ \% j7 L0 N/ A# W6 T+ }0 _  w   这两个函数在 #include <comdef.h> 里面定义。8 g, M6 ?1 [  _; Y- l/ P9 O0 M

* P* x$ U' p/ Y! z1 g② 获取访问 WMI 权限:
; R  S- p5 ~# {   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
+ k" {" X7 z% \$ ]8 t# @0 S& F   如果这个函数返回 S_OK 获取权限成功, 否则为失败。/ e  @9 l6 J: {* S' M3 H" K

; u4 U& G# k$ m③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:2 Y: e0 D- e- o  C4 n- J
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。, O. `0 a1 M6 }6 _4 y
, o6 }1 f8 R! f
void GetWmiInfo(TStrings *lpList, WideString wsClass)
9 t+ |! E( F) C5 i{
' u2 \5 W% i2 E; e; N/ N; x5 o  IWbemLocator *pWbemLocator = NULL;
# k! q* r- v0 K0 ^: f* `: U  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
8 j* V+ @. j" H- b3 U   {
: O2 e% ~6 a4 L; C     IWbemServices *pWbemServices = NULL;& \0 ^% N* N( Z  q
    WideString wsNamespace = (L"root\\cimv2");
& F7 ]3 b7 k7 b     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
& \* G9 T8 N, K* l) B; l      {7 d+ J- n7 Z2 X- @1 |' j
       IEnumWbemClassObject *pEnumClassObject = NULL;
+ q# G. q* s3 S1 |# M- J, a        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
- Q3 V% u) H, ^2 k& p0 n% A2 r        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
. y6 h; s1 H) t5 f         {3 {: I' v$ A" ?& k
          IWbemClassObject *pClassObject = NULL;
7 D! }/ \. [* P% p& Y) h0 B           ULONG uCount = 1, uReturned;
& p3 O! B9 P/ [: X& _/ \! I           if(pEnumClassObject->Reset() == S_OK)
, r$ Y! M* }2 c, \& ~+ t            {
! @) M3 h" o$ p0 A3 `. ~              int iEnumIdx = 0;
9 v* u7 b1 A* B7 z8 Y4 P              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
2 Y1 ~6 i9 B6 |9 X5 a& P, `               {
" b7 e! m: D- `. u* \! E, ?7 C! G$ c                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");) c' f$ e  r5 w

5 u2 i4 a% `) K9 H& m2 o                 SAFEARRAY *pvNames = NULL;* V+ f: ^: t2 G- E; f
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)  i" i7 j9 W" s% O9 a& S/ d2 P
                 {
/ J; s$ p2 \; F. A$ P& M                    long vbl, vbu;
' a6 X! g7 w# d3 x. w                    SafeArrayGetLBound(pvNames, 1, &vbl);4 ]! y: z4 h# l1 U. p
                   SafeArrayGetUBound(pvNames, 1, &vbu);
$ q/ L0 G# w! |8 L2 \                    for(long idx=vbl; idx<=vbu; idx++)
5 m& A! x$ x0 V- T% R2 f                     {) \- _+ m0 e1 L
                      long aidx = idx;
6 Q! t6 E! L- K- s4 r. e7 `                       wchar_t *wsName = 0;0 _% d0 Y4 A: _
                      VARIANT vValue;
$ |) H+ L" H3 y8 |. W0 ^                       VariantInit(&vValue);' K8 ^! M6 w4 z/ q& a! T2 [
                      SafeArrayGetElement(pvNames, &aidx, &wsName);1 n7 a! h% N9 O- p; O- X
6 c( ]# A. K( _6 ^4 q
                      BSTR bs = SysAllocString(wsName);
/ q4 W# ~& [/ ~" S" I                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);4 g$ t% C( u( f9 {5 M7 Q! V
                      SysFreeString(bs);/ ?% d$ ~  j1 ^8 n3 w

* M) I/ B/ {5 n% X5 |- d) R                       if(hRes == S_OK)
( O' U* W' }2 F4 S% \                        {
4 w+ \7 f9 t3 f9 k6 o                          AnsiString s;
) r9 |' h% g5 Q- ~- b                          Variant v = *(Variant*)&vValue;' x1 v' E9 K# o
                         if(v.IsArray()), F" ]7 z2 P+ B. L
                          {
9 @' ~- Z5 Y3 ?                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
8 o( D, R& M+ |5 k+ w" O% }1 p  b                              {1 Z7 ~5 T* @5 m+ @- P0 f
                               Variant a = v.GetElement(i);
% X) |$ X' `& m; V8 O                                if(!s.IsEmpty())
$ T* v, M- L$ d! k( J7 N3 X, L) }                                  s+=", ";! n+ h/ J' Q- r( G+ B2 m0 n: d# w
                               s+=VarToStr(a);8 R  Q1 g( _1 `' F; L
                             }/ ]: N3 ?/ F) B: N- v
                          }8 L0 F5 L2 z; G! k
                         else, \4 K- F; W& O' a2 V
                          {- B9 x) F/ E. h4 ?5 Q$ w! _: L
                            s = VarToStr(v);/ |6 r# ^( @! i
                          }/ X4 d% W+ a- r8 R
                         lpList->Add(AnsiString(wsName)+"="+s);
" u* O* J7 D# Q' O1 x2 Y1 u                        }
  Y% B" @5 s+ ~- K- ?  c1 `6 M3 T( K( Z- [2 R) |7 G& L/ ]
                      VariantClear(&vValue);3 S* D/ ~; D7 D" G* Y
                      SysFreeString(wsName);
' g# B% m6 p) w1 f' W                     }
0 B5 w8 k0 o5 {* i0 ~  m                  }8 ]$ M9 `( d( g8 m, q) M
                if(pvNames)SafeArrayDestroy(pvNames);
# l) x+ t' A+ f0 V: w0 `                 iEnumIdx++;
  m1 N7 o- d# y# p* }- r) t+ o1 A               }
  L  x  b! D8 z9 x5 Y! c* c5 l$ ~            }
0 y. N& ]/ L6 D7 `, d5 ?( J           if(pClassObject)pClassObject->Release();
- ]* C" B0 i3 h0 b: q4 Q8 W1 H# w         }
. s8 O+ `1 j2 M$ x/ z" R        if(pEnumClassObject)pEnumClassObject->Release();
2 |* ]& y& e0 S/ ^& o      }1 R2 k- X% ^, t9 J2 z" |/ v- a
    if(pWbemServices)pWbemServices->Release();9 e  r! A3 x8 ~6 u' m! ^4 Z
  }9 ?9 R3 V" y% N) n
  if(pWbemLocator)pWbemLocator->Release();0 i9 \% h% N6 z$ V7 b  \, {
}7 n8 @" Z" y8 H$ N3 W$ E/ m7 a. [: t
//---------------------------------------------------------------------------! A3 M- R* ~* h& w4 |  e/ z
( t8 s+ R" q- \( S; U+ |
// 通过 WIN32_bios 获取 BIOS 信息:0 b. x) Z  o- w0 I3 K9 t% ]: b
void __fastcall TForm1::Button1Click(TObject *Sender): @% X! J9 J4 D* F! x
{" v" k( [- C" ?* l4 S; b
   Memo1->Lines->Add("================== [WIN32_bios] =================");
' C( w  W. o' o% c: m* t" D, f2 \    GetWmiInfo(Memo1->Lines, "WIN32_bios");
# R( {& H, y, f( t5 ?% Y    Memo1->Lines->Add("");7 r4 v: I0 N# ]% w. Z9 O& i7 ~
}
$ J8 Z* F8 q  k  F3 ]# T: ?9 _: q( P5 T/ s5 b6 }' o5 v
--------------------------------------------------------------------------------+ M. p" a2 _' L( J; ~5 s; d

# M1 Y2 \: E$ yWMI 可以访问的信息类型有:5 g: g( ^. G7 M+ r5 O9 n
  Win32_1394Controller. ~7 P* `3 |+ }  U
  Win32_BaseBoard
" \/ c7 `6 h9 N& E4 _% d( v   Win32_Battery
6 V" i/ _" L  N4 a   Win32_BIOS
7 X8 U) M# N# i$ D* ^( V; E2 i   Win32_Bus4 y% C8 W# _5 o
  Win32_CacheMemory- [' Z8 s; L) A9 z5 k5 D
  Win32_CDROMDrive& W7 R& }- l' N' l1 _
  Win32_CurrentProbe/ K! S  _0 N9 z$ w3 P& O* ?
  Win32_DesktopMonitor
0 g$ r) o" K8 W+ V   Win32_DeviceMemoryAddress4 [0 P3 L: G# a+ E' p
  Win32_DiskDrive
1 o% o$ r* V6 f5 e1 q# r   Win32_DisplayConfiguration
! L& x8 ?. z4 a" ~  W# I5 o   Win32_DisplayControllerConfiguration" d  O# D  l% P9 |  E
  Win32_DMAChannel
: u" v. |6 f$ k% P+ H   Win32_Fan
1 T- e) F: s3 u) D* T1 `( \* J   Win32_FloppyController( N7 V4 K! B( v4 ?% z( j
  Win32_FloppyDrive
" U4 X- o% }3 R6 [7 ^+ I   Win32_HeatPipe
, a$ N8 B9 Q' y6 S, G   Win32_IDEController8 O7 q0 w/ C6 H3 k
  Win32_InfraredDevice" e- H6 T4 t* `* i3 s9 l
  Win32_IRQResource" W% ^$ y7 ]5 A* Y# m+ U' C) s
  Win32_Keyboard
* D6 v1 b$ S; F2 d   Win32_MemoryArray
- `' w. }/ |5 Q* k2 U" `   Win32_MemoryDevice# J' `4 K( b* Y% o% [2 B
  Win32_MotherboardDevice
: z8 K( D! i  C0 M% v$ m3 _/ x- Z   Win32_NetworkAdapter, W2 d+ m: C" G* B
  Win32_NetworkAdapterConfiguration
% W! s# [! E4 P* r   Win32_OnBoardDevice
* {( R+ O9 n4 A2 ~, {   Win32_ParallelPort, J0 E1 c2 f% F4 k/ u" X4 P( f' i0 f
  Win32_PCMCIAController
( N4 Z! ^- _+ h* z; a$ Z- a) |) K   Win32_PhysicalMemory, Z6 [1 f7 ]7 @: R3 W
  Win32_PhysicalMemoryArray
' T5 i7 p$ V, K: X- A- h   Win32_PnPEntity2 d- d: _; n* U: y+ a7 ?5 v
  Win32_PointingDevice# ?8 n/ t9 V4 U* c7 J+ }7 d
  Win32_PortableBattery& U0 N  Q  ^3 [  J2 z  X$ b: P
  Win32_PortConnector* N! `# V; a3 x3 K& O
  Win32_PortResource
6 N" w5 O+ F+ c! N& w   Win32_POTSModem6 V. `. j. k( Y0 M/ {. E4 r% X  F6 }3 C
  Win32_PowerManagementEvent
& d# ]+ Z3 l* ~3 _$ \( g6 E+ n% W   Win32_Printer6 O7 V! p6 V; o7 j; J1 R% G+ g
  Win32_PrinterConfiguration; B) v) m7 F/ Y
  Win32_PrintJob/ I1 p) \9 c% R! z9 U4 W! ~
  Win32_Processor
- l) c/ R9 J5 n2 g% b   Win32_Refrigeration
1 E% o. ]6 W0 A1 j4 s# l8 x( f   Win32_SerialPort+ U5 B2 t# ~: p* W, v' B3 Q0 d
  Win32_SerialPortConfiguration! Z9 [% i" X  {4 e. w' L+ B) n9 ~7 i
  Win32_SMBIOSMemory
' K$ W& ]3 w8 \2 u# P) o$ h7 |: q   Win32_SoundDevice
: V! R3 B4 {+ K9 X4 v   Win32_SystemEnclosure& I5 j2 _8 u% L+ ^/ y
  Win32_SystemMemoryResource
& J4 T- P4 E! [  g   Win32_SystemSlot
* C% g6 ?3 N0 ^' p   Win32_TapeDrive
: l( v; C0 m, _7 R$ ^   Win32_TemperatureProbe
- x7 p7 {* u  C+ b& I. Q3 h   Win32_UninterruptiblePowerSupply4 @+ F) }( A  f& ]" @: ~. X
  Win32_USBController' A2 h' l% s( p! |% Z) H9 l
  Win32_VideoConfiguration
5 G$ Z' O3 `( f$ x/ R* ?   Win32_VideoController
9 u9 n6 k2 e, X. a* S   Win32_VoltageProbe: q" s9 q( R3 L8 i, K( l
9 k8 b. a- V& V3 w( A  c* S
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-22 15:44 , Processed in 0.018761 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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