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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
/ F  p6 {$ d5 p( j6 _" p* {+ b/ c  ]# b9 a" y& E
9 j4 f1 z2 a: ~, {# L7 t
--------------------------------------------------------------------------------( a  h) r+ M) ?: x7 ~6 X
WMI: Windows Management Instrumentation (Windows 管理工具)" y& s( R. U" `
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
4 ]" z0 L; Q3 R   利用这个工具可以管理本地或客户端系统中几乎所有的信息。; k" e+ K3 p) e0 U2 i9 O
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ' M* B+ ^- Z6 H5 p

( v8 [4 e+ E' u4 W- F- I2 J' k--------------------------------------------------------------------------------
1 Y" }  ?% @: f9 f2 j# [  ~BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面$ Q, Z$ F. `5 J( J8 }% x

% `2 p9 g4 G7 J, \  V3 w--------------------------------------------------------------------------------9 s" K* ~+ T: C  @, {, f
① 初始化 COM 接口:8 p- T# K4 d8 @1 @/ n
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
# \% D. \0 v3 w6 v% \1 D7 j8 d   这两个函数在 #include <comdef.h> 里面定义。. J+ I& d+ r' x  l% A# }' Y+ l

$ ]  h* Y/ T  T8 x② 获取访问 WMI 权限:3 [: [9 ]0 D6 A: J7 X8 m0 p
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
) ]1 t. K& L% V" m, `   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
! a) I1 j5 o7 v: B' u$ d! p& n; O9 G2 H' O. v( Z+ V
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:5 s1 }: J- a0 ^, f& i! U
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。" x4 Y$ k1 i3 `  Y4 V' O9 a4 N4 a9 h

4 c* n% |  D! d: fvoid GetWmiInfo(TStrings *lpList, WideString wsClass)" z% l; d. H) W: e5 a  V
{
9 a9 ~' @8 ~/ o+ a6 _2 k  IWbemLocator *pWbemLocator = NULL;
7 F. X) I8 v! P' ?" @0 A  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
2 N1 Y( c/ @7 Y1 E& z   {0 C0 p. B  K" _3 H; Z- b. d# `, v
    IWbemServices *pWbemServices = NULL;
9 Z, A1 k! D3 V# K* L; |( i7 K+ a     WideString wsNamespace = (L"root\\cimv2");7 l: a  U' r" X4 E
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)  _7 H9 p% X- R& j$ j& u: l
     {
3 L6 u5 o* G3 [' _; |# R- y        IEnumWbemClassObject *pEnumClassObject = NULL;
$ m/ i& q; H: `2 b) X& [        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;- q- l" K* F; v1 J* ~+ [
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
' p0 C* O- L0 s% r         {7 g- u2 K! |$ w" ~
          IWbemClassObject *pClassObject = NULL;
3 }$ F: q& Y+ A# H           ULONG uCount = 1, uReturned;
" M# o: {# n5 |7 X4 E  T% C2 m) C           if(pEnumClassObject->Reset() == S_OK)$ d: }. p$ C/ B' f) z
           {& Z) M, e  z: R3 q- F; u2 L# ]
             int iEnumIdx = 0;/ D- Y3 }, T) K8 \: V, d" Q
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
& {  X  e' r; O0 N. ]               {* R7 N2 T4 K& u* {% {. F
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
# d5 z# J: Q/ ?; d1 T# f5 L) j9 G8 h4 x+ ]5 {; a
                SAFEARRAY *pvNames = NULL;
- n. E& a3 p, A& k                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
3 [  N6 n: Z$ E" j2 h- p                  {5 _0 _) g' ?( N  R! X, e3 u" n2 E5 r
                   long vbl, vbu;+ L* O. E* m1 k4 o
                   SafeArrayGetLBound(pvNames, 1, &vbl);8 c, r8 s7 A6 k: e1 ]
                   SafeArrayGetUBound(pvNames, 1, &vbu);
1 N% f. }- R$ f                    for(long idx=vbl; idx<=vbu; idx++)
! m* {* m0 M- G- `! G& L4 I' P, d+ i                     {
# g) J  n% Q  n% f                       long aidx = idx;6 H) t( s7 o/ Q2 P
                      wchar_t *wsName = 0;: w% h8 _: m8 [! x! X  Q. e4 ?3 T
                      VARIANT vValue;
4 d, T9 c' n8 P                       VariantInit(&vValue);
  r5 d$ `% G, e6 c                       SafeArrayGetElement(pvNames, &aidx, &wsName);( r1 e/ L) q, l4 ?

# i: Y7 d! d) ~8 o- l: D- H- K                       BSTR bs = SysAllocString(wsName);, |9 ^' Y. k( I2 ?1 g8 ?, ?- Z
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
2 f3 }* e1 J& [: @                       SysFreeString(bs);' P: c8 }1 t2 A4 y, @$ j8 E

9 i1 [( y/ v% b* h- I4 {# m" r/ t1 b                       if(hRes == S_OK)
) r* u, I. M2 n5 A; ^+ F, }                        {- W. q  x, j" W4 x; F: e
                         AnsiString s;
' ~# e; E: s  F1 f# s                          Variant v = *(Variant*)&vValue;
4 a- [' o& p" z  S& Z  L                          if(v.IsArray())
& K& Q# [' q, N1 O                           {& v3 L7 v' Q; K2 j" Y
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
! N/ b1 v: D9 _/ u: u                              {. s- t# k# L( M# q, \2 D/ C- E8 k
                               Variant a = v.GetElement(i);
3 F5 ~9 w$ D; c9 q% `* t. d6 B, r$ @; Z                                if(!s.IsEmpty())3 w* c& D% o: p, ]$ L; g: A/ k
                                 s+=", ";  s, J. r- z- ^6 H" W
                               s+=VarToStr(a);; w& z) U7 H" X$ B2 f! ?
                             }) o) p% h7 i6 a+ f
                          }
