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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者), u2 s9 O" ?6 L# y6 y

) R0 A3 A0 }9 N/ p$ [8 }
4 A' \6 o% x& m! }--------------------------------------------------------------------------------
' w& G& Q: Y4 H7 l; S* wWMI: Windows Management Instrumentation (Windows 管理工具)+ @5 J! v( L% ^5 a+ P, |  N
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
6 S" y, L) B  T9 V9 y   利用这个工具可以管理本地或客户端系统中几乎所有的信息。# f9 F( o2 a# p# E% p. k% R; U0 ]( u
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
0 e( m* A7 z; |# T- k3 c3 Y+ N& k
--------------------------------------------------------------------------------+ N' |* b% @4 O3 Q1 F0 N
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面7 }, {# I- r, L

$ v; a0 O$ `& I- W0 ?  p--------------------------------------------------------------------------------
6 }1 c  v* _+ v# V+ m① 初始化 COM 接口:% n  c3 w9 d0 h' ^8 X
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。9 J6 U0 z6 T3 ?; `" Z& K# R5 Y
  这两个函数在 #include <comdef.h> 里面定义。8 c. u8 ]. N: A( d/ `- M

/ t! O8 j$ l9 k! G- D+ S3 s② 获取访问 WMI 权限:
' P5 i1 ~" f" |7 f1 r   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
2 y. B% y# X. v# y   如果这个函数返回 S_OK 获取权限成功, 否则为失败。8 j1 ?4 k" |/ I# _% l( D. G; @5 F

  \4 X( @! q  w③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
0 g+ \2 g% F1 p! k. ]   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。, M' q) b( t1 y9 L3 M" j$ o

1 g+ O0 x" L/ S  P' L: Uvoid GetWmiInfo(TStrings *lpList, WideString wsClass). ~4 F: D' W8 J. g' h' B
{0 T, ?+ G) g5 o
  IWbemLocator *pWbemLocator = NULL;
" ]+ [9 j( b, X: v" \  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)# e3 i1 }: S9 s1 w" |
  {4 ]& E$ @8 d3 A% ~# M- q  U
    IWbemServices *pWbemServices = NULL;
' Z; r! I; t# c. ?: d     WideString wsNamespace = (L"root\\cimv2");; l) k8 f3 }3 v4 u- u. j) x
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
' f/ O/ z' _$ f; S/ U' `# e" g      {
/ O4 {% P3 ?6 n! E& k) f        IEnumWbemClassObject *pEnumClassObject = NULL;1 H- d, T3 ?" Q( d9 i3 X
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;# M1 E7 I& M7 N- p- s
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)2 R- a' ~7 d3 e2 P4 ]
        {3 e5 a: R9 F* Z2 u  ~
          IWbemClassObject *pClassObject = NULL;
$ O( l( J: t/ X0 j" s( Q3 ?           ULONG uCount = 1, uReturned;0 o8 ~: M. s7 G0 c& S: K9 E
          if(pEnumClassObject->Reset() == S_OK)+ O  {7 u2 H; e5 q2 K, n' @
           {0 X3 M7 x& f) g% p: O
             int iEnumIdx = 0;9 z, ~9 _% }7 u
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
1 v- C2 D" K4 c/ E& ?) |               {
: y. O3 G) ?- M2 s; r                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");8 i) n+ w! K- `( w, d3 y
  }9 p  B2 y, b' u- g# r
                SAFEARRAY *pvNames = NULL;; ~8 i" f. o6 v& M) Z& U
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
' K. Q3 L9 H, ]                  {) t+ g! I5 i' J
                   long vbl, vbu;, w0 t. E0 p3 l4 c& R, h9 E
                   SafeArrayGetLBound(pvNames, 1, &vbl);) p9 G. P  V1 H2 v
                   SafeArrayGetUBound(pvNames, 1, &vbu);
