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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)5 S& @! w2 [8 q% w

- a( D# c. u% t1 _$ h, I$ _; |8 |$ T3 U
--------------------------------------------------------------------------------+ B& {* H7 r7 ^1 S; J
WMI: Windows Management Instrumentation (Windows 管理工具)# X% n3 j- J2 g& r% L/ V0 V
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
) q9 ?* a0 X& D   利用这个工具可以管理本地或客户端系统中几乎所有的信息。6 F0 x, {) R6 @( a) U1 u2 N
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
6 a' e0 f6 Z5 _& P' R- s- p
9 D( W+ v5 |" Q3 k5 _* d--------------------------------------------------------------------------------% \# |% }" ^' `; }% I" T
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
. F' I5 R6 y* K
! i! G7 X# J3 Q* A) i0 h--------------------------------------------------------------------------------' d' h. R0 M2 ]  d2 H( H) E
① 初始化 COM 接口:7 l( b/ I) s& j; q9 T
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
# |0 t! x: G  n7 _* X   这两个函数在 #include <comdef.h> 里面定义。) d$ C: v% K4 `. M+ D

5 d: @4 N& ]; k② 获取访问 WMI 权限:
7 C. O3 ]6 C, s   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);, d0 j9 j5 n, x" ^
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
2 v4 A" h$ B  E$ H# k/ J8 Z; W4 \3 J3 |, }7 X5 F3 ?4 Y( o
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:% f% v/ s% ?7 K0 c
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 t( Q. W6 F% r2 @' s2 \; H1 O2 ?, A. ~3 J$ A: I1 l! ^$ c& @: Q
void GetWmiInfo(TStrings *lpList, WideString wsClass)3 p7 z/ f9 I0 K" Q2 y" ?; `
{
  f4 l% o7 R. O* c  IWbemLocator *pWbemLocator = NULL;" `' X4 K* ^" ^' E
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)8 {+ R3 E# P; y9 E( q
  {4 v: }% p8 ^" s/ t) K: t2 ~( N
    IWbemServices *pWbemServices = NULL;, ?; @2 ?; r. r; F8 X- d
    WideString wsNamespace = (L"root\\cimv2");
, K5 c& ?- y6 `7 _/ m     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
1 h* f# R- [' @: l6 Z0 u      {
" @6 c- c6 D, F        IEnumWbemClassObject *pEnumClassObject = NULL;( d7 R- K/ o7 O& V
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;/ q5 p! S1 g5 P$ n6 w
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)4 u/ {1 \8 X$ P
        {3 K0 X8 `% d6 I/ d( A1 L
          IWbemClassObject *pClassObject = NULL;
7 g0 [* `9 L) _           ULONG uCount = 1, uReturned;
) ]- F" @2 x8 Q3 l           if(pEnumClassObject->Reset() == S_OK)
, L5 o2 s# X$ b! ]7 ]! M' k3 _            {
; d5 v4 I, i6 Z" ~2 D: W              int iEnumIdx = 0;5 ]$ r) l7 F# O5 I' r
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
  M0 ]0 x, z0 Y, H& b+ n2 z, Y/ N2 B               {/ \% B* \" P, F9 w$ k5 o
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");( y* |0 x4 A, ~% s+ P& T5 p* h
7 b0 o$ m. C& \
                SAFEARRAY *pvNames = NULL;  u: r- ^$ i) l: ]9 }9 n
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)  X- F; f+ G$ L+ k1 h# o8 `
                 {: U2 R/ _2 i5 H6 E  }. y3 v" M) a
                   long vbl, vbu;
; p" H, C& m5 }+ p9 d                    SafeArrayGetLBound(pvNames, 1, &vbl);
7 f( y8 |/ O2 J$ h6 I- R: D                    SafeArrayGetUBound(pvNames, 1, &vbu);. p0 ]0 f0 u  F* Z9 H
                   for(long idx=vbl; idx<=vbu; idx++)# q6 W9 S) V3 R& B9 @' {- y
                    {
* c2 Q( i3 ^5 e0 l                       long aidx = idx;
/ z5 q2 {6 }) ], r                       wchar_t *wsName = 0;
4 N7 g! F' d& x                       VARIANT vValue;8 L8 Y. _$ R3 K5 w! q; a
                      VariantInit(&vValue);/ ?3 u6 X" P$ x. _0 z( e( c
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
9 B4 R1 p& J" w1 T) [" T' K2 y* U  N9 w$ ]  @* h7 p; `
                      BSTR bs = SysAllocString(wsName);( L$ a+ y8 D3 c; s4 @7 T  D6 H
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);/ G9 ?' o- |9 U3 O) I5 D
                      SysFreeString(bs);
6 u% j; ^5 q/ S( S+ s. o
  H# w3 k4 M) G0 a% n# ]+ G                       if(hRes == S_OK)" c; }* k2 b, _* H/ s
                       {$ Q9 `! Q3 M+ |" {% {/ n# A7 Q
                         AnsiString s;. t5 F2 Y* H2 u' O" P+ ~2 {$ @
                         Variant v = *(Variant*)&vValue;
- M" h" m5 V& w                          if(v.IsArray())
! w% c9 r$ [: G& w, w7 o                           {
. h% Q& b1 Q4 i4 }, ?                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)' Q; T4 ~# [( P7 W; z5 ~
                             {
  j; J2 a" ]& X; C4 `& W                                Variant a = v.GetElement(i);" n) A7 p5 G$ I& H# K
                               if(!s.IsEmpty())
9 q8 x) B% z+ W7 E. V" j+ p- h0 r                                  s+=", ";; Y. L( q- ?  ]1 r+ }
                               s+=VarToStr(a);* Q* Z5 N) f$ P
                             }
6 J# U9 Q9 i5 G- i1 F                           }' D/ U) o# ^- S' @* j" N1 t) P/ Y
                         else
) N) ?( Y' i, \$ h( Q' |, J                           {8 \$ w! m9 w) K4 q, C+ E: S
                            s = VarToStr(v);
1 G2 V! m1 ^" ~, Q3 Q                           }2 A- i" e* {+ H7 s
                         lpList->Add(AnsiString(wsName)+"="+s);7 q- F7 s! ?6 o. Z
                       }/ W% u' W9 S6 L4 q7 P. s

5 Q7 z* m, X. b                       VariantClear(&vValue);
2 b9 t( y' ?, y+ Z                       SysFreeString(wsName);. Y( R) }( R& m7 Y
                    }
5 I" [8 y( k, n* z# I2 q$ S7 X/ I0 |, @                  }
! L2 L- o. f0 w) z8 t                 if(pvNames)SafeArrayDestroy(pvNames);
( e) _: b+ r- K& H+ k# d( _                 iEnumIdx++;
6 X' O- H4 Z, I) _; ]               }) u" Z$ w* T6 p; z3 v3 ^( u: i
           }% h! U2 q+ X. e/ q
          if(pClassObject)pClassObject->Release();! h0 L: h7 @) N7 S
        }