. u  _! A( O1 P. T                          else+ {) R0 N# ^8 [  u6 z
                          {
# d! O, `, O& |1 X                             s = VarToStr(v);
' ^- B" P7 p0 t6 _3 B: C4 P                           }3 u$ p/ p, }- {7 }- B. q0 S
                         lpList->Add(AnsiString(wsName)+"="+s);0 d! |2 q0 e; U5 H2 {, J# n
                       }; J/ p3 V% q- r/ n

) e6 [. ^$ G; j' D7 ?                       VariantClear(&vValue);
- r! }/ t0 g2 q/ v                       SysFreeString(wsName);' H, z. g, k3 G( b% Z1 F8 h  `. I
                    }
  V+ [/ ~$ a- w$ D4 C3 m$ d/ d                  }
5 m* ]3 z. Y5 q, o& W# s                 if(pvNames)SafeArrayDestroy(pvNames);
  f5 S% v- ~% W) t* F9 {7 L+ o                 iEnumIdx++;
: y" y) V' C9 w% ~7 w+ w               }
- w/ L- q, s/ a' u. J            }
% l+ [$ {# k0 a5 N1 w           if(pClassObject)pClassObject->Release();* A0 {! B( b1 \; t# E2 [& Q) x# N
        }
0 h" Q* f3 u' s) j! I* q( ]        if(pEnumClassObject)pEnumClassObject->Release();8 G! G" D4 b5 ~8 B
     }
* l: k, V* e+ u. u: J4 ^* d+ T     if(pWbemServices)pWbemServices->Release();
8 _" ?* D2 Z6 J, m; t+ H   }
8 W+ H$ p" x9 R3 ?# u  if(pWbemLocator)pWbemLocator->Release();
- q8 a2 H, z( P. E* T}
. U; L: T: {. j5 l' ]0 v% H6 C; x& p//---------------------------------------------------------------------------" h( S7 E$ ?+ t8 o
9 k9 M: `% H4 \; Y0 F4 ^% o4 P
// 通过 WIN32_bios 获取 BIOS 信息:
$ S/ B9 }9 z/ \8 avoid __fastcall TForm1::Button1Click(TObject *Sender)& r: M3 r8 F6 C
{
7 M9 J# e$ G/ y' |3 X  G, a# `    Memo1->Lines->Add("================== [WIN32_bios] =================");! _; q: b" ?/ s9 Z8 _
   GetWmiInfo(Memo1->Lines, "WIN32_bios");: G7 n0 x+ a) D8 M8 E; M# d
   Memo1->Lines->Add("");
, C' I: F  Y5 V9 d) f2 A( ?9 ?}
0 V$ p# D  b, Z4 c: r: X
1 S) k" Q2 H# W' E--------------------------------------------------------------------------------9 g& ~) k- s/ d/ c) U: `' J% q. g

