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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
8 B/ S( _1 v9 c* ]( m, i& v5 t$ |5 Z0 z9 Q. c3 [& Z& _
3 K- i: i1 B8 M
--------------------------------------------------------------------------------
' M9 q0 ]- M2 f1 N: B3 ~WMI: Windows Management Instrumentation (Windows 管理工具)
; h' m* Y, w: Q5 U, n% {- c   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
' H  I0 M6 X9 }0 Q- r0 K3 i( g   利用这个工具可以管理本地或客户端系统中几乎所有的信息。( D, V7 C9 O2 n. O
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
  _' n3 B  I! A* ?1 T% C( v; C
$ z6 S( N& r) `6 G; }5 D' ]1 |--------------------------------------------------------------------------------0 A) d- d8 a7 l! }9 J
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
' W% k5 ]' f/ y# @' P7 u, @: m. ~1 c, B" \4 F
--------------------------------------------------------------------------------* U' t) d" ?6 B8 ^3 I% T6 b3 r
① 初始化 COM 接口:
9 ]7 }& _1 k  c, \   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
; y: n( ?" J. t, w6 u" M   这两个函数在 #include <comdef.h> 里面定义。
; O5 Q( q1 I# h; t8 [5 p/ U
3 P1 ]5 b& O% \/ {! B7 ]* q② 获取访问 WMI 权限:
# v# |# m" u4 W  ?( R   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
  J* f* v* L- p4 G/ U6 z% l* j   如果这个函数返回 S_OK 获取权限成功, 否则为失败。7 [! f7 B3 Y/ x8 r5 p" j' \, F

* d  m$ _1 y3 P4 R* @. u$ }, D③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
# `' W& \+ t  g2 t8 w# m/ F& l/ ?   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
% y2 m$ A/ K& p$ }: j
) Y! h, l# H0 }( Y% h& G% t' Cvoid GetWmiInfo(TStrings *lpList, WideString wsClass)! }; e- z& G! ]- H
{# D: Q# Q# n9 K. T
  IWbemLocator *pWbemLocator = NULL;
% j( [, ]$ B6 N0 g4 e+ Y  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)' V& N  }- x" Y5 S% ^3 K% Q% R! L' z6 ]
  {
, T9 A. i9 v0 b/ p; L6 q# P     IWbemServices *pWbemServices = NULL;. e# i  B1 z& @: T/ C
    WideString wsNamespace = (L"root\\cimv2");
( G; n# B4 Z3 w+ n& ~$ n3 U. l     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
: h) t6 ?% O0 G, M      {
4 g5 B0 I' z3 a) s) y; R# ]        IEnumWbemClassObject *pEnumClassObject = NULL;
: ]5 e0 n; v  T3 W1 i        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
* ~; D' K) A# X: r9 u4 s' Q: s! d9 t        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)  r( `- r4 x+ A2 T
        {
% C, l- Q) \# b- k           IWbemClassObject *pClassObject = NULL;
# y- {5 A7 m# @5 r! J& ^           ULONG uCount = 1, uReturned;% e/ M8 i% s: h; h- k3 y* g
          if(pEnumClassObject->Reset() == S_OK)8 M8 P! \2 Y; N6 v$ ]( A$ q
           {
% E, Y, T/ q+ l3 [( S7 E; u5 _. j' f              int iEnumIdx = 0;4 p( p% K/ o- U1 N$ @
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)/ {* F) w* O( c  a8 a) V& \4 R, z
              {
9 K3 i2 n# t3 s5 ^1 b$ {                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");; a8 l( w$ n: E( G! W* e* t$ H
  Z$ O/ b" y, _% a% F! G
                SAFEARRAY *pvNames = NULL;
! X. y3 B; e9 ]  e; Q0 ~5 q                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)( O7 \0 b5 [- m, s, {; T( `
                 {
1 ?4 Z: S2 e2 f6 w                    long vbl, vbu;8 I, A7 _/ R- C9 A
                   SafeArrayGetLBound(pvNames, 1, &vbl);
- ]: @/ D! |6 b                    SafeArrayGetUBound(pvNames, 1, &vbu);( X  e3 j3 ^# }/ J
                   for(long idx=vbl; idx<=vbu; idx++)
  [- x9 ?3 r& P; C, T( s4 v7 g                     {
5 L" ^5 Y" p) c5 x& c7 m  q                       long aidx = idx;& U& I0 _' i, k1 S1 S5 [. U: Z7 P
                      wchar_t *wsName = 0;
/ r( B+ Z4 ^3 L* k                       VARIANT vValue;2 I( ]9 D- }. |& I
                      VariantInit(&vValue);8 a. S6 _$ G3 Q5 F% m
                      SafeArrayGetElement(pvNames, &aidx, &wsName);% z5 G7 v! d) q& d" W5 O; K0 ~

; q6 y8 {0 @. `0 o3 M  ^                       BSTR bs = SysAllocString(wsName);/ b( \, c5 x7 N' `
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
1 H) B9 X' s& j& |6 T: K                       SysFreeString(bs);0 F! z3 |2 C- w0 ?

' r- t( p2 o) m+ ]8 ]/ {) j) H9 i                       if(hRes == S_OK)
" t7 v. E1 z1 A! r# i/ X3 z+ f; |                        {
, ~! M* W1 v3 e+ K" K" ^                          AnsiString s;
+ Z% U/ f1 b8 w* D( Z  y- H! F, r& T                          Variant v = *(Variant*)&vValue;
& m8 P' E- r1 X+ x( U                          if(v.IsArray())
4 v3 @1 Y% G5 s' p5 g                           {1 K7 A: {2 q- w$ [
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
! E# @& Z0 V; D$ R                              {( y, Z8 ?* U; K/ X& D
                               Variant a = v.GetElement(i);0 N" q- ?; E  b" ?8 }
                               if(!s.IsEmpty()): c/ |  Q' _& \
                                 s+=", ";1 N. i: S$ }. s& Y, ^8 h, ^) E
                               s+=VarToStr(a);9 \, B" w( I- K0 O- E0 s
                             }
9 p! A3 D! K+ @6 ?( S8 a& R                           }
1 _6 \2 z, \( p0 Z% @- E; f  ^                          else
  s: ?. j2 ~& P% X- Z' ?. X& U! ]                           {
+ E' Q- Y, v4 \                             s = VarToStr(v);$ M! g3 L3 G8 X" b" b' A) t; O
                          }6 A  [, w! c  \; \1 F
                         lpList->Add(AnsiString(wsName)+"="+s);
, `$ G# L. s( `                        }
. @0 ]1 l/ ~  Y
9 {) W" X8 N7 j! X                       VariantClear(&vValue);
* y9 X# a: Q: k                       SysFreeString(wsName);
3 s0 m# w, @, V; Q4 q                     }! K2 e$ `1 y) k3 Y: `1 q1 J  D
                 }
