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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)# r  N( O) t- ^+ v; E- z% A( d
, f. R" Q1 g5 e7 \! s$ n( h
9 d- j  u) a  R
--------------------------------------------------------------------------------
3 O- I7 v" _! x. }( FWMI: Windows Management Instrumentation (Windows 管理工具)# z# B0 {+ k+ I0 d0 z8 H% M, u
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 & Z5 K9 V5 e  D; ~6 [  Y4 J& w  J
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。/ j9 b- s2 L; R+ s, S# w
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
; o. M& [- C/ w5 p/ J. w( r: \! W! [4 J
--------------------------------------------------------------------------------2 V! e( X2 E+ Z  q  b3 z# ~+ H8 [
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
) a1 [& R6 b0 B6 V5 i
- D- o, Q3 m1 r2 m% C% w- u+ y( C--------------------------------------------------------------------------------
; v# @% t6 ^! g9 I. Q6 R) t① 初始化 COM 接口:) r9 x9 [0 u! q7 s& H) w
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。% x1 l8 |9 N$ h$ A$ x
  这两个函数在 #include <comdef.h> 里面定义。
' g; H( v, _# v+ `
0 B; {! B8 B" B. R% o0 E* i5 F② 获取访问 WMI 权限:4 R1 X# V, m! i, V& O% o
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
& n) i" U0 [" z# B   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
/ ?) F  g$ R; c; m1 m$ |0 u& @5 v& C, e  o1 s0 N5 }
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
* T5 l5 I9 t# w+ D6 U   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。$ @) b$ G9 M* }4 p) C

5 Y* A% {* C! i1 kvoid GetWmiInfo(TStrings *lpList, WideString wsClass), ^# [& g  e; z
{
4 D  Q8 R; Z6 G  IWbemLocator *pWbemLocator = NULL;, @3 k+ j# g1 G9 S, v
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK): s  z# K- `- ]: \& }% W$ `) d
  {
9 V" u4 ^. i& @5 G! M5 |     IWbemServices *pWbemServices = NULL;
/ N( E0 N/ O7 K4 U4 H6 V     WideString wsNamespace = (L"root\\cimv2");
& ]8 _6 _, X$ o& ^3 w1 |) z; ?0 w     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
( g% D: Y$ a4 w+ ~7 W      {4 \% v/ M* k& [
       IEnumWbemClassObject *pEnumClassObject = NULL;
9 F7 M. |( }3 z) u; u" q        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
  N* P8 S5 i" Q( Q- c* F/ ^        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)/ Q" Z; B* z, L, A
        {; U, ?9 ^0 v* [, v# k
          IWbemClassObject *pClassObject = NULL;0 q8 @, ?1 [4 F! `) N6 [
          ULONG uCount = 1, uReturned;4 L# V7 S# w. G' {9 Y6 G
          if(pEnumClassObject->Reset() == S_OK)' _3 W+ c5 q3 ?5 y9 A
           {
2 v' E( `; [1 J              int iEnumIdx = 0;
- @9 D' @3 _/ H$ ~' }8 k; {1 W3 J              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK): s9 p5 I8 w" H$ r: a7 S, j
              {
! |3 f3 }! `7 N1 N                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
( b/ K' Z/ {* p& b( A: _
" u: }2 r; B, \9 ~5 W                 SAFEARRAY *pvNames = NULL;
; d/ P1 B! |  d4 W( s                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
  t" c1 z6 y( _8 ^0 K3 F                  {
$ P' m* I. ^( F6 a- t5 T                    long vbl, vbu;
6 L+ Z. Q* j# ~9 U7 E3 I; m* C                    SafeArrayGetLBound(pvNames, 1, &vbl);
& v6 q9 n" h' D                    SafeArrayGetUBound(pvNames, 1, &vbu);
0 z) Z. S5 k% `, H# b: }                    for(long idx=vbl; idx<=vbu; idx++)% X0 {' e9 [3 z
                    {
' P2 S6 S3 \$ F8 |7 @& r                       long aidx = idx;7 M: [: @# G1 {4 E0 B! b2 q9 q
                      wchar_t *wsName = 0;, j! D" m0 s3 B: A6 N) l; y$ S
                      VARIANT vValue;
6 h) J* V! A) m2 W2 F                       VariantInit(&vValue);) j0 O2 D% _+ n( s" {( r* Y1 v
                      SafeArrayGetElement(pvNames, &aidx, &wsName);9 \: M, V2 K" j6 K5 T
% O: v' i5 i, O* h
                      BSTR bs = SysAllocString(wsName);$ v& h* g3 X. ~: l( S4 b4 n2 i
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
: d4 [  j' v7 a1 o9 v- \. I                       SysFreeString(bs);
- X( _, W$ n7 O+ _$ q" G/ F- ]1 }7 r
                      if(hRes == S_OK)! Z$ p0 q5 J' m
                       {* n6 \4 o! K: ], q: N; n( Y
                         AnsiString s;' @0 ?; P) z# N4 f5 S
                         Variant v = *(Variant*)&vValue;
0 b' `' A% Y  B6 u                          if(v.IsArray())% L# d3 D3 D& x9 e' P) ]
                          {6 [7 H, X: R7 j% W9 ^
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
& u9 g# S* d! q% V, Z                              {1 z& R7 d0 X) h: n, S
                               Variant a = v.GetElement(i);- S) V* w0 o! c
                               if(!s.IsEmpty())# {% i, b- Y& Y9 |# H( I# P
                                 s+=", ";
9 T  C. S0 c0 t" n; I; d/ O                                s+=VarToStr(a);. w5 c' |+ P* k7 V  v, c
                             }- D; U8 W0 p" v2 H& _0 r
                          }
( I3 ]7 w: B# w& R8 M1 ~7 W: G& `4 J                          else
1 p4 n# ~! `: b! o( m# H8 X                           {
. [( J' e# n* t, u                             s = VarToStr(v);: ^1 G" h7 Z$ t, W- l& |5 F
                          }3 C5 U! @! o9 z# C! R0 T& S. j
                         lpList->Add(AnsiString(wsName)+"="+s);# W! @  w( M. S" j' g  M
                       }& K# }& B$ K( k8 W8 ]( q
% x% a4 ^3 Y8 C6 V
                      VariantClear(&vValue);
' _: i3 T+ s# N9 O: r2 E3 U                       SysFreeString(wsName);  o' F( R  N* _
                    }! K1 D0 y6 N2 X8 z2 s0 t; i7 R: l
                 }% Z6 R5 G$ n$ A% l9 E  c) |6 W
                if(pvNames)SafeArrayDestroy(pvNames);
( C! [: V( S3 D                 iEnumIdx++;% g6 c; r. o4 m$ L( f5 i
              }9 }4 j& m: z7 H. j  T
           }
2 e8 x& D' D5 Y+ \6 P) m- X) T           if(pClassObject)pClassObject->Release();
' ]6 A  j5 l5 v( w1 @         }5 m# Y/ p) G+ U' k: _7 S
       if(pEnumClassObject)pEnumClassObject->Release();1 ?- N2 p9 k" X3 _8 ], A" g
     }
. J9 o7 C* m  w3 x( _) i     if(pWbemServices)pWbemServices->Release();, |) J0 A# J. E8 K5 w( s
  }* S6 F2 }: ~) Y. b2 i3 t3 K; U
  if(pWbemLocator)pWbemLocator->Release();' [1 l5 I+ e, u& p7 E* A; m
}3 x/ I! B' z. D; i" H3 m7 d  |' A
//---------------------------------------------------------------------------7 B7 C* y, f3 ]

( e- G6 K5 D0 u% S% ?- u1 O  N// 通过 WIN32_bios 获取 BIOS 信息:
8 ^/ y! R8 ?( b/ m( }3 Evoid __fastcall TForm1::Button1Click(TObject *Sender). |  L' J0 p8 P0 W( ~4 T
{( ?1 A0 O+ n6 C" }# O8 W
   Memo1->Lines->Add("================== [WIN32_bios] =================");, q# D; c- k* K( m& G$ [2 ~
   GetWmiInfo(Memo1->Lines, "WIN32_bios");" ^" Y! {" d) l
   Memo1->Lines->Add("");
; D0 \# ]) J$ U1 t  ?0 i}
' o! g( [. O! `
  M9 [; J/ t2 n! O" z; Q- F--------------------------------------------------------------------------------
# Z$ A# b: S% ?, E( I; ?3 s; q. Q2 A- B, T" v$ d" |' A& D4 }& S' ^- q
WMI 可以访问的信息类型有:
! o- D9 K. D% [% ^( P. X6 {   Win32_1394Controller
( ~, u1 K( c7 a4 ~' t- B9 n: M( r   Win32_BaseBoard, L2 I' n0 w" r& c
  Win32_Battery
& b, }- }1 D+ G& s   Win32_BIOS3 r3 C5 y' ]8 z6 a& O7 W
  Win32_Bus
# {8 w; O6 I, F4 ~: \/ Z/ {( `   Win32_CacheMemory6 J! t1 p% q1 P8 N" L  \+ U
  Win32_CDROMDrive
* s% c. g, Y" n7 r+ o   Win32_CurrentProbe
7 l6 S, Q5 T5 r  J2 g   Win32_DesktopMonitor
  V- s9 ^( J* h   Win32_DeviceMemoryAddress% a9 C) L2 O; B1 j, G; I/ f) A. Z
  Win32_DiskDrive
6 L4 ~+ }7 _* ]" h- p. r   Win32_DisplayConfiguration
- t+ A! V  C, N   Win32_DisplayControllerConfiguration( s8 T' I2 J; ^$ D9 Y
  Win32_DMAChannel. t4 p7 R7 r! e1 M6 {; c. h
  Win32_Fan' h) |5 K# R% g2 \
  Win32_FloppyController+ K( J- R% J* P. {6 n" X3 n
  Win32_FloppyDrive
- z  z' _. d0 R- ~. T, U   Win32_HeatPipe
/ {( |, u% d/ \: y) d  r1 O) i8 n   Win32_IDEController
4 S0 ?# {+ H+ ~9 {" S0 P   Win32_InfraredDevice8 b4 B, U5 s) l8 b$ b8 t# G- U
  Win32_IRQResource
8 @. S% F) r! C* C/ W   Win32_Keyboard1 g( J" j8 t* x# f  V3 R
  Win32_MemoryArray
, Z4 M' U3 g# {2 b; R+ P9 L   Win32_MemoryDevice+ j2 @2 ]; h; X0 U
  Win32_MotherboardDevice+ {8 q# t2 W$ C" g$ x
  Win32_NetworkAdapter2 q8 `% O! t# c6 F) `
  Win32_NetworkAdapterConfiguration0 y5 R% n' J1 R! t" }
  Win32_OnBoardDevice3 }8 l# f4 P/ I# n0 S' b/ m
  Win32_ParallelPort% L3 T; I; a+ J  n. i4 ]2 L
  Win32_PCMCIAController3 Y9 O0 i. H+ V. h; x6 q
  Win32_PhysicalMemory
) |; d6 V! h5 t1 l1 [* e   Win32_PhysicalMemoryArray
) B* {  A: T6 f8 }   Win32_PnPEntity
! ?9 u) c# c$ R: X/ o3 o: I   Win32_PointingDevice
7 t* K5 d; O1 i: b4 D   Win32_PortableBattery
: }6 A+ y$ D9 V8 V3 T- R   Win32_PortConnector
5 ?1 n, a0 V. ?- b) |4 Y   Win32_PortResource, W  O0 I  h+ j, Q2 j
  Win32_POTSModem( }' O4 J3 K. }! D
  Win32_PowerManagementEvent
6 V/ R& v1 V, x1 h   Win32_Printer
. S; _% l* U" k8 B. A% l   Win32_PrinterConfiguration- X* B' H; ?* _6 f
  Win32_PrintJob. q& }8 @$ }1 _+ L4 ^2 C
  Win32_Processor* v$ A" g9 [" n/ t8 i) T, M
  Win32_Refrigeration
" o0 @' l3 s1 u9 T   Win32_SerialPort* L8 T+ h1 n" n+ v) h5 O1 ]8 D
  Win32_SerialPortConfiguration
' p$ F+ W, \: B0 l" ^- O; z. {6 [   Win32_SMBIOSMemory# ]* l. Q( K8 \% b8 N4 t$ w3 q) L
  Win32_SoundDevice1 _: X1 ?5 R5 r
  Win32_SystemEnclosure. m- Z7 F: @8 v# W6 ]+ Z
  Win32_SystemMemoryResource
: v) q0 S+ Y% A: {+ L4 U0 Z3 m; T% k   Win32_SystemSlot
" }2 y" @6 o" }( ?1 \   Win32_TapeDrive( d; L% I$ ?5 c& r& }
  Win32_TemperatureProbe; p* S+ b: p. H4 N+ j
  Win32_UninterruptiblePowerSupply- r& j( k) m4 N  d
  Win32_USBController2 J0 X' I, I3 [$ M! ~8 h# C# I
  Win32_VideoConfiguration0 s  K% \/ y# U( r2 Z
  Win32_VideoController
9 v) E0 z0 }& N( ^( t   Win32_VoltageProbe/ s8 L# X! o) h* \" e

4 T1 u+ l* P$ o/ `$ _以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-14 20:32 , Processed in 0.018524 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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