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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
( f5 U6 U9 |; v! I/ _* N
/ u- t, d7 O2 d' D' c8 f7 y
6 J5 \, D: T5 Y/ i) n& h, z--------------------------------------------------------------------------------
, o5 _( h; X7 i; ]: K: CWMI: Windows Management Instrumentation (Windows 管理工具)
- W. M$ n  D* e+ W3 q   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。   D! q; ?1 j: A+ f8 Z% m$ D6 d
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。3 O% x5 b9 S1 @1 w7 }2 d
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 % d3 m; X3 N+ H. E
: ]- f& j; ?# ?! X0 g1 k3 v4 ^
--------------------------------------------------------------------------------  k9 Z( E1 Q" E. V; b' f8 Y
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
0 w, K/ }' P# C4 ^/ p( L; L& [) U* @+ f+ t) ]& R4 [. _
--------------------------------------------------------------------------------4 d" g; |1 U$ o8 S
① 初始化 COM 接口:
5 _: p5 A0 v+ D  m4 h   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。' U& I. O: O: Q* a' b* z( S+ h
  这两个函数在 #include <comdef.h> 里面定义。3 D$ y% \! o0 e# t

1 K' u7 k# Y: }6 h8 D$ H! ]② 获取访问 WMI 权限:- u; c: c" g! S. K& @: s
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
! p9 H  d3 ~( M0 p7 j   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
! T2 `  \: i! T+ T- }
6 w1 l  M7 g( d, D9 [③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:) s# B- Y* z9 X" Z- b; r' q4 Y
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。) R/ C- b' [9 t

: l# R5 {! v1 \void GetWmiInfo(TStrings *lpList, WideString wsClass)
8 o" F1 @7 \$ F) k{: Y9 h' J' a- d- Y; t7 z& u
  IWbemLocator *pWbemLocator = NULL;
  H- f& l) A( j/ `  x+ ?  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)2 e  {! B+ r. R) s
  {
. k5 d5 \8 s( {$ g8 v$ }     IWbemServices *pWbemServices = NULL;& @- n+ z% B$ C
    WideString wsNamespace = (L"root\\cimv2");
  C9 P# H: r: G" J     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)2 d; n- F7 {3 u" p7 A
     {
  q0 \/ W- }' P* W        IEnumWbemClassObject *pEnumClassObject = NULL;1 }! Q+ Q: d* I/ s
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
5 s* v! S8 B" N" k% S        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
4 V9 p( m# h9 n# l7 R; Y         {( q4 ]5 H* p$ \" e/ l
          IWbemClassObject *pClassObject = NULL;2 p  y+ T* n' ^* r' V* l8 \
          ULONG uCount = 1, uReturned;7 n/ U- A# @; G  x
          if(pEnumClassObject->Reset() == S_OK)
$ F: I: I2 _. x! r% [3 l6 _            {/ l# m+ e4 H* ?& r' L
             int iEnumIdx = 0;
8 H; E4 C4 A+ n7 \$ I  A! q7 q              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)! [$ O" R9 v/ G
              {
3 Z3 a  ~5 F7 J6 F! E                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
; ~8 T2 {. R8 j
+ S: u6 R# g# _0 |                 SAFEARRAY *pvNames = NULL;1 _! S7 h# ^9 }  w
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)( m2 F9 j9 l/ `' e/ w
                 {
5 X! q& a- E/ F! v, @5 o                    long vbl, vbu;% O: [' r; H. X" q, A/ c: u" b
                   SafeArrayGetLBound(pvNames, 1, &vbl);
& ^: i# u' a, S1 M0 f                    SafeArrayGetUBound(pvNames, 1, &vbu);
. ~4 @' d! I% S2 Q1 e+ q                    for(long idx=vbl; idx<=vbu; idx++)
9 m/ J2 }0 h( Z! h; x                     {, w5 Z+ k5 d8 ^/ c; g1 a3 y
                      long aidx = idx;
0 H5 {$ i# E2 W% s                       wchar_t *wsName = 0;
/ `. }' l8 [% E/ y: F                       VARIANT vValue;% L& Q4 ]+ i& S6 T  ]
                      VariantInit(&vValue);( B4 d# o+ c) X1 N
                      SafeArrayGetElement(pvNames, &aidx, &wsName);; h3 L; B8 D; L# x: ~: z

4 E# A1 P8 q! m! N) M                       BSTR bs = SysAllocString(wsName);
, Q( q  N2 C  e1 [8 v. ~                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
# }/ _! V0 \/ {  C( _; S, H                       SysFreeString(bs);! ?! u5 G" j$ |$ J

, F& l1 K+ \3 q  S6 B                       if(hRes == S_OK)
* U" v( N7 t  C$ ?: ]( A+ ^                        {
) Y! k! N' ?6 M- \- K. r                          AnsiString s;
# ^: t( `* F; N  K9 p* Y                          Variant v = *(Variant*)&vValue;
. I  G6 K" T  N                          if(v.IsArray())
; }9 o3 N& W$ j) Z. k                           {
7 x0 z/ J& v/ z5 w# j                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
1 f/ {+ p8 J! ^' o" \                              {$ F8 V6 R1 i+ E: e
                               Variant a = v.GetElement(i);
/ ~, |4 `; N9 [                                if(!s.IsEmpty()), ~6 [$ M( {! Y# S6 r; d2 t3 Q
                                 s+=", ";+ C0 |/ o: j: G. O9 ], \
                               s+=VarToStr(a);1 r' L6 l: i, ?) O9 J6 b
                             }  x+ D4 M  j4 U/ L! u
                          }7 `5 \. @. [; q
                         else
+ Y  A) }) H& Q6 F$ t3 G' L) A                           {
/ ?  P0 s" ~7 C( b2 |& a6 w: V                             s = VarToStr(v);
* D, ?1 h( ^, a0 Z7 |                           }' W0 V/ }  t6 ]8 X/ L7 G
                         lpList->Add(AnsiString(wsName)+"="+s);
( Q4 A8 V7 r$ L4 B: u2 c. t                        }
* G/ j% E1 z) `6 n$ A! m
' Y  K( B# \" Y* N4 Y  @3 F8 N                       VariantClear(&vValue);
. h' @$ g! |" b                       SysFreeString(wsName);
5 X9 p8 a. X; A9 ?* L                     }* R8 n5 B2 f' \0 c5 ?7 ^; P
                 }2 V+ R( l! t8 `" G" X7 g
                if(pvNames)SafeArrayDestroy(pvNames);5 H2 [2 b+ h% {2 F& M7 t) l$ H! j
                iEnumIdx++;) w. _# a% G6 s( |7 y  V# W
              }
" v* ~! v& L6 Z" o2 d            }
1 f7 D4 E( [' d( u+ R) r* B           if(pClassObject)pClassObject->Release();9 T( R' _4 w1 l( U6 G  Z8 S  K
        }, h$ L+ y4 H7 z! a% K! {5 Z
       if(pEnumClassObject)pEnumClassObject->Release();5 V+ R- O: U4 \  X
     }
  P; Z! p9 _4 v" p8 G! K) R- _     if(pWbemServices)pWbemServices->Release();" D' g% H: N( I7 _
  }
' S' v8 E1 a- P  G, ]  if(pWbemLocator)pWbemLocator->Release();: ~. `9 V; Z, r9 K' N3 c0 b# k
}" O" _" R! X7 v1 I* K9 n7 o
//---------------------------------------------------------------------------
! n5 |( K+ ^& x/ d3 C( O" a4 L: t
// 通过 WIN32_bios 获取 BIOS 信息:
+ X& b+ ]* n4 bvoid __fastcall TForm1::Button1Click(TObject *Sender)
* S& o0 |6 g' I) }{9 H. ?3 p; d) T1 ?0 q0 I
   Memo1->Lines->Add("================== [WIN32_bios] =================");* r# z8 B1 B, C* K: t. ~/ o
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
) r8 F$ K, I; z8 R  u6 x' b    Memo1->Lines->Add("");  R. w  ~. C4 Z. X; ~
}3 v$ U# {' X1 R& ^4 r8 x! N
# I3 p  ?% e7 b) F6 u* o# v
--------------------------------------------------------------------------------1 }- D" m$ }4 s% E) K# h$ `$ w
2 U$ G6 f" Y7 E: `4 M
WMI 可以访问的信息类型有:+ ^) L+ Z" W1 M4 v5 x9 J4 Z1 \
  Win32_1394Controller
: H& B, m  X& R9 I   Win32_BaseBoard
$ R1 A5 o6 |4 L   Win32_Battery% z4 k! A7 Z/ `) H1 m. u& _
  Win32_BIOS+ \4 I: J3 a" Y7 O" j
  Win32_Bus
3 N3 {# B- u3 {1 b! d/ @% M   Win32_CacheMemory
' W: p" m' _4 h: F   Win32_CDROMDrive
) Y# i( c8 i, Y! d; D. ~+ \6 F" j   Win32_CurrentProbe
9 Y  t  C/ s" i9 }+ ?) u   Win32_DesktopMonitor, D  |# K. A6 o9 O6 J
  Win32_DeviceMemoryAddress
. w1 U6 M9 M9 S6 A% w  {   Win32_DiskDrive
5 c# n$ ?# `; ?" _1 E  H  c   Win32_DisplayConfiguration
$ O# c  Y* i1 s) e% F   Win32_DisplayControllerConfiguration
$ G1 j: f" F1 n6 j1 O6 ]5 g4 q   Win32_DMAChannel: \5 @0 i& O6 i# W) h
  Win32_Fan' m9 X# ], E7 U4 I% M% }/ E
  Win32_FloppyController  T" |) ]- W: F$ r" K2 a, n
  Win32_FloppyDrive- R* U5 Z, J" a# P- v
  Win32_HeatPipe) G# y* b+ g# v$ Q
  Win32_IDEController
1 b' J% [' w  T* z   Win32_InfraredDevice( U$ ~; [; G/ V0 d7 I
  Win32_IRQResource& B  v1 }1 D. e9 V+ G
  Win32_Keyboard7 m4 M- L9 N' e+ v# ?
  Win32_MemoryArray
/ e5 \# R4 X7 G: o# m% t* N   Win32_MemoryDevice
) p- Y" B* T  l/ o, F, G5 a: e   Win32_MotherboardDevice
; v6 k4 `4 }2 k   Win32_NetworkAdapter
" ~* t6 V) ?# o0 P  A: {6 p2 V   Win32_NetworkAdapterConfiguration
* P0 f8 W( m# G  {   Win32_OnBoardDevice
4 m8 q+ c0 }1 G7 P, m8 r   Win32_ParallelPort! d+ [" n" ]* y  n6 h2 P
  Win32_PCMCIAController5 [* q! a8 o) e/ k  p
  Win32_PhysicalMemory  K6 \! B2 B: g8 j: n5 f  `
  Win32_PhysicalMemoryArray
, [7 R) r' y8 ]8 t   Win32_PnPEntity! c# h# E% |6 q% s: x5 t! R* o
  Win32_PointingDevice( h: U3 w! N1 [
  Win32_PortableBattery/ s/ p& C' S; F+ q
  Win32_PortConnector9 |& e, U/ F9 L7 S; Y+ W
  Win32_PortResource
- @. \' k" S( }* l6 m" }   Win32_POTSModem
  D7 E. U* O: R0 V   Win32_PowerManagementEvent9 Y5 G6 s, ^( Z  ^+ i4 s5 a" e1 r3 ~
  Win32_Printer# |3 Q" w. o3 i8 l( t' i
  Win32_PrinterConfiguration: p* s. h6 J2 o% f( H6 i
  Win32_PrintJob
. `& Y/ t& G6 Y, n: r   Win32_Processor& O/ }* p  o5 M+ U, z$ a
  Win32_Refrigeration
+ Z/ t" r/ V2 [3 J% _0 ?( L: [   Win32_SerialPort
- S3 j, H4 z4 N' t  F   Win32_SerialPortConfiguration
% [" \6 C' O: p   Win32_SMBIOSMemory% D- d& [' X; {& J+ [% o# f# y
  Win32_SoundDevice5 v/ v6 x) Y5 K9 Y; k$ q+ m. b# k' Q
  Win32_SystemEnclosure& _% n& k0 Q) ^9 ?% x% V
  Win32_SystemMemoryResource- L( c. M* @: e9 y
  Win32_SystemSlot) w& @& b% J) U  k- R
  Win32_TapeDrive
% n) B: w, T* ~. x/ ^   Win32_TemperatureProbe* I% g8 ~. `7 [$ K
  Win32_UninterruptiblePowerSupply. l) l6 K3 {0 y3 ]( U
  Win32_USBController  s, a; q4 Z8 l2 Z; a9 P$ U
  Win32_VideoConfiguration; p/ F: s; O) F! Y3 L0 A% b( _" J8 g
  Win32_VideoController8 h8 C/ R9 t& M. _% U
  Win32_VoltageProbe( C8 c; s3 v9 g. d8 F  F5 s

; v& _! j% S# C  q% g# \6 N以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 18:09 , Processed in 0.019165 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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