0 u, T2 i: Q6 c& K( K                 if(pvNames)SafeArrayDestroy(pvNames);, R+ f& [' j! A  p2 @
                iEnumIdx++;4 \- F: b4 P, l' |5 n$ a8 x
              }
6 G" w/ H6 g( b7 E3 n' ^            }# Q4 E. Z% h6 Z7 J/ d9 d! O
          if(pClassObject)pClassObject->Release();
" d3 r' N; S) s/ Q1 a         }
# o# ~4 Z8 X* }2 i# Y: R8 f+ T        if(pEnumClassObject)pEnumClassObject->Release();
! N" [2 n6 {  t' l* X- b      }
# n, {4 l+ d" X' P     if(pWbemServices)pWbemServices->Release();% w4 b; l6 h1 H) B. a- |4 ]
  }$ F3 P( {3 W0 W
  if(pWbemLocator)pWbemLocator->Release();: ^" a. T; j! K4 J/ v" B: E
}1 s$ ~- A; C, b4 F: M: h
//---------------------------------------------------------------------------
. l6 O" F! L5 _% g) {, W, l! k4 l5 J" G: _( q# e1 C% A
// 通过 WIN32_bios 获取 BIOS 信息:' [; J* }) D2 H* @# Q* h4 r
void __fastcall TForm1::Button1Click(TObject *Sender)7 N- W1 ?& Y: ?+ j+ o+ R) Y
{9 }' S2 n* F( c
   Memo1->Lines->Add("================== [WIN32_bios] =================");; t" A) q( X6 q. A8 c8 o
   GetWmiInfo(Memo1->Lines, "WIN32_bios");/ M( ~5 Z$ H/ ]$ P. \  V% y
   Memo1->Lines->Add("");" D2 |) M; J# d8 |# X0 t( L9 m9 e
}
# t/ _0 `3 |. j0 ~: U5 ]: L
. I  \9 F6 u0 B1 |--------------------------------------------------------------------------------- S* u3 n2 z8 N& O

4 X+ T8 f9 C; Y6 l& c  MWMI 可以访问的信息类型有:6 ]; ]9 R) k+ u
  Win32_1394Controller
/ q& T* P6 J: J   Win32_BaseBoard- _. d2 }! d* J
  Win32_Battery
