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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)7 k  I# r$ D. ^4 B2 F% L

+ n! J5 w  Q: K/ ~- H$ w0 U9 y* h1 T5 r/ P5 e  v
--------------------------------------------------------------------------------# D- D: k* o8 E+ v$ d* e
WMI: Windows Management Instrumentation (Windows 管理工具)
6 Z5 ~: p% y5 {   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
( {* ~* Z: p* a6 V1 c0 e) p2 N5 s$ B   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
6 k8 P" ^, B5 W6 n% t( v   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
6 s7 k) S' @" Z/ O- v0 P; _
# y# v9 t( m; e. ]--------------------------------------------------------------------------------; K$ ~) ~( h+ V6 \1 g) u8 T
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面% ]" }# E5 L, s* b' t
. ?6 p- T; A, k# ?, a9 W' ?' T
--------------------------------------------------------------------------------
7 l' O% G! G* R- T① 初始化 COM 接口:
% d; `- I8 f& r# k- j# _6 h$ W   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。# k% B& j; J7 R+ |6 h: P
  这两个函数在 #include <comdef.h> 里面定义。
( S4 |0 Q3 b* F* J
! G8 O/ ?0 p, |" Y! @8 M② 获取访问 WMI 权限:
6 T% \* a7 C% L' G- z. [* v   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
. w9 t! d0 ?8 j- v6 S0 j   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
  I) G2 w1 t8 g) A) d" Q3 g  a0 M
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:; V3 ~0 W2 {( B
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。3 l- L/ Q0 s' }# q' B1 [
: A* m% \' T: M
void GetWmiInfo(TStrings *lpList, WideString wsClass)8 d) F: a) C5 U
{
+ A" b5 m: v8 [+ f  IWbemLocator *pWbemLocator = NULL;
& v7 J2 a. f! a  \  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
. ]4 z" ], c5 u% u: T   {; G/ S% P+ F4 q% ?6 K: J2 v0 N
    IWbemServices *pWbemServices = NULL;; E7 O, h- j3 v" a
    WideString wsNamespace = (L"root\\cimv2");
1 E0 K% y$ W. k+ n# u& c- o     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
; i9 Z/ \- N- U" [7 k      {
' ?# z6 x3 S$ L; i        IEnumWbemClassObject *pEnumClassObject = NULL;: t5 s! R9 r5 l0 P2 X
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
: |7 c+ P& u" J8 F: i) ^% V        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
+ |/ Z$ M# Q! p% [# E         {
/ P! C( f) H+ N5 Q* }2 f% a( ]           IWbemClassObject *pClassObject = NULL;
! O8 r# B- `8 [: V           ULONG uCount = 1, uReturned;& ^0 e8 D8 v6 p
          if(pEnumClassObject->Reset() == S_OK)
5 x# r& t4 B$ P3 B! ]: V; k7 u3 e$ P            {
/ |; \" K! J6 [3 k              int iEnumIdx = 0;
) Z# Q, S: `! G4 o3 q              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
4 O4 }7 \' |" q# y) B" c  T               {! A% T5 T9 D6 A5 E, b
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");" h; l0 C) x3 }2 V  b

