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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者): G) E" A# {9 h1 F0 y; w

0 r' T& O( E, m2 V: k1 o
# y( n: \) }2 m: }--------------------------------------------------------------------------------2 s7 I1 C  w0 n  ]3 H
WMI: Windows Management Instrumentation (Windows 管理工具), C3 {. ?( N% }) X3 @: x, E
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
. J7 y. o/ v" @   利用这个工具可以管理本地或客户端系统中几乎所有的信息。+ Z5 c8 t  g4 w4 ?+ A: B
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ) F4 G$ c: L* m* f3 m8 r% }
* ~! I. z3 T" D* W! ~5 N7 z. \
--------------------------------------------------------------------------------3 Q" L, I1 [) q  k( K, j' y
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
* c1 u( t: J+ p  ^. `7 A& q) K  \3 x- e. y1 Z4 u
--------------------------------------------------------------------------------
2 F/ D  e( Y( ~! m: F9 m2 ^9 l4 G① 初始化 COM 接口:# [6 V: n3 I9 m  ~( ]
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。6 K5 g. U: l! V4 n# f
  这两个函数在 #include <comdef.h> 里面定义。
: t, _! @  M3 i/ x) o6 J1 W: _: w4 i( H
② 获取访问 WMI 权限:
1 h/ y4 d9 Y! v: R  {   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
( R$ e( C9 ]& u8 q% G* I. D8 m   如果这个函数返回 S_OK 获取权限成功, 否则为失败。6 \! ~( A) D4 k4 s- l3 i

& _7 e7 c# Q- I! P5 a) ]③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:5 Y; K* B& r: D7 T
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
* l% S; ?: ^9 k- S# d6 q; {
$ `  \0 ?. K$ g: _# Z2 c6 Gvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
- ]( P1 ?) }1 h  M) ]0 C, I{
/ K7 P- G$ z  F- L& `# D" S  IWbemLocator *pWbemLocator = NULL;
# i% X: I& Z  q, d! j  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
) Y% V$ Z8 q% f5 u. D- I! {0 A# ~   {
& ?0 A2 i0 y" x) L( G) w( H* o     IWbemServices *pWbemServices = NULL;, o/ w# E2 X' L4 A7 H0 W
    WideString wsNamespace = (L"root\\cimv2");
, j, w! [+ D1 C$ W, ~' t9 l     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
! i! t0 y* P6 s' v) g      {& g3 R9 X+ S8 j
       IEnumWbemClassObject *pEnumClassObject = NULL;. F9 @; g& c2 `! m+ x( W
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;. q; {8 M. ?/ n; Y% t6 d4 m' |
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
. k( t( T4 W4 E2 q  U1 g         {
# e( P" @6 K0 o           IWbemClassObject *pClassObject = NULL;) K8 i: E/ v4 c0 H
          ULONG uCount = 1, uReturned;5 W$ O: y8 k4 ~" v* |
          if(pEnumClassObject->Reset() == S_OK): |+ r8 \: W5 y8 ^- H6 G' S$ y" t) y0 g
           {
1 y: ]7 N1 z, q( R( d1 V              int iEnumIdx = 0;
3 j- n4 y0 O) J5 |4 P( _              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)/ V6 M$ D: P& e
              {
* S! @. ?& ]" y- @                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");4 i) ?& f7 q% a; s/ Y! ?
2 K/ }) }1 [' _
                SAFEARRAY *pvNames = NULL;9 O- z2 E# P3 M9 q: e
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)0 Q6 S0 E! J& u0 R/ R* y2 V
                 {
% F( t1 n; {4 S3 J1 f% T                    long vbl, vbu;
; W: h' y1 E0 u5 ~                    SafeArrayGetLBound(pvNames, 1, &vbl);, V( ]. W7 k/ |- e' Y4 B5 y
                   SafeArrayGetUBound(pvNames, 1, &vbu);
9 E" Z3 ]8 j, k) m1 P0 ~; j                    for(long idx=vbl; idx<=vbu; idx++)/ ^0 a+ v6 S) f3 W& r
                    {
  D. M; n: O5 C. Y3 w& V0 ]                       long aidx = idx;* g. A( R5 u& v; W
                      wchar_t *wsName = 0;
- `& o0 c+ |- C3 m8 O/ |                       VARIANT vValue;& j: Z) s. Z/ a3 {1 U
                      VariantInit(&vValue);# u* v; w9 P6 b& Q
                      SafeArrayGetElement(pvNames, &aidx, &wsName);; s; ^2 {7 N3 C1 q

5 b# Y$ G( j1 `/ G# V0 [  g                       BSTR bs = SysAllocString(wsName);* k1 {5 l! k- a% X
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);" n6 G- B4 _2 F. P
                      SysFreeString(bs);
4 J/ P; f7 Q$ }# u1 W3 {
& _3 C% ~+ a& ?# y/ M% p4 q. S! _                       if(hRes == S_OK)
2 y8 R! ?" ]0 q  O2 D6 s                        {
- A# r! j$ f) T                          AnsiString s;" A" c# z& |5 G! [$ ?
                         Variant v = *(Variant*)&vValue;. K: f  d$ _6 R
                         if(v.IsArray())% d6 G2 k( i2 @, [
                          {, p3 K' Q( ?( H
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++). r/ J* q# K* @, I3 O, y7 `4 B
                             {: D# a, @6 P4 E8 z! U5 b
                               Variant a = v.GetElement(i);
/ v" S+ e5 t1 b                                if(!s.IsEmpty())
3 j, ?; G$ @/ X' J! `                                  s+=", ";" s, d4 h9 e. S3 S
                               s+=VarToStr(a);
' t5 t1 L/ D9 G: g                              }4 B6 a! T4 M6 Y( Q4 ]) L, w
                          }
" z) f* H* J$ U% `* r5 y                          else
9 N" n. V/ o7 E                           {
7 N0 a' X( s- u! [3 b7 V                             s = VarToStr(v);- J/ z7 `  I0 I% X
                          }# D# e% P  x; c$ E2 e6 |# `8 S
                         lpList->Add(AnsiString(wsName)+"="+s);
4 B+ f( l6 Z9 A5 E6 T                        }, C1 r' q$ b$ a  Z6 n8 u
4 `& t( M" n. U
                      VariantClear(&vValue);
3 m5 z  ]( A6 U* l( s" _/ C- j1 N                       SysFreeString(wsName);
: N1 P3 X. r( ^3 c5 i) D+ V$ k0 |                     }, H1 o$ m# b6 E  C4 r
                 }2 Y" K5 h- O7 h0 `* E/ p" z
                if(pvNames)SafeArrayDestroy(pvNames);
' z* W8 V" _- x2 A+ n9 ?                 iEnumIdx++;  T$ X, q* W5 M0 F5 w0 j8 C
              }
# J* q: v' H2 i/ a+ [            }. G; h$ p8 b& k  L  _
          if(pClassObject)pClassObject->Release();/ V" J5 A% ~; O) E( f
        }- R3 A7 e9 B/ ~) z6 ~4 H7 O9 C
       if(pEnumClassObject)pEnumClassObject->Release();* X* n: I6 W6 f  W/ {  T
     }; T' i& Q2 q+ t% i/ b
    if(pWbemServices)pWbemServices->Release();1 d. z7 k, R& I/ _6 C
  }
/ h1 k5 T% V, W' k& |  if(pWbemLocator)pWbemLocator->Release();
. }' L5 X6 s( F& ]9 B; n# d}9 t! \) ~1 c6 ?4 z
//---------------------------------------------------------------------------
2 n2 R3 Y7 I6 b* q/ k2 w* ~5 x
( }3 a) n* N: G7 @; X5 e// 通过 WIN32_bios 获取 BIOS 信息:
+ `% O5 i2 z  i- Evoid __fastcall TForm1::Button1Click(TObject *Sender)
1 E. P' c, u5 l5 ~{4 j/ I( _0 i( Q
   Memo1->Lines->Add("================== [WIN32_bios] =================");
+ X/ `) U) n! O! j    GetWmiInfo(Memo1->Lines, "WIN32_bios");: M% D& Q$ J5 X3 J: t# q/ K: f: V$ J
   Memo1->Lines->Add("");