7 q+ x1 u- E' l% v/ t4 Y0 h; \   Win32_BIOS7 \( ^9 I: v' f) V' Q; F7 o
  Win32_Bus0 S9 U( u0 @1 D
  Win32_CacheMemory  @4 p5 F0 y* _* M2 S8 `
  Win32_CDROMDrive
0 X& L' m8 O4 `2 ~- i   Win32_CurrentProbe5 V" `$ w0 I) R; F2 u! }  z. {
  Win32_DesktopMonitor
4 f$ e9 G5 y' d% Q. y   Win32_DeviceMemoryAddress/ k- Y% y6 K3 f
  Win32_DiskDrive& Y3 p2 `  g( S- u
  Win32_DisplayConfiguration8 l& w9 ^& U) f3 X& O8 M
  Win32_DisplayControllerConfiguration' ~# ~% L7 s; A7 j* d
  Win32_DMAChannel2 h/ C  L5 k& E/ G- x- R* X
  Win32_Fan
4 S9 ^' T; `- S/ T. j/ ^! X% L   Win32_FloppyController
) H! t0 {7 F* x! [   Win32_FloppyDrive
5 W7 R: O, U: b& c   Win32_HeatPipe$ x7 R* C+ \. {4 v; b
  Win32_IDEController
! H$ S& L" ~7 ~6 t% s! f   Win32_InfraredDevice) G* |% n& s- M7 u6 h) k+ ?
  Win32_IRQResource: L) ?  z3 F. T: ?$ u( @4 K! h
  Win32_Keyboard
7 v- a8 P5 d  k2 t1 ^: }! H- U: q: N   Win32_MemoryArray
  S0 m0 l' l6 H8 U) I* y2 w& Z   Win32_MemoryDevice
: _* Q: R9 t3 b" _6 I- W   Win32_MotherboardDevice
, T! }5 A6 t' [9 f+ U   Win32_NetworkAdapter
+ }* N- p% ~  _  Z7 ~   Win32_NetworkAdapterConfiguration: T' \( }/ g7 ~. Z7 }+ E
  Win32_OnBoardDevice
; ^6 A- y6 |' R2 m   Win32_ParallelPort
7 A: C( O* S; f/ a$ G   Win32_PCMCIAController6 v* ]; ^8 |0 m) f' t% Q
  Win32_PhysicalMemory
, P5 g5 P- ^$ `) E7 ^# |% V   Win32_PhysicalMemoryArray
) Q: G# t, \! G   Win32_PnPEntity
8 R# v3 |, A# D2 k4 T% V% q8 i   Win32_PointingDevice! Y. R  v+ d0 g  z- u$ Q& H
  Win32_PortableBattery
3 U9 a$ s" G. W5 Q7 o   Win32_PortConnector- G, C( z1 K' o* ~
  Win32_PortResource
1 C. D9 k# E, p4 d2 I" Q/ |. I) v+ Y   Win32_POTSModem' b9 n+ }% D* {7 h: H2 Y
  Win32_PowerManagementEvent
9 w  `, U- I& R   Win32_Printer2 Z5 n& V6 J: a1 U! C  w
  Win32_PrinterConfiguration
" K& k8 k/ J; o6 U0 h   Win32_PrintJob
) E! [4 \- ^2 i% s- d   Win32_Processor$ g  G5 N0 `; m- Z7 z& k* M; T, L
  Win32_Refrigeration
, f- Y- U% _- d   Win32_SerialPort
" Z; x/ g8 {; Q- b4 x0 M   Win32_SerialPortConfiguration& J% }' _$ M6 ~' ?1 i# l
  Win32_SMBIOSMemory
1 R5 n) ^$ P5 S+ X# ~# X  O. q& n   Win32_SoundDevice
2 h3 X/ ^: C- A1 Y( M% Y: F8 ^   Win32_SystemEnclosure4 _5 t1 o9 j7 \0 x: ?6 C
  Win32_SystemMemoryResource
, E: J9 e3 g3 E; o) I8 @" c$ x   Win32_SystemSlot& w4 s2 L4 ~8 D- a+ |) h+ a
  Win32_TapeDrive3 ]1 u1 H2 h8 I3 Q' X+ N0 g
  Win32_TemperatureProbe
4 N1 K  ?' i) ~/ I' X" t   Win32_UninterruptiblePowerSupply
& E( b$ T7 j0 {9 {& H   Win32_USBController
" u! y0 J2 ~4 B" B" h# ]/ h$ w2 G" K   Win32_VideoConfiguration
* Y, }9 p0 l7 H$ D7 Y4 H   Win32_VideoController% U% ?. E. K; E# P4 _+ x8 P
  Win32_VoltageProbe7 b3 f0 G4 H7 s2 w9 Q
& |- w! W2 G4 D# p6 X( j
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-4 08:01 , Processed in 0.016366 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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