4 T) S9 m% Z4 k( C, q                    for(long idx=vbl; idx<=vbu; idx++)
7 l/ s3 A8 D) L! q                     {2 R8 m: {& F3 K
                      long aidx = idx;
  o. c5 `7 h) L, |2 B                       wchar_t *wsName = 0;; D7 T# B5 x, H2 d6 N
                      VARIANT vValue;0 B; ]$ ]  s- L; s! S
                      VariantInit(&vValue);( X1 C. @! V* d8 B
                      SafeArrayGetElement(pvNames, &aidx, &wsName);5 [4 B" \0 B7 h5 s
  T* F, i( `5 I2 q' g' h
                      BSTR bs = SysAllocString(wsName);
: H, u1 B0 e1 G0 p, F7 f$ y                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
2 Z6 @2 h3 J4 v( S9 E1 ?                       SysFreeString(bs);) T- D; y& W4 @" P- U$ A
+ m) b6 J; X( v* a
                      if(hRes == S_OK)) L( p( H3 I) M( _
                       {
( M+ P/ N) ]( ]; s& m( K1 K                          AnsiString s;8 W" }9 d5 t$ R' f( J
                         Variant v = *(Variant*)&vValue;
4 D7 f% s4 `; l4 C: Z1 \4 h                          if(v.IsArray())
3 |' x+ {7 N+ |4 x                           {- w2 Q, u/ q5 V" n8 K3 k
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)7 T- r3 b  Y& g# P8 ~4 B7 v
                             {
4 S  p4 b/ Y5 {: [* B. O0 b( x                                Variant a = v.GetElement(i);, u  x- d8 e4 q: C
                               if(!s.IsEmpty()); @/ W  J8 @5 j9 ]  k$ e
                                 s+=", ";
  l- w) s* ~, |0 Q  M1 Q5 w% u9 D4 G                                s+=VarToStr(a);
* R7 K) C7 \2 w                              }
; Z9 C8 ^' Q/ G5 N3 _                           }+ y( z* k  E, ~& s% {3 w
                         else2 D9 ^6 `" T4 `5 c- `
                          {9 u& J0 X7 Q( T: Q
                            s = VarToStr(v);
/ O, j4 T1 N# |: b7 n                           }
! l# z% Z, {2 @- q. M% z( f7 W7 V                          lpList->Add(AnsiString(wsName)+"="+s);
9 l0 f1 T! H/ }% Q3 [! [' M& C                        }
8 D% p" X: F. b( V- k( Z9 h: O5 x
                      VariantClear(&vValue);6 G# c! @; Y) y8 g, Z4 d: e! j
                      SysFreeString(wsName);7 N7 y9 G) K% w- q! W
                    }
& B  n) K# Y1 H# @( C$ O                  }7 y- i" [- G$ Y& x9 B; C
                if(pvNames)SafeArrayDestroy(pvNames);
! n; }+ h; Q/ J' E8 T( `8 o+ C( {                 iEnumIdx++;2 ?& F! T7 @, t( H4 K( l
              }
+ G4 e+ s; U# K            }
# ]0 O6 t3 L' [" M3 C' o           if(pClassObject)pClassObject->Release();9 }- n+ g/ x! L2 T! G$ B! I1 B
        }8 ^/ f, K8 o; U$ \! m) ~
       if(pEnumClassObject)pEnumClassObject->Release();
/ D" L' v( q" A2 M# d* b      }
- y" P: A9 y5 c5 U: r) L+ n1 D* v     if(pWbemServices)pWbemServices->Release();+ j  K9 D! e5 F* c+ J
  }
' M0 R& c& K& \4 U  if(pWbemLocator)pWbemLocator->Release();) r6 w- f$ b# [% L8 {) J
}, ~7 K# z3 q; w* R6 |- ]3 B
//---------------------------------------------------------------------------: X* t1 Z/ b0 K3 G8 Z+ P, i

7 b+ j$ ~/ d* t8 R// 通过 WIN32_bios 获取 BIOS 信息:' l; |( q( C' Y5 ~: I( U7 W
void __fastcall TForm1::Button1Click(TObject *Sender); k4 G. F8 Z5 k# s) m
{* ~- n  p+ }* j* ]6 u( F  F
   Memo1->Lines->Add("================== [WIN32_bios] =================");+ _4 d& a6 ^) f: B; s
   GetWmiInfo(Memo1->Lines, "WIN32_bios");/ d$ J- e  u# y8 k; |, h
   Memo1->Lines->Add("");
0 F% U# @  B2 P  @1 v; S: Y; h}) c; f8 ~4 v9 p  m
4 @2 y6 d- u/ O5 Z" z+ U! P1 i* ?9 g
--------------------------------------------------------------------------------
, t' A& X' v' Z2 C& }6 e' F. }+ |3 C' p8 a  o" e+ u" K7 k& }: t3 v
WMI 可以访问的信息类型有:: a( A; P* j' l. P' e, U2 F
  Win32_1394Controller( Q: s; R- ?  y) T* F: }
  Win32_BaseBoard' Q+ U6 [, `1 I! w2 Q/ H' i, U% o* S
  Win32_Battery