, O$ U2 k3 q/ a) L; E6 ~- F                 SAFEARRAY *pvNames = NULL;: \$ B8 n7 G  r: I
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)& f5 K7 {& Z# Y9 [9 X. Y
                 {
4 T% H! n1 @0 q0 ]1 ?2 H5 Q: t                    long vbl, vbu;, U( s- |! C" I' H% j$ `
                   SafeArrayGetLBound(pvNames, 1, &vbl);+ ~* _+ l) R1 y5 E% t
                   SafeArrayGetUBound(pvNames, 1, &vbu);
0 i7 [2 [2 w/ o* X# ^6 H# ?. G                    for(long idx=vbl; idx<=vbu; idx++)
; H* u# \1 d. y% F% Y. ^1 H* T4 ~                     {6 F* X1 I5 U/ j% t: N/ D
                      long aidx = idx;
) \8 Z/ a. m0 \' q) C/ P                       wchar_t *wsName = 0;
" s  y, Z* \4 V* x: {  _, V                       VARIANT vValue;
9 M  X6 }2 @1 z! C( r                       VariantInit(&vValue);* a1 R, L7 b; I# s$ C4 f5 O4 e
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
  d1 D, r: z: w# ]7 i! g8 a9 C
1 B7 [4 O4 O! l0 t  |" v- T                       BSTR bs = SysAllocString(wsName);
. R  i, X. t: X                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
# A3 N( w1 V; [' D& G0 \9 I% S                       SysFreeString(bs);
4 U' V$ [) v8 }7 B4 D6 A
/ E  m" a9 Q) S1 F# G                       if(hRes == S_OK)/ R% R$ M- I$ d
                       {
: y0 `2 }8 @  y                          AnsiString s;, Z* M) T, o+ S
                         Variant v = *(Variant*)&vValue;- j% U) E4 O2 n( }5 t+ i  H/ k: ~
                         if(v.IsArray())
; W* W$ |9 D% L$ f" r' `                           {
" o+ M( Y  Y1 h+ ]1 H8 j                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)8 ~( \; O& f$ ^* \
                             {: `3 P, Z- S- Q9 [8 O" s# x+ z
                               Variant a = v.GetElement(i);
, _3 q- T5 S& Z                                if(!s.IsEmpty())5 ]1 b4 a6 [1 e  M3 a: |4 d( V& L
                                 s+=", ";
$ d) r! V6 _4 |$ \8 i                                s+=VarToStr(a);: c" G. w: P0 R) }. f1 V2 f, h  C
                             }/ @+ _, h: f3 G. N: P
                          }, m- ~% o; s. @
                         else
; o- Y" d' V8 c' |) B9 n7 L8 Y                           {. B  r/ @; t; {
                            s = VarToStr(v);
3 ~( x5 P; A$ _. k- l7 x, Q                           }6 Y1 e# I, g: V. f5 z& t4 i
                         lpList->Add(AnsiString(wsName)+"="+s);. j) X1 T3 _! d* z
                       }0 |" G) j+ |6 O' \; g
# [# H9 W. c9 w8 J. ]% ^
                      VariantClear(&vValue);5 b. q0 Q! Y' Z# w$ z% V2 B
                      SysFreeString(wsName);8 b$ c6 f2 Z6 C# q3 ~. ~
                    }' p3 I1 u, p. D. Y7 A- T  g, g
                 }2 R7 S8 i& Z) |6 y+ E2 o
                if(pvNames)SafeArrayDestroy(pvNames);
" k+ G7 u: G1 K  X% \( B                 iEnumIdx++;' S) g+ g% ^5 V) @- e  u* r
              }
' Q, o4 F5 }; Q% @            }  V# `/ m8 k) y5 }# }
          if(pClassObject)pClassObject->Release();
; h8 H+ y8 X  ?- j8 \: P& M7 N5 E. O8 [         }% W9 E  ~5 F( @6 f
       if(pEnumClassObject)pEnumClassObject->Release();; e3 v7 \* D# I: X3 K
     }
! M- F' Z2 _4 i. d  }: B1 i" N     if(pWbemServices)pWbemServices->Release();. ~" ]$ \2 D, \: z$ W% s+ m
  }3 A+ X" |2 @% R) p' A; i2 ?2 C& a
  if(pWbemLocator)pWbemLocator->Release();
3 S: D4 k7 x9 z' k}7 Z3 M$ L4 s0 G% h
//---------------------------------------------------------------------------
" `* |4 h) C* T9 W. Y3 k3 W3 B" A$ |% D; y3 @4 R
// 通过 WIN32_bios 获取 BIOS 信息:
  p! ?! W* m. y  Hvoid __fastcall TForm1::Button1Click(TObject *Sender)3 P) \. Y3 r3 H. W9 H; k* Z
{
1 t! Q  }1 y. C    Memo1->Lines->Add("================== [WIN32_bios] =================");0 g5 P: k0 V' }" R: Z! [+ H
   GetWmiInfo(Memo1->Lines, "WIN32_bios");* C; `6 v2 I+ @( X+ u, e: `- T8 O$ Y6 N
   Memo1->Lines->Add("");6 a# ]6 l% X# F2 q0 b- I
}2 K+ {" y& [' j: x/ Q

: }% P6 M$ u( r1 Z. Q! ^--------------------------------------------------------------------------------) e1 t8 F5 Z% d" j* g" v2 ?5 I
8 M/ a0 G. M/ R; y
WMI 可以访问的信息类型有:
: @* |* J) Y# G   Win32_1394Controller: _8 t" ~7 G* t& _7 G9 n" `8 ]
  Win32_BaseBoard: C. V8 s$ C+ P
  Win32_Battery