; m3 u( }5 J3 K5 D: {7 lWMI 可以访问的信息类型有:
  G+ N. E7 U0 K/ I$ D   Win32_1394Controller: X8 Q: F. Q0 Q, ^/ ~
  Win32_BaseBoard
2 w6 w$ j" [. @   Win32_Battery' ^# D1 _3 @$ B0 D
  Win32_BIOS
+ c) a2 V( [, T% k$ F   Win32_Bus
4 A/ v4 M* x1 C7 R+ e6 C6 d   Win32_CacheMemory
% z. t5 K; w  o. ?   Win32_CDROMDrive
- \$ w0 Z( x7 B1 G   Win32_CurrentProbe) l- [8 l9 D* ^4 |* Y& Z; q
  Win32_DesktopMonitor; F+ l. d& z* p2 N  l6 h
  Win32_DeviceMemoryAddress" {' V: o/ w& ?& V8 K/ ]
  Win32_DiskDrive% t3 c. G! [; Y- C8 N( i$ c/ i
  Win32_DisplayConfiguration1 l1 ^. z# l4 L- d7 n* O
  Win32_DisplayControllerConfiguration8 Y! x1 G% r- G& U. d+ R' t
  Win32_DMAChannel
) [1 E- C( B& S* j   Win32_Fan
0 \$ b: Y  b' }! Z+ @   Win32_FloppyController
8 ?6 {% i& j, k5 T   Win32_FloppyDrive
8 F7 m# g# q6 T  k   Win32_HeatPipe4 e* @' U" [3 Z. F' I
  Win32_IDEController) g# ?& E8 b6 R- F
  Win32_InfraredDevice+ c& R# T5 U' }. a' F
  Win32_IRQResource
, h+ Z7 |7 d  l8 D! N5 r9 @   Win32_Keyboard+ o7 `  A+ j1 O, V
  Win32_MemoryArray  @% W% X1 A4 Z( h. X
  Win32_MemoryDevice7 n1 U2 b( D' m0 |: k$ Z  [* f( O* E
  Win32_MotherboardDevice
% a5 H- ]; N" X2 r/ I  A/ P; @   Win32_NetworkAdapter( ]2 B0 ]# i. ^! Y, a  C
  Win32_NetworkAdapterConfiguration+ {; D8 G4 D4 @: c' V
  Win32_OnBoardDevice- L+ r/ v- z3 f: K' z' N, O0 c
  Win32_ParallelPort9 j( ~# W* H/ `( {7 G4 k' H* d% n
  Win32_PCMCIAController7 b: y" t4 i! R* s
  Win32_PhysicalMemory
/ l8 J1 m; @- x" S7 }, Y   Win32_PhysicalMemoryArray
/ \; z' {* ^  A! T% `6 q  Y6 J   Win32_PnPEntity3 M% E2 f0 g: s
  Win32_PointingDevice
' h& O, w7 N  a) y# h5 @   Win32_PortableBattery
4 H) [' B* R" U$ M% N& i   Win32_PortConnector
  U) w( x" F" o! N3 ~* l   Win32_PortResource
" }6 ]- D, P: f- \   Win32_POTSModem
3 a. P5 ?2 j! y$ q) v   Win32_PowerManagementEvent# v- e3 E2 L! i+ N3 m$ z& w& c3 I
  Win32_Printer
' a6 y! g; B0 h' J( J: q   Win32_PrinterConfiguration1 P9 z4 ]0 Z7 q. u
  Win32_PrintJob
6 u$ m, ]3 Y/ o- k' z   Win32_Processor! ^. z) s  S" c
  Win32_Refrigeration
/ Y2 I( X  Z/ n+ s- a   Win32_SerialPort
- ^& K6 }! [. b" S   Win32_SerialPortConfiguration
* D# \0 T+ [5 G# I2 h+ U5 H   Win32_SMBIOSMemory+ Y( d. ]- |/ @) V- F: D
  Win32_SoundDevice
- d2 ]1 ], w7 }" G4 B3 [   Win32_SystemEnclosure6 J! W2 y  F1 f. {
  Win32_SystemMemoryResource6 t8 Z  v7 D7 p
  Win32_SystemSlot
- W0 d7 I! Z/ A: ]# c0 K$ P   Win32_TapeDrive
$ P1 A" i7 y, Q4 q8 ~! {0 w   Win32_TemperatureProbe' r7 W0 X# V- ?5 X  s8 O1 u8 i
  Win32_UninterruptiblePowerSupply
/ }+ J8 N7 z; J8 g8 y( ^   Win32_USBController3 E+ ^3 \& r, l4 J5 ]: e4 ~
  Win32_VideoConfiguration. k+ z4 _  y; u' J  o6 G  l4 ], v
  Win32_VideoController+ x" {6 ^/ y& y$ Y
  Win32_VoltageProbe8 T( m% a8 M8 u+ _# s
* z# y" G9 D& S
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-6 00:09 , Processed in 0.017105 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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