2 j9 v4 F( T( G0 E; h- A6 A# n        if(pEnumClassObject)pEnumClassObject->Release();! c1 q6 I4 {( l$ @
     }
; L1 j! L' B! ^     if(pWbemServices)pWbemServices->Release();
/ h5 j( R% G" B+ N  N   }  c8 I$ {2 \/ h, V) f  l
  if(pWbemLocator)pWbemLocator->Release();
* Q! O1 v) x+ c! c$ E; X}3 c4 V. \3 R" \
//---------------------------------------------------------------------------+ _* @) e9 K7 k# ]1 i

6 d3 y8 e7 H  _1 E) u// 通过 WIN32_bios 获取 BIOS 信息:( {0 J/ z8 w5 {5 u
void __fastcall TForm1::Button1Click(TObject *Sender)1 B6 [7 j  v" x0 L: _7 I) F- b
{; J. s  W) ]. c0 |
   Memo1->Lines->Add("================== [WIN32_bios] =================");
6 ?3 Q' f2 p0 _. E# _0 m# D2 A8 h3 c    GetWmiInfo(Memo1->Lines, "WIN32_bios");
8 a0 \: o* ]* ~9 n    Memo1->Lines->Add("");
. @& ~* [- `7 u" [# H3 i}( I. R$ x# Y* N- ~0 Y$ S1 I5 L- A
8 h# z. x8 t6 ^! [& q
--------------------------------------------------------------------------------2 I$ L& W$ O* N) G: k% j1 s

) X( a! w6 a" a7 v# T3 E# [4 aWMI 可以访问的信息类型有:
% F" z# d9 e' @# L# Y& y$ l: j& Z$ `   Win32_1394Controller/ j! V! k: _5 L; w: L0 w: {
  Win32_BaseBoard7 I4 O; f6 }' X& S7 K* P
  Win32_Battery
# X8 U  _; I& `! w   Win32_BIOS, r& G0 I5 m7 u3 w( f
  Win32_Bus% h/ S% [, X; U' j) s# v5 L1 S
  Win32_CacheMemory
( M# u, E* C& f( f0 Z   Win32_CDROMDrive
- O$ T: ^6 A1 ^  O- c, ?( g   Win32_CurrentProbe/ R( h$ X( e* X" L. j! ^+ e, t6 {
  Win32_DesktopMonitor9 j+ t- ]' U  K# A2 e6 q0 a
  Win32_DeviceMemoryAddress; y9 X  |: U) G9 g& q! ~: j4 R
  Win32_DiskDrive0 [9 W, w  F: A# `9 W. X9 R/ K5 p
  Win32_DisplayConfiguration  Z; n, O. m2 L! e6 n( v, |. F
  Win32_DisplayControllerConfiguration
) S/ g# u% F' f: @! k3 Q   Win32_DMAChannel. A1 w8 u7 g) E" i
  Win32_Fan' f9 H  ^; Y' T/ W" d) S
  Win32_FloppyController
/ g: E3 v& v2 {' _$ Z  U4 d4 a   Win32_FloppyDrive3 u$ G+ w' `7 d$ N7 Y- A
  Win32_HeatPipe) {1 g. E9 Y8 A! t# A* z( J
  Win32_IDEController
1 R% m% g1 H4 }   Win32_InfraredDevice6 V7 J* {" D% b5 Y2 w4 T
  Win32_IRQResource, s" a0 O/ o3 s8 k
  Win32_Keyboard1 F- C" ~3 A( S0 C1 [* P! h* X7 P
  Win32_MemoryArray
0 B  i! E8 H) T$ J0 X   Win32_MemoryDevice
- I: z3 L4 y4 K7 A. F0 v   Win32_MotherboardDevice2 I: \$ W9 L' b
  Win32_NetworkAdapter+ s; c: H1 Y( C( E& X7 ]
  Win32_NetworkAdapterConfiguration, n1 o' e- n0 _2 b. T) [1 U; n
  Win32_OnBoardDevice& w" f. A; U; b+ Z, N
  Win32_ParallelPort
$ j& j2 G3 m6 i- s   Win32_PCMCIAController
: w' c5 r; N" q2 Q$ C( w  ^' x6 L/ h   Win32_PhysicalMemory, X# J' y: f* u7 N  x" c, J( c4 w( q
  Win32_PhysicalMemoryArray
7 V+ H8 V  k: }% e" L   Win32_PnPEntity. d5 p& I& R$ x
  Win32_PointingDevice
8 w) i* N7 ~# g& z7 q! x' ?% q   Win32_PortableBattery2 Y3 k: a1 J7 W9 ?  e- a
  Win32_PortConnector
( m/ |9 V: S  m6 a; [5 n' X3 E+ D9 ?   Win32_PortResource
/ r: k( ]) `8 q& x4 f   Win32_POTSModem
; h: i( P- U7 B7 W' U: P   Win32_PowerManagementEvent' Q4 K. y+ \7 p2 n0 K
  Win32_Printer+ V; P, h& V3 \8 N6 t/ g9 i; J
  Win32_PrinterConfiguration' f+ d  h8 p; d1 n8 M' y7 [5 m
  Win32_PrintJob
4 s8 S& E- I5 m: D: j   Win32_Processor$ ]# N( b) {' R, P+ Q
  Win32_Refrigeration* }  o0 @; P' T& P( L. ^1 B
  Win32_SerialPort3 N( Y+ [/ M% P0 u
  Win32_SerialPortConfiguration/ X5 ~3 d( l! H- Y7 s
  Win32_SMBIOSMemory+ W* w6 f& T# L- [  a" G
  Win32_SoundDevice5 [4 `& O5 v5 ~- ?, y- h9 j
  Win32_SystemEnclosure, l7 S/ ~( b. q8 E/ |
  Win32_SystemMemoryResource
# \# ^  c" k7 a   Win32_SystemSlot7 c" ^: a+ A. L' `. ?+ w) {/ C
  Win32_TapeDrive* P7 `; {$ S+ S# L2 y2 T0 O
  Win32_TemperatureProbe
0 O1 [: u0 C" ^& ~( r   Win32_UninterruptiblePowerSupply& A' ?: k+ l/ `
  Win32_USBController
3 B$ z5 k: d# g6 w4 u   Win32_VideoConfiguration) G: J! N2 g( X9 v
  Win32_VideoController3 R/ L+ Q2 k5 |7 `
  Win32_VoltageProbe* Y5 {& J4 J. b5 R$ X: z( J
9 R3 t& O# C- Z# f9 S5 _9 {
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-22 08:27 , Processed in 0.018633 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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