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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
; y7 B: p5 N( F3 Y: R+ F( l( S% q1 S+ E1 ~9 w; h% H# L+ W$ C

: B7 i/ D, e* o% R0 J--------------------------------------------------------------------------------9 Y% L& `6 }" S' k2 I. e
WMI: Windows Management Instrumentation (Windows 管理工具)( x; B/ f$ C; d" b
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
: w1 {, S9 C7 Y% K$ o   利用这个工具可以管理本地或客户端系统中几乎所有的信息。5 L: k$ y6 T9 P4 {
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 5 r# e8 C0 B8 F% @/ X; a- M+ [

0 u$ f3 D# y/ d4 u3 v--------------------------------------------------------------------------------7 i& B1 E2 p- ^9 S, N$ ~
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
  A# R5 I7 j1 q% l" h- S/ \; \* [$ M/ a) ?! ^
--------------------------------------------------------------------------------
5 T8 B* V$ R( F, C① 初始化 COM 接口:6 r/ v& h1 M4 s# ^* J6 z8 d
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。6 _- T7 M) R* U, k0 U% P& r
  这两个函数在 #include <comdef.h> 里面定义。# D, G) N- A& S2 }5 g% C" N
3 d2 ?$ g8 m7 m5 M0 L! ~
② 获取访问 WMI 权限:
; Z* Y' l3 ^* d% {! p( }4 \7 \   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
, B# `! d. ?$ j8 o   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
+ v: |' x' _4 \. H
8 W& W( R8 [% z0 r  `& }0 S③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:( b9 Y3 C" x+ @5 S
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
) U, u* e( o' t7 Q3 a; k1 p! f$ {) y1 H  D* }( W0 P2 ~7 s
void GetWmiInfo(TStrings *lpList, WideString wsClass)  C* r1 f% l6 K" p: Y( @
{
% U. [( s/ A5 C  IWbemLocator *pWbemLocator = NULL;0 ?4 ?4 p  r' a" R
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)) [" w2 @- {( P2 y7 i
  {4 E  e2 y, P% H" q6 |0 ^! _
    IWbemServices *pWbemServices = NULL;: k+ s2 h5 z, n' ]4 c( O- a: S
    WideString wsNamespace = (L"root\\cimv2");. @% p5 X/ |; E
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
! j% D' }+ o: G5 F% X& h* N      {  r! \  X* S& A
       IEnumWbemClassObject *pEnumClassObject = NULL;
5 N. |. ?% J) L3 Q" c4 N; ?( u        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;( ?" G2 p7 R( b1 v3 m" F
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 @. S/ x+ ^' F& V# f$ d         {
7 @+ C% A5 c4 s           IWbemClassObject *pClassObject = NULL;# U2 k1 v& {6 D$ \/ I7 t0 ]1 P# O' s" {: Q
          ULONG uCount = 1, uReturned;
/ E1 s4 [. {3 Y6 v           if(pEnumClassObject->Reset() == S_OK)# _  ^, h6 T+ F$ C) J4 r! u
           {* j3 V! H6 D1 T! I& G6 {
             int iEnumIdx = 0;
# m2 [6 k; x0 Y1 n1 a" d              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)4 u' G& N- L! c2 r: o: ^- v
              {
: Z" o2 A' K6 S/ _) v2 e5 `- K0 M3 E                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
& o7 A# }, h2 ^0 h/ |4 ^  S( g3 p$ p( f& G
                SAFEARRAY *pvNames = NULL;
7 y3 r  _, m$ G                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
# t% {# K; e. P5 \8 J7 s                  {
8 h2 q/ u1 |$ g3 R+ N0 z. h, K                    long vbl, vbu;4 r+ D7 l0 K/ C6 N9 l5 R  Y4 F, R
                   SafeArrayGetLBound(pvNames, 1, &vbl);
- U9 F0 |3 Z8 I, J" X                    SafeArrayGetUBound(pvNames, 1, &vbu);
! @1 W* e* o8 k                    for(long idx=vbl; idx<=vbu; idx++)
& Z  @  f1 |- G3 S: L9 l4 ^$ q                     {
1 r3 i. y; }. _' d) f* f' Y7 U! R                       long aidx = idx;
; O' R+ F1 W0 T2 i1 m4 W% F                       wchar_t *wsName = 0;$ q7 ~4 ]- ?  J
                      VARIANT vValue;
! e7 N/ O5 [4 Y2 L5 E                       VariantInit(&vValue);
: I0 q/ d  x8 ^, |* y3 x                       SafeArrayGetElement(pvNames, &aidx, &wsName);
, V1 c5 M; \5 L* T4 `: @4 _+ ^
. a& z& M# b- I) L/ j3 R0 W                       BSTR bs = SysAllocString(wsName);
& f% q9 R5 \+ ~7 I3 Y+ j5 [                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);; h$ \' P; G6 C3 N
                      SysFreeString(bs);
! P) m6 e% n9 v) n0 l: }! Q0 X" e6 S' ]. c, A  y, `
                      if(hRes == S_OK)
- C, K# M$ J$ f; t" a- a6 k                        {
/ l5 u' d( j( V1 \' n                          AnsiString s;
3 a8 d5 Q3 V' H; M                          Variant v = *(Variant*)&vValue;: ]/ g% y" h) y) r
                         if(v.IsArray())  |7 T& E- s) u7 ^7 F2 l0 _
                          {
3 A, C; K1 d2 @& A! o                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
8 v% p) l9 Z  ]1 |/ z0 m9 E                              {
! d1 ~* w" g1 [                                Variant a = v.GetElement(i);6 m& h. f' D- _' t3 X. v. ?
                               if(!s.IsEmpty())  ]1 h8 ^! `# h" f, a  \
                                 s+=", ";. J- I3 r+ y% B% n  v
                               s+=VarToStr(a);% u" A/ z3 e( s' u, t  T
                             }, `+ B8 z+ R- l0 n2 u" n+ P
                          }, t3 R0 D- y4 l% k! d
                         else& l6 {& N7 v0 d8 h8 e) ?  O* G
                          {
0 w8 J  o8 z" x+ I" r! x                             s = VarToStr(v);/ V/ Z8 r# i! m* W- n
                          }
* k3 [1 A+ K& p/ \2 m8 u2 w                          lpList->Add(AnsiString(wsName)+"="+s);0 D. C% O0 k: P+ |7 }/ ~' {
                       }
( @" w- O4 m0 y
! A! d' Z/ V- z; Z1 {9 B                       VariantClear(&vValue);9 \4 u; V6 k: Y5 N+ N: n) @0 D
                      SysFreeString(wsName);
: @) c5 L2 u1 V6 S$ o                     }
$ F* p; Z2 u" e                  }+ v8 m3 h* r6 L% O( R+ r
                if(pvNames)SafeArrayDestroy(pvNames);
$ G1 q" r/ _% U9 f/ S                 iEnumIdx++;4 s. J+ }  l8 e- ^
              }
) {1 C. n, Z/ u# l" E% n5 |            }3 P( A1 b0 C) c& K  c
          if(pClassObject)pClassObject->Release();
1 @) P; B2 u# a2 ~* I         }- [: O$ r2 I9 i+ E7 ^
       if(pEnumClassObject)pEnumClassObject->Release();