1 L9 Y; n6 z  Z7 ~7 z" `3 a9 Z   Win32_BIOS
' p0 U2 {: f' z4 I: m; |   Win32_Bus
" M. C+ A; u' v6 X" |   Win32_CacheMemory7 _; \4 I9 ~+ ^. ?* I( ~+ A
  Win32_CDROMDrive9 g! ~! G3 {# Z) q3 d
  Win32_CurrentProbe# U2 {" p0 L0 [8 V2 i
  Win32_DesktopMonitor
% I. G) F5 C9 {% n( V( X+ Q   Win32_DeviceMemoryAddress$ U; n4 E2 `. s- F: ], X4 Y4 C/ a
  Win32_DiskDrive
/ [9 z4 ~) i* z   Win32_DisplayConfiguration
7 X4 I. F7 s& W  o   Win32_DisplayControllerConfiguration) ~1 t7 D* d" C, e
  Win32_DMAChannel* B. X/ ~; J' v6 H
  Win32_Fan
5 T  a1 @/ u2 U0 x   Win32_FloppyController
& f( D/ x4 g0 t7 h; P& ^3 M   Win32_FloppyDrive
2 d$ H2 f) s$ c& @6 X+ S' H   Win32_HeatPipe( S$ f5 a3 D* _( W5 P$ O
  Win32_IDEController) i$ A% J0 U  L- R, [9 O6 j' |
  Win32_InfraredDevice/ ]; R: O; T5 U: \
  Win32_IRQResource
& b6 `( l. H3 f& a8 g   Win32_Keyboard7 B" P6 N1 S5 U' v/ g# K
  Win32_MemoryArray
6 A# ]& Z7 p8 f4 M! F   Win32_MemoryDevice
5 h8 X9 {0 `* W   Win32_MotherboardDevice
8 i! |0 C! U8 K0 V% D7 ~   Win32_NetworkAdapter6 \- w% Y! |4 a# e" x/ {+ H
  Win32_NetworkAdapterConfiguration: O0 w6 b& ]* H* `% }* a
  Win32_OnBoardDevice& g2 Q$ J8 L$ P8 l5 I! D2 K
  Win32_ParallelPort
4 I& U8 }* ?6 b! }5 ^   Win32_PCMCIAController
% s1 ]0 A% ]+ i   Win32_PhysicalMemory
' }1 w- W1 M0 S9 G; F$ K8 z   Win32_PhysicalMemoryArray  a' K4 @7 |: l# {* M, u/ M) {# N
  Win32_PnPEntity! B9 s8 X5 k5 L3 l0 n) F6 }
  Win32_PointingDevice; V8 U* Z* n# D, g/ c
  Win32_PortableBattery$ O6 Y5 k6 ?% d: Q& t# Q; m
  Win32_PortConnector
. k+ S$ L- u2 C7 w& L& _' B   Win32_PortResource( ]% U) }9 |$ w0 j* @+ G
  Win32_POTSModem  G) j# @- S& A' x& E% l
  Win32_PowerManagementEvent
  N6 k' ]5 i7 V2 Z+ x   Win32_Printer  G; _2 S5 v; M& S4 r1 f& b
  Win32_PrinterConfiguration
% f5 u3 ^% Y5 @' p- ^   Win32_PrintJob4 J. C2 S) ^. T7 ~7 q8 z" z  d
  Win32_Processor
2 O; c. w: A! J  R) Y  q   Win32_Refrigeration
+ N9 k( y& j( b( d% O5 ?% J; j   Win32_SerialPort" K/ x5 |  |6 A4 @9 v
  Win32_SerialPortConfiguration2 K2 r% J( a3 t. f5 G# d
  Win32_SMBIOSMemory
8 D: x6 y# {+ e/ `   Win32_SoundDevice
+ ?0 r4 r& c5 {5 p. O  _. L   Win32_SystemEnclosure3 [7 `4 ]) w' O% ~' A
  Win32_SystemMemoryResource0 |. {: ]% F- ^0 x% J5 \- C! t) M# C
  Win32_SystemSlot
0 r1 c8 o- [. z% O! K   Win32_TapeDrive
. e  t$ V  m4 j" ~6 N' ~3 _   Win32_TemperatureProbe
" z- D' c7 `$ u7 d) |( h   Win32_UninterruptiblePowerSupply7 r9 V! M# b1 m7 V
  Win32_USBController. Z- I+ Z4 ]4 \2 y
  Win32_VideoConfiguration
2 A5 V! h5 H* J: V; Q# H   Win32_VideoController# X6 w; g/ q, W8 D; @9 @& j; j0 K
  Win32_VoltageProbe2 M* Y8 ^, P; d* ]) \
; R# ~- h1 t  S" m# }2 T% _
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-9 22:39 , Processed in 0.019210 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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