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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)% L& N" i# y( }7 N" a8 m( l4 ?

) h8 Y; M& n8 Z1 K4 O2 ~& w
4 @+ i* j: g6 K2 g--------------------------------------------------------------------------------' W( |" }' V5 M! j/ E4 C, c
WMI: Windows Management Instrumentation (Windows 管理工具)- v4 E; _5 f% z$ E7 N4 i4 X: M& G
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 5 O% v0 d' J# ?$ p) O
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
% r4 O; H, s1 ^+ G% t   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
2 m: i3 ?" n  g' j& k) P, D+ n
--------------------------------------------------------------------------------- ^+ {0 r/ [- v' q) a* M
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面' I+ y5 Y( i# z. y, n; k: F8 B5 M
' B. S/ f1 f( x6 s5 t! V; J
--------------------------------------------------------------------------------, r0 F" T5 a$ l( ?
① 初始化 COM 接口:4 [* V; l; H! ~" N4 b
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
; d; d% x/ a: U   这两个函数在 #include <comdef.h> 里面定义。+ s" V  ~8 ?% C
/ }1 d) d( Z2 V
② 获取访问 WMI 权限:7 ^4 F" M3 [5 }( @* Q
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);: ?/ l$ W) Z3 F6 c( @# s
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。" G2 ^6 N: A2 Z. c9 J, M
2 [! ]: i, J. ~2 T# y
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
& M$ K# b! \: S7 C   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
. Z8 ?0 G" j: E0 M' i+ ?1 s. b4 r& }& v" t7 _. h
void GetWmiInfo(TStrings *lpList, WideString wsClass)2 F: @) O3 L( M: V0 Z/ N
{
% {; w9 e+ X  Q& h- x  IWbemLocator *pWbemLocator = NULL;) H  W; I0 E' j. Z" X
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)' `" [8 l. g& a# U
  {
3 ~; b) A/ |5 _% W     IWbemServices *pWbemServices = NULL;
2 K' O  f9 q6 g% o$ ], \, Z     WideString wsNamespace = (L"root\\cimv2");& m, J% P  j. W7 ^
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)) F7 Y2 G$ G. u+ L: i
     {
) N$ u8 Y$ q5 H$ x& y; W( u        IEnumWbemClassObject *pEnumClassObject = NULL;2 R6 t# D% e, R
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
$ j/ q% k, s& o! a1 L        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
8 B& c6 j" L% d) h1 j7 ?$ K         {- A. t" P5 E4 D# Q8 s
          IWbemClassObject *pClassObject = NULL;
$ n5 e& R) L& G& c           ULONG uCount = 1, uReturned;, R8 n; P1 k$ b
          if(pEnumClassObject->Reset() == S_OK)
/ L9 M$ T: H0 _  V8 H8 {3 }6 z9 w+ V" V            {
6 `4 g; y+ q( n9 R! h$ u              int iEnumIdx = 0;1 ?  S6 d8 i9 G1 Q$ m- {
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
( W' K9 k; ~& |& m# M1 I# R               {$ Q! f4 a5 p. K" |% I
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
3 R3 q9 L3 J/ \+ W; c7 U- P: J$ w
- P4 B+ S" D; d" T' e0 A% Q                 SAFEARRAY *pvNames = NULL;
4 {5 \! ^" }% g" s                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
1 d/ U( D  \( G% h( G                  {
3 W0 u7 J1 |# R9 C6 U  @  I                    long vbl, vbu;+ P3 h, L5 `7 h0 ^! M7 u, g- v& J
                   SafeArrayGetLBound(pvNames, 1, &vbl);" T0 l  m3 q) T3 k
                   SafeArrayGetUBound(pvNames, 1, &vbu);