7 t& w+ A8 e" {9 G- t2 p+ Y}
( O+ q" p; {# `
( X: T! @$ }1 w, s$ Q3 d5 s5 S--------------------------------------------------------------------------------' k3 E' s- o" d; K" d
0 R1 V. F% |$ q7 f, I" l9 Y- [
WMI 可以访问的信息类型有:8 Q  \& j7 g4 A$ M
  Win32_1394Controller7 x4 f: k8 F0 ]' V! w
  Win32_BaseBoard% o9 h2 B' Q' j
  Win32_Battery
8 m5 G# D. S: `   Win32_BIOS
3 D1 f9 @( i) v/ O  n4 ^   Win32_Bus
7 f0 j/ W; E. c$ k( h+ }   Win32_CacheMemory
% m+ o3 Q% J% z! D   Win32_CDROMDrive( j0 x8 N4 m* W" {4 r
  Win32_CurrentProbe
7 c; K4 w9 W  D$ S; M+ T   Win32_DesktopMonitor
, V5 o( q+ U! H6 C   Win32_DeviceMemoryAddress
! g4 d1 b. t" z- P% H1 }1 X! v   Win32_DiskDrive3 t3 F; O( {% t9 E7 j* D
  Win32_DisplayConfiguration
" V% l; }0 Q$ E5 e   Win32_DisplayControllerConfiguration
- }: ~7 W4 k7 k7 |! O   Win32_DMAChannel6 Y. J2 k* \8 Z/ h$ x+ Q
  Win32_Fan
( s( J! ]3 \; L4 X0 p8 c   Win32_FloppyController
1 u7 y9 C1 P4 ^7 {   Win32_FloppyDrive- ?7 i' x; D- w$ k" |5 ^/ K
  Win32_HeatPipe
  F$ T' [- Q; [$ i   Win32_IDEController
$ C* u' [9 z2 x: e! Y  {% y$ l   Win32_InfraredDevice, N  w; I) c( t6 m/ ?3 S
  Win32_IRQResource
9 A( F; c% Z/ b( a9 U5 g3 d" ~3 d   Win32_Keyboard% L# z5 @  E0 H1 Z+ i
  Win32_MemoryArray) ^3 m+ Q, e% K4 m5 N+ n
  Win32_MemoryDevice9 G6 F& W/ _8 S7 g1 v6 G9 z+ q
  Win32_MotherboardDevice
1 d' G% f, i' [6 U& _) N' u   Win32_NetworkAdapter
5 a0 }& n" [; |2 S- N   Win32_NetworkAdapterConfiguration# t4 X, F6 ^4 b% K- M/ d9 g* q
  Win32_OnBoardDevice) N; v( K& ~4 R
  Win32_ParallelPort7 v, E1 f( \' X8 j% l7 U$ o: }
  Win32_PCMCIAController9 J* k0 z* Z2 L5 A$ m& N0 a
  Win32_PhysicalMemory5 f" @+ X' F6 ^% o
  Win32_PhysicalMemoryArray
4 J: t7 ?9 j& |/ H( S4 q+ j   Win32_PnPEntity
! \  x% }2 B9 S2 ^: _1 b, g   Win32_PointingDevice
  \9 R' v8 H. x9 v. D   Win32_PortableBattery
. \$ g" R7 n2 n% K% v! h( L: P   Win32_PortConnector
5 O* [! T# f' u& k: o. i3 R0 X9 W8 n$ y   Win32_PortResource' R. m/ D0 H; d" D0 ]; d
  Win32_POTSModem' ^' N& c0 _9 o2 t
  Win32_PowerManagementEvent: }( j% {3 ^# s1 ]0 O/ x1 b
  Win32_Printer
# n# q; Q5 W2 w9 A" Q' W   Win32_PrinterConfiguration
) ~7 ?& M; n4 a- S2 S. z+ o   Win32_PrintJob
* b8 [* x6 a3 J+ H) E. V! y   Win32_Processor
/ k5 k0 @% O# G+ K   Win32_Refrigeration
, V# ]8 W8 C/ ~6 [3 x1 k7 I* ], Q   Win32_SerialPort
. ^" ?) U5 g$ H# b4 Z   Win32_SerialPortConfiguration7 z  h& H: v" ?  _: y: T- X) f
  Win32_SMBIOSMemory
6 l1 x+ r; K: W4 X1 d- E/ H   Win32_SoundDevice) b3 I) Z7 r/ B" R, }/ E7 w
  Win32_SystemEnclosure
+ `4 Y/ t1 W- u, ?; ?/ Q1 x8 N   Win32_SystemMemoryResource
; ?! v( V* E9 \- a   Win32_SystemSlot+ C, |4 s! }# D. F
  Win32_TapeDrive1 R, ^# W. B" n$ p
  Win32_TemperatureProbe$ |0 Z' F: g9 H3 Z9 z( A
  Win32_UninterruptiblePowerSupply
9 b* ]" W( q/ y! @   Win32_USBController
* D7 w9 S3 @* \0 K$ ~( e   Win32_VideoConfiguration' @! L9 |/ g  E* b7 H+ Y2 A$ O
  Win32_VideoController
5 x/ o( y8 g# a0 k3 Y% U( m   Win32_VoltageProbe6 c- x) |2 J  x

* q2 f% `7 A! y' _) J$ X( I以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-19 18:14 , Processed in 0.019245 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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