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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)) d0 D; S; r# ]5 \0 j4 G

# Z6 p* g" r9 H. P+ J- @! P# A' a: ^6 x/ C! G+ a# _% k
--------------------------------------------------------------------------------' H, i/ s. u, U3 I: t; `
WMI: Windows Management Instrumentation (Windows 管理工具)
' B) k" R9 x6 j# d   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
6 F) n, S6 i3 ]4 r# s; Q   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
6 I  ?( {  }' a/ J0 P1 o0 g   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
/ d/ [& E" P  t. R+ A) W$ O& v5 ]; n0 [8 R$ ^" ]
--------------------------------------------------------------------------------: f8 K2 Z3 ^6 B+ v( l
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
9 s: I( X5 @/ J3 m
4 i' D% h' j' \6 D* [--------------------------------------------------------------------------------
0 }: K* A1 x1 J; \① 初始化 COM 接口:
( v5 `& |5 `$ _4 B" O( C' Q9 ?   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。  j$ d' S& Y2 V5 r
  这两个函数在 #include <comdef.h> 里面定义。
; O! ^# ~9 B/ y- f) X+ T' F; ]
$ [& l0 E/ @' f" g- Y② 获取访问 WMI 权限:% C9 |3 m2 X# N0 N  n
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
; _% J' S. R; U" f& V7 t   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
: d) n/ _0 e3 L+ L$ A; Y% g5 c; ~5 p) l2 v& o# D
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:2 F' @* s2 p, H, o# m) T
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
* ?/ O; s) Z0 W$ S/ ~  w, k; g
( S% i1 O0 H4 @. l6 P2 g. Qvoid GetWmiInfo(TStrings *lpList, WideString wsClass); p0 `; h  X- ?' m8 S- y# C
{* y  P2 j8 H" \' e; z
  IWbemLocator *pWbemLocator = NULL;. O$ c- q0 q# K3 y9 K" n8 b
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
; g" w+ q' |* ?/ j* p   {
# U4 t1 Y6 A+ ?  t% Z2 I0 x     IWbemServices *pWbemServices = NULL;1 n! T- n2 ^- |
    WideString wsNamespace = (L"root\\cimv2");
0 [8 H1 k' E* \3 J0 \* O& m     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)* i" F/ @0 G& u' m' s' V. p
     {6 |. y+ V1 J; J( q) G0 K7 ~
       IEnumWbemClassObject *pEnumClassObject = NULL;2 P' |$ N* k6 \9 N3 t
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;+ U+ G5 ~% q/ r7 _
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)2 i) k( Z4 f3 `( e/ n! @! W- I
        {
. u3 X6 |% J# L( x# m5 F" q* r           IWbemClassObject *pClassObject = NULL;
" S' G/ m/ y, C1 e           ULONG uCount = 1, uReturned;, S" _, Y# o: H. {, R8 B# r
          if(pEnumClassObject->Reset() == S_OK)
$ I; d- o/ a2 J9 F            {3 P2 q1 t9 Z8 ~) c" B; T- d; I
             int iEnumIdx = 0;' o8 w4 W0 o) t6 p; _
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
0 g0 w' y/ E9 n' A( S( p/ R               {: Q" h: y! J  @& v+ m
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");: k- e- |, j% G5 C! M" u7 [
( N& g$ H0 V/ i% A9 s
                SAFEARRAY *pvNames = NULL;: n4 D7 a4 ?! P1 A) v
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)1 K. G* M& H! ]+ [" c
                 {
9 k/ z% s( m& e) L! {                    long vbl, vbu;
; P1 h8 N8 `% B$ a4 z- h( v                    SafeArrayGetLBound(pvNames, 1, &vbl);
  N2 V6 g4 `6 |/ T: D" W4 r% Z                    SafeArrayGetUBound(pvNames, 1, &vbu);2 b: k6 a  Y. U1 ~
                   for(long idx=vbl; idx<=vbu; idx++)  R' D* F* y# o* a0 D
                    {. r! E7 H6 p$ o5 t2 q+ B8 Q/ U
                      long aidx = idx;
! H5 ^. Q- j4 G: i$ ^6 f6 e                       wchar_t *wsName = 0;; O- b8 v& K3 {/ T% w
                      VARIANT vValue;
+ R; M+ x0 N$ N* g) K                       VariantInit(&vValue);
) n7 n3 H( d7 g/ o' K) k  B% a, }9 ~                       SafeArrayGetElement(pvNames, &aidx, &wsName);
! I2 t; c' a( N9 t* V
8 d$ n, r4 z0 e$ B                       BSTR bs = SysAllocString(wsName);
1 L9 D* O5 U$ i                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);* [" R/ l2 Z% b) I
                      SysFreeString(bs);/ J2 k8 t3 G+ w9 x' M+ b4 I8 ]: V
" f8 E; L% v4 j
                      if(hRes == S_OK)6 e1 A# k: t: u
                       {
+ o9 c+ Z& b% p1 p                          AnsiString s;1 @) v) P6 q3 I. l; \% ]
                         Variant v = *(Variant*)&vValue;
# Z. v7 v* n6 `3 R. e                          if(v.IsArray())0 C  ~/ q. l6 o
                          {# F9 i" C, g# P" I4 y  N! V
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)* I: T7 A+ u5 U1 L  R+ ^0 h0 e
                             {3 Y0 m& R; ]+ W
                               Variant a = v.GetElement(i);# `3 ]3 B3 g5 S9 h
                               if(!s.IsEmpty())- q2 Q8 m* b7 H3 b4 G: g
                                 s+=", ";0 I8 ?# R: h( O/ t3 |
                               s+=VarToStr(a);
% O9 v+ h0 s) d7 m3 n1 @1 B                              }- H1 l. H- d7 S2 }7 x! |; H  m7 {
                          }+ \7 e+ M7 T1 ?6 Z  O$ a
                         else
8 l) w  ^* u9 t- z1 Z" D                           {
( h6 e* P" S8 n/ [                             s = VarToStr(v);% l5 S& B/ o# A
                          }9 \& g- P. C: `4 ^: d2 R( M. y
                         lpList->Add(AnsiString(wsName)+"="+s);1 P0 X: f7 _$ x( I0 T& e* F
                       }
. H' n1 ~* d4 v* {( u  {$ u4 e# r6 @4 u! ~  {# ?! r) i
                      VariantClear(&vValue);
% A, v! w( G# @( I                       SysFreeString(wsName);* f+ h% E0 _- Q" |
                    }
8 k" t4 r! x; C/ }! Y                  }. o' C* P6 a& K( L0 ^/ n& K2 u
                if(pvNames)SafeArrayDestroy(pvNames);
; S( Z1 R) Z% o% Z7 R, k9 z2 q                 iEnumIdx++;1 B% W3 u( v* O  V) r( Q
              }4 [' N, c1 D5 x
           }: r5 \2 o1 u! K! P
          if(pClassObject)pClassObject->Release();0 a9 i2 I+ [1 ]
        }" `9 U* O$ n& \  u7 d) h" I2 g
       if(pEnumClassObject)pEnumClassObject->Release();6 M# P6 k- I' m! m! E
     }
' J$ @: @  H# a. e  o6 r! g2 d     if(pWbemServices)pWbemServices->Release();  ^' V/ s! }& e! J, y$ g0 y" ~( C
  }/ _) M- a1 g* Y2 E3 G4 S7 b6 x+ a
  if(pWbemLocator)pWbemLocator->Release();5 J6 i) x- ~4 I( }! |$ o# Y) O
}
9 t2 }& n/ O% g//---------------------------------------------------------------------------
8 g7 B, ^" J3 P4 U3 J/ @- J% z
" Q$ _2 T, E' ]+ _) @) g// 通过 WIN32_bios 获取 BIOS 信息:8 `5 u" M' K6 J, k
void __fastcall TForm1::Button1Click(TObject *Sender)) A7 N2 R+ r2 Z7 U1 t
{
! w$ a0 J3 P" m" S( f$ d& T" O    Memo1->Lines->Add("================== [WIN32_bios] =================");9 b2 Z; t+ ^8 N2 n3 t
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
  \% `# e& o5 P' v9 T' M    Memo1->Lines->Add("");, k' V0 h6 O; Y/ F
}
1 Z  [* j- S4 a1 q
3 |2 S2 M" ~5 Y1 ]. j7 |--------------------------------------------------------------------------------8 ?: R7 S4 N& n9 e3 W, r* |# j8 ~) f
! D8 r# d' {" x; R$ D. L# m
WMI 可以访问的信息类型有:
4 w% u. ], N8 s1 K# e% w  O9 m9 L  c   Win32_1394Controller1 M8 _1 u" g) C1 B
  Win32_BaseBoard1 z: j: Y( Y% ^1 \+ s
  Win32_Battery0 A  @; [# u$ l% P; `
  Win32_BIOS
1 E$ D* v( K+ X$ d% p   Win32_Bus  S% Q, f( v) ?: x' s0 Z) y
  Win32_CacheMemory
; h$ h9 D( x6 C2 P* V" ]   Win32_CDROMDrive2 d% k+ `+ ?4 I1 n$ C1 @
  Win32_CurrentProbe' n$ k$ n, W: g
  Win32_DesktopMonitor6 o0 _& f8 l. `% L
  Win32_DeviceMemoryAddress
$ V: T/ k8 Q/ h3 M6 r5 z* y( P   Win32_DiskDrive4 t! V6 [' T$ V' q' h
  Win32_DisplayConfiguration  U$ F, `3 E  O4 p3 F6 H( c& n
  Win32_DisplayControllerConfiguration
! i* R! F' g- Z) M   Win32_DMAChannel
* _) K$ U9 {0 Q0 O& j3 h   Win32_Fan
- W2 y  d) ^$ ?* Y   Win32_FloppyController
9 U+ o5 v, t7 L) p- [. h/ ?   Win32_FloppyDrive
' G$ V9 |' O: [* F$ a# `2 f3 |- E) `   Win32_HeatPipe
9 c% N$ x5 [( L$ C$ O   Win32_IDEController4 U! ^# N" d7 W# @
  Win32_InfraredDevice/ ?" k# ]5 c% O( a# D+ @: I
  Win32_IRQResource
" x5 f& J+ s# s$ T" B. |1 K1 k   Win32_Keyboard8 p' d# X0 x/ @7 V+ ^
  Win32_MemoryArray/ W6 c- `6 I1 O/ X, g
  Win32_MemoryDevice7 H4 [5 W, S4 ~' Q$ h3 x5 P
  Win32_MotherboardDevice
  z9 ^7 q! ]! }5 H- o* k$ Z   Win32_NetworkAdapter8 G$ _0 _  H9 U0 |8 P# D' p
  Win32_NetworkAdapterConfiguration6 p" @7 x) {0 j6 {. h$ y! {
  Win32_OnBoardDevice
/ V$ Y- z4 U- s5 D7 P   Win32_ParallelPort
/ z5 s1 r: P0 ~, \; B. R: a0 s/ G   Win32_PCMCIAController
2 \" L' ?! P2 n2 C5 B/ \( y   Win32_PhysicalMemory
) ?) z* d1 Y  |$ y6 D8 l   Win32_PhysicalMemoryArray6 ?! F9 N/ |# O* w" g. @
  Win32_PnPEntity
: y1 H: w5 m# F, o- Y   Win32_PointingDevice
" l( ]1 o) Y5 G   Win32_PortableBattery
3 B; `$ @# L) h: r" S3 S' w# c% J   Win32_PortConnector4 e4 X% Y" U4 |; K$ c% B
  Win32_PortResource5 u9 [8 u( }) @6 N* ^& l! j! k
  Win32_POTSModem
- q' _  v* j* y" g) {) r   Win32_PowerManagementEvent
7 H& }& B  J2 {   Win32_Printer
% `, F: p* w5 j7 r! }  w   Win32_PrinterConfiguration% A( v" N( I- M' z/ D, z
  Win32_PrintJob2 u) m$ K5 i9 a5 t; X
  Win32_Processor
/ W, C6 p0 M" O   Win32_Refrigeration2 w  h3 ~1 c$ m6 |5 S
  Win32_SerialPort% U2 a4 u, I, Q- d' }3 h/ T6 D
  Win32_SerialPortConfiguration
2 k- d2 \6 ?) [9 f   Win32_SMBIOSMemory' d! \; {: U( o( l5 Y* B. {
  Win32_SoundDevice
. ^& J1 T4 v) x( A   Win32_SystemEnclosure
5 Z5 R3 G1 P7 s! a. T8 c   Win32_SystemMemoryResource
. B' l* _4 Z2 h( d( x   Win32_SystemSlot) `8 w+ w. G, q
  Win32_TapeDrive! r2 B5 n8 I3 X0 F# V" D9 i( w
  Win32_TemperatureProbe2 v1 D- B6 B5 U" H
  Win32_UninterruptiblePowerSupply$ k0 e1 ]6 ]. S
  Win32_USBController! X3 n0 E* ]; ]; E1 \- L
  Win32_VideoConfiguration& j  f! x6 S" v0 W
  Win32_VideoController) e$ l4 D* z/ Z0 O3 r
  Win32_VoltageProbe
/ m7 F0 S- _8 j& a9 s
0 m; l, Y  w. |+ v  |+ U( L以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-5 20:14 , Processed in 0.017889 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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