( K# w8 ~9 z6 d+ n                    for(long idx=vbl; idx<=vbu; idx++)
5 @9 }5 U; ~9 Q                     {
1 H  ~& I7 y0 a1 W, A  [4 N                       long aidx = idx;
0 C, b, {  O7 a( L9 Q                       wchar_t *wsName = 0;
, @3 R9 N7 u! c- t$ v* \                       VARIANT vValue;
, ]. \' [  `0 n4 n; M% q4 B! d                       VariantInit(&vValue);
9 b8 o5 q" c% C& g  r                       SafeArrayGetElement(pvNames, &aidx, &wsName);
8 L! b* y! t' y+ b) t5 a' [" e. f& `( y- g# f3 {- G
                      BSTR bs = SysAllocString(wsName);
, I2 o. w7 [, J; b                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
; j( M/ ?9 g0 H, E2 A4 {* ~- U$ [                       SysFreeString(bs);: _- I$ |' I6 E/ y+ n0 S# \: X2 b
5 k0 y: U) e- \/ J/ \$ G1 {
                      if(hRes == S_OK)
6 c: M3 G% O9 z5 x" ~4 G                        {/ p1 q0 e4 m' I4 Z5 c% B+ \& z- p
                         AnsiString s;9 n3 T4 r; |' |' c7 R
                         Variant v = *(Variant*)&vValue;
2 i! R' w' f/ o# j8 N& K7 A                          if(v.IsArray())7 `1 |1 g- ]( M/ U6 K
                          {# g" |: H: ^4 B* e$ R- V5 M
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
, r: _# E8 A- T6 _! z3 }                              {
% ^0 w3 W/ c" a2 n                                Variant a = v.GetElement(i);
2 e. U, k0 l  O5 x! c' `                                if(!s.IsEmpty())6 K2 p: X1 ~9 W2 T
                                 s+=", ";" v/ u- m7 \2 P# B
                               s+=VarToStr(a);2 W9 j5 g9 C: @0 c8 x5 L( H
                             }
: S9 B9 S9 a1 M% u$ m1 O) A                           }4 G7 S9 G- o, y% }
                         else0 V5 Y: q7 n  A2 X! j
                          {5 X0 O: p- }) C" R$ W* z0 L! T" v
                            s = VarToStr(v);' w9 R: n0 G- W! k1 I
                          }
/ n" J+ g% i8 |& |* p6 }6 g$ [                          lpList->Add(AnsiString(wsName)+"="+s);: T/ r& }# R0 K5 b+ N3 b+ h
                       }6 u' P5 u$ |8 ~, s# @5 ~7 v- o& P" o

  b# r9 x1 m$ Y. C                       VariantClear(&vValue);
: ?$ w7 ?3 w5 P, B# L3 }: {. V                       SysFreeString(wsName);2 B  \- I6 |7 y
                    }8 {& v4 Z7 o3 l6 C8 m
                 }9 Q! {0 \$ d7 S4 r
                if(pvNames)SafeArrayDestroy(pvNames);
; J: `% e4 s# [  D% f+ A! ?                 iEnumIdx++;
5 a: P+ F! Q( o3 e8 @4 b& n               }$ U% m7 ~6 z% L! O5 k
           }+ G( ?, R! g6 f
          if(pClassObject)pClassObject->Release();* z+ Z9 B: F* V. ^5 A
        }
3 y, _) }4 n  p3 X# {. a3 V        if(pEnumClassObject)pEnumClassObject->Release();% M) C' _) H/ a- X6 k- f. D, f
     }6 e! |8 N# m5 }+ r0 Y
    if(pWbemServices)pWbemServices->Release();
) u/ P7 c" S! y: g$ H   }
" W7 D, y8 f- e: L8 H  q  if(pWbemLocator)pWbemLocator->Release();
' ~3 V' l) \% u( C}
( G" ~' W+ m* R//---------------------------------------------------------------------------/ u0 q  C* S& \% s/ j1 p

1 V5 b0 q; Q3 [// 通过 WIN32_bios 获取 BIOS 信息:
8 k! u" M: b, T% ?void __fastcall TForm1::Button1Click(TObject *Sender): X1 u1 [4 a. I' |/ b5 n. k6 m3 s
{# y4 ^6 N$ H4 E* I8 e- H
   Memo1->Lines->Add("================== [WIN32_bios] =================");
6 @/ G/ U, d: |    GetWmiInfo(Memo1->Lines, "WIN32_bios");
  x( ^( e3 r) B    Memo1->Lines->Add("");
% w- Q5 w% }" a. g; X- H}- z- Y+ U/ F1 z* J- D

( Z+ K2 D) P6 d" ^% W; e0 A' p--------------------------------------------------------------------------------) [: U6 E2 i. H6 m
$ b! ]5 Q& g. {' z$ P; L
WMI 可以访问的信息类型有:. ]% x; s! G4 t
  Win32_1394Controller
6 G7 }/ r2 A' a   Win32_BaseBoard
1 R4 G; e8 O- w% c7 a* b   Win32_Battery+ c  d$ k6 j# l3 A& _6 Z1 I& T) V
  Win32_BIOS0 g- u& }% Q6 H6 S: v
  Win32_Bus
4 u/ Q  H+ }" s* h! X3 X1 ~/ R   Win32_CacheMemory
7 A. ?5 R, A5 l- |! |   Win32_CDROMDrive8 B1 V4 T6 s1 C, H9 j" H8 r: J- ?
  Win32_CurrentProbe9 U; Y& u" f3 E' s! Z
  Win32_DesktopMonitor9 F. I/ i! ?4 Y5 r
  Win32_DeviceMemoryAddress
# m& s# U% ^. y# ~; O   Win32_DiskDrive
8 N4 k" X9 g# j   Win32_DisplayConfiguration
3 O& d+ h% G* }3 G, M   Win32_DisplayControllerConfiguration1 j( e0 ^- Z% v+ y% G
  Win32_DMAChannel
& I' S: {+ U6 V: q   Win32_Fan
6 Q% o% r6 z. A: ~   Win32_FloppyController0 _' L0 F+ R5 T, I0 S4 W7 V/ ^
  Win32_FloppyDrive
& l* s6 S# D5 v2 m% J3 C: s   Win32_HeatPipe
' A# [' ~; l. }6 [, ~8 Y. N5 a9 z   Win32_IDEController& n- x: N3 @4 c/ m# M; j4 {
  Win32_InfraredDevice2 j% s- q0 g6 a
  Win32_IRQResource
2 C; _0 X5 o5 g& ?  @   Win32_Keyboard; |' e# p& o. _
  Win32_MemoryArray* p0 ^, A1 X7 M8 X4 c* G
  Win32_MemoryDevice
  W# G4 h- O/ A9 i* b/ w   Win32_MotherboardDevice& f5 P8 i7 {' r! D8 t
  Win32_NetworkAdapter* s7 i' m: c* G  B) r% y) Y
  Win32_NetworkAdapterConfiguration9 S5 `2 v" o$ r8 F) O
  Win32_OnBoardDevice
. r6 o# c+ v. h4 B& ^" k   Win32_ParallelPort  V2 y* Z7 C" V& J% P. B( F) ?
  Win32_PCMCIAController
* F7 O+ W2 g5 Q& [1 r8 q5 K- F   Win32_PhysicalMemory6 }6 p: X' q; \; Z4 F
  Win32_PhysicalMemoryArray
' {4 e" ?! A4 U7 m   Win32_PnPEntity, o/ y; B2 ~* l! y; V7 C
  Win32_PointingDevice
$ [! m2 C8 _9 ?& b' Z. L. c2 ~) ?   Win32_PortableBattery
. o! G3 R! G  D; w7 D5 n/ W3 D3 j9 T   Win32_PortConnector
& Y7 J5 r. n" n8 Y( A) D   Win32_PortResource. m2 Y& X; ^: m! w
  Win32_POTSModem" z6 ~2 u1 u  j. O
  Win32_PowerManagementEvent
* p! ]% `9 f" V9 x& d: ?   Win32_Printer
: R# F8 i5 H7 ]- y7 R" f: w   Win32_PrinterConfiguration1 z: \2 l3 a5 x) D
  Win32_PrintJob, Q3 y- W! i4 \
  Win32_Processor
" ]1 A' u3 L% b- P7 M% e   Win32_Refrigeration
9 g& Z  p% x, `$ I8 q   Win32_SerialPort: e; G0 X0 u) m% w$ h: f
  Win32_SerialPortConfiguration9 F. \* f5 r) m
  Win32_SMBIOSMemory
( y9 _+ b* l% \% I1 E9 ]. e; H  j   Win32_SoundDevice4 h5 j7 j7 l( A) Z* i
  Win32_SystemEnclosure
9 o4 H  Y5 ~1 V/ R0 v9 k% q   Win32_SystemMemoryResource
* q1 Q& ?6 d7 W( J" y# Z   Win32_SystemSlot  Q8 X$ c( o! V7 F: b! ]
  Win32_TapeDrive* m7 D3 B* {* l/ \7 r/ j
  Win32_TemperatureProbe
7 x9 o5 a4 P* p: q. c8 d) M* s   Win32_UninterruptiblePowerSupply1 R* C) A% ]) k6 ^( i. z: @
  Win32_USBController% K8 ?) K3 N+ [; ]! l
  Win32_VideoConfiguration
$ ~" z3 c: F* z1 j0 o$ s   Win32_VideoController
( T: I6 Q* M1 B: R3 \   Win32_VoltageProbe
$ v; q- R, S- T  S: {1 [( E1 {) X% w* k7 C
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-2 02:00 , Processed in 0.021484 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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