. K8 Z! G( t( k      }1 G3 v5 c; ^) }& g
    if(pWbemServices)pWbemServices->Release();
! ^, k( K' O1 W; n& y) R! t   }
, Z1 @* @# T6 C1 b  if(pWbemLocator)pWbemLocator->Release();3 ^6 ~3 }/ b- u( c
}
( d1 F, g2 ^8 T6 i3 v4 z1 v7 _( t//---------------------------------------------------------------------------
. T; _6 ?# W) _8 ^# E, v  L' v' V1 N: d: m% V4 `% Z4 X5 P
// 通过 WIN32_bios 获取 BIOS 信息:' @+ f/ X& s+ f% ?0 e9 m% \9 ^0 R
void __fastcall TForm1::Button1Click(TObject *Sender)
1 q5 Z; j+ B- ?$ n+ i3 O' P/ M{8 ~& N  R2 F2 g6 i) w
   Memo1->Lines->Add("================== [WIN32_bios] =================");
9 r0 C* P" l  `    GetWmiInfo(Memo1->Lines, "WIN32_bios");
) O& d' F# q' L) D    Memo1->Lines->Add("");( N- b! o3 i- {% |- d/ d
}6 A6 h9 ~% E+ C: \  |3 S

/ I1 `% i. s2 G; o3 @$ t0 a--------------------------------------------------------------------------------" |! d6 v$ a3 x, u) t

+ ]# v/ G6 i6 t: A, ^3 c; {. C9 D* sWMI 可以访问的信息类型有:& J( g/ |2 R) Z! R* ?
  Win32_1394Controller
9 k; S2 w- b4 t   Win32_BaseBoard
  c5 G2 X' ]: y, z0 V   Win32_Battery
% k  |+ \; p5 ^6 f; G- h$ Z6 Q% J   Win32_BIOS
4 m# Q; X) S9 W% v   Win32_Bus
! p' L+ ]. l% ]   Win32_CacheMemory# i7 k+ {: y7 Z$ N
  Win32_CDROMDrive0 P5 _7 P/ d! E9 U( N3 P' m8 E
  Win32_CurrentProbe
/ d$ u4 u# i$ G/ Q" h9 V. {  {! B' D   Win32_DesktopMonitor
' o% m7 @2 \5 y3 f+ t) O0 U   Win32_DeviceMemoryAddress
% T: Q  ]1 u  ~6 M. T9 s  T   Win32_DiskDrive% n9 R& e9 x) ?8 y# N" @8 E
  Win32_DisplayConfiguration
* |) \" ~( A3 X8 O& h: V9 K4 s4 i   Win32_DisplayControllerConfiguration
( T$ d, _" D4 N# ?. c7 U   Win32_DMAChannel+ T. y3 u3 c2 R! L
  Win32_Fan" v7 _2 E* y4 l4 F, j
  Win32_FloppyController, Q8 g. a2 c% C' f& a: R
  Win32_FloppyDrive
6 O7 s" t- n# u8 J4 ?' q   Win32_HeatPipe
, ?: `) I$ u* Z5 u! L6 g- a   Win32_IDEController
& I- m3 @4 x: R! X6 E   Win32_InfraredDevice$ k# a! }5 J& g+ \) O7 V8 `4 C- N3 T
  Win32_IRQResource+ N. X5 w4 l  [3 O
  Win32_Keyboard* T. [8 I1 w0 y) U  ~8 O
  Win32_MemoryArray/ f* S9 ~+ N# ~& ~
  Win32_MemoryDevice
% l: B( k$ h) H& i   Win32_MotherboardDevice
& L3 d; _& t2 k3 L5 d   Win32_NetworkAdapter
, v9 a% `3 M$ c3 ~5 X/ s: v- ^  U   Win32_NetworkAdapterConfiguration
$ T$ X' W2 m, _) ^2 W8 C  o   Win32_OnBoardDevice
1 Q& k6 C0 w! N1 T5 p4 i   Win32_ParallelPort' H; D3 h  g6 m& c
  Win32_PCMCIAController  l. p8 C* [+ d( O8 ^$ P7 }
  Win32_PhysicalMemory
+ I1 ?, p( T+ d' v$ H" u% f   Win32_PhysicalMemoryArray
" e: g/ ^3 [" l, o   Win32_PnPEntity
# B3 m( p' q7 }   Win32_PointingDevice, K/ b& j5 _1 w% I0 V5 o& Q- x
  Win32_PortableBattery
* J5 |5 G8 q7 p! T   Win32_PortConnector2 m* p! [" b2 \( W6 Y. C- R
  Win32_PortResource
8 @7 k: a" O# c  `) f, U) [5 O4 F   Win32_POTSModem6 k  G+ u" k$ i5 e6 w& _& J" f
  Win32_PowerManagementEvent+ n: `3 q( }: o
  Win32_Printer5 X  }, w9 X8 d8 P9 o
  Win32_PrinterConfiguration) O) D! |% ^& l, k/ o( J. \) j
  Win32_PrintJob
' W" X! l3 X" F8 T$ @   Win32_Processor6 h; M" L5 z! U% T3 Q2 P; O
  Win32_Refrigeration
1 j: \: F7 C; g4 [: F( @+ t2 g   Win32_SerialPort
# }' T! J6 b9 L  i   Win32_SerialPortConfiguration
7 L0 u- [% a, V1 k% e  e0 ~1 ?   Win32_SMBIOSMemory, v' r! y! F3 Y
  Win32_SoundDevice
8 \7 X* _1 }) e: Y, l   Win32_SystemEnclosure. l1 f: E( k4 F: V
  Win32_SystemMemoryResource% B+ E/ x& p  e$ ?/ J3 ?. Y9 Y
  Win32_SystemSlot5 o' s5 Q" g. D; x! c% M$ w. m9 |9 L
  Win32_TapeDrive
* ~; b: C+ J. W. C( n% B+ j! S; S. S   Win32_TemperatureProbe2 ]3 h0 `5 l8 q3 T
  Win32_UninterruptiblePowerSupply0 V# x0 A4 [1 r$ E1 P- H
  Win32_USBController
- t/ g* z: t9 P   Win32_VideoConfiguration4 D" `" P' ^  g; {2 @! n
  Win32_VideoController' U* E2 ?% \! q  `2 X9 S; d6 x
  Win32_VoltageProbe
! i- s! @/ E$ y2 h! G) U2 F+ K% |3 J( {8 I5 i
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-1 13:14 , Processed in 0.018482 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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