; S, `1 B3 y1 V4 R0 K3 f   Win32_BIOS
2 ^" H, `. f2 e3 g6 S6 \7 B( m   Win32_Bus# g9 y8 d, M2 ?- K+ A
  Win32_CacheMemory: F% {6 z( \. s7 x3 _
  Win32_CDROMDrive
. v$ P% ^$ D6 g6 D   Win32_CurrentProbe
2 C" s! e  R# z0 `   Win32_DesktopMonitor9 Z, G" w2 D. t
  Win32_DeviceMemoryAddress
1 u% {- r7 y! ~* [2 @# [   Win32_DiskDrive  Z! y/ D' `: R  V8 v
  Win32_DisplayConfiguration* T# U9 C6 _% ]7 D
  Win32_DisplayControllerConfiguration
* i+ ]2 K! v/ [8 H' ]5 ]   Win32_DMAChannel# H1 W; H( k5 Q6 y/ c$ R3 G- _
  Win32_Fan
# M4 [, s# E/ `' s# {   Win32_FloppyController
2 h8 N6 s$ e! B+ d$ S   Win32_FloppyDrive
5 ~, w8 h1 {- C# x3 R. y   Win32_HeatPipe* k3 x) ?! E  ^# i- k
  Win32_IDEController
9 J: q/ d; Q+ R" {6 o" j5 {1 R   Win32_InfraredDevice
2 T0 f5 z8 ^1 F9 U; V" X   Win32_IRQResource8 ?; Z; y! J0 W$ R$ m! `
  Win32_Keyboard7 ]- `1 l; l' G4 s
  Win32_MemoryArray* q2 F" t8 q; O! P6 o6 z  `
  Win32_MemoryDevice
, h; p# l2 W3 _: ]1 z   Win32_MotherboardDevice
) ~. y; U( C1 J7 I   Win32_NetworkAdapter
& g; H4 Z% G5 K3 z   Win32_NetworkAdapterConfiguration1 J% M( i3 C/ x
  Win32_OnBoardDevice
0 _$ q& U" ~+ h8 G: B3 o5 o$ C# y   Win32_ParallelPort
1 C" A8 d1 J" h   Win32_PCMCIAController5 l/ \; g# w0 G2 T/ M7 k
  Win32_PhysicalMemory
' j  e6 M3 p4 u8 ^6 _# Y7 q   Win32_PhysicalMemoryArray' u( i4 V& l2 a
  Win32_PnPEntity  @  F. h$ w/ t$ L) ?: ^
  Win32_PointingDevice
* ~6 a' {8 R7 {$ W& V' \% W   Win32_PortableBattery
/ C  A8 I$ w5 A4 n/ x6 c9 Y' t   Win32_PortConnector5 W/ s  `& \, T: x
  Win32_PortResource, d+ [8 O% n! ^( m- H9 Z1 S0 O! L
  Win32_POTSModem
% {* K! i! I9 M& M5 V   Win32_PowerManagementEvent
- n( E5 P- N. S/ }: ?   Win32_Printer
- n9 d, m5 @* [. U6 c7 P' p. f* ^   Win32_PrinterConfiguration
1 X" |4 x7 k6 p7 P& Y" t9 [3 a   Win32_PrintJob3 e8 N7 F+ C4 r- B
  Win32_Processor
1 D6 V5 V8 Z5 s& P% \8 D   Win32_Refrigeration
& j) x" E$ z2 O7 n# P' ]% W   Win32_SerialPort2 k  F( A# B7 |' A8 E
  Win32_SerialPortConfiguration
, j& W! W9 M& h& [   Win32_SMBIOSMemory
7 K8 N+ t4 e  G5 L0 F$ r# T! f   Win32_SoundDevice6 f5 p% ?! l8 H# `5 z1 N) r4 n
  Win32_SystemEnclosure
# x, N: j# N' C( A; |/ e   Win32_SystemMemoryResource, C3 W( D4 T7 }: ?- K
  Win32_SystemSlot
  i/ _; g! Z  B) C8 E% _7 A   Win32_TapeDrive
' E+ t/ v5 ~4 q+ O   Win32_TemperatureProbe: [7 ?5 @0 t; P* A
  Win32_UninterruptiblePowerSupply
1 @. H5 _. e2 s( I& L1 O   Win32_USBController9 `0 K1 `. A3 H. _2 }  l& c
  Win32_VideoConfiguration
) {7 O( P6 o. O+ I% C- V/ l% _) X/ k   Win32_VideoController, \7 v% d: W: e  n* z2 [1 G
  Win32_VoltageProbe  ]$ l9 Y: {# }+ C6 a4 O% i! z
0 J+ O2 z' x/ S0 u9 J! h7 s# C/ M
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-24 17:28 , Processed in 0.018892 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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