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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)/ Q. T8 Y1 J# G; m5 n
2 i" L3 a0 |5 P9 f* H9 _3 h) p
5 x/ `. V& q) a6 f& t4 X
--------------------------------------------------------------------------------8 n2 I" G" i% k
WMI: Windows Management Instrumentation (Windows 管理工具)
- q. @- U6 p" I: `- c7 Z- ~- B   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
: {9 ~/ A3 j  Q6 ^5 N   利用这个工具可以管理本地或客户端系统中几乎所有的信息。9 k$ A; }7 V5 d7 N; C
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。   i# B+ B5 [0 C4 U. O$ d9 B
' z9 v4 \8 R; q# H  u
--------------------------------------------------------------------------------
7 B6 U9 ^1 \5 U$ @8 k! r2 V; dBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
- G, l/ V7 B) Z+ `
8 T& _# O3 H8 m& t4 M4 ]2 V; \--------------------------------------------------------------------------------) I- n, q0 r( c$ a1 y
① 初始化 COM 接口:
5 E6 X4 l' A7 t' N, ~   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
1 k" Q( s( @: @- O9 D1 ~   这两个函数在 #include <comdef.h> 里面定义。
8 W4 `1 V+ J$ o& m$ Q* z. D% i$ b! v, t. C
② 获取访问 WMI 权限:5 p9 s- D6 T7 j
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);; r. G, Z8 u* s
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
( s3 `0 K0 l6 Q' o2 |+ C" {* ~; J* {' b! L
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
5 Q7 K1 f8 q" ?( D8 \1 t   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。: T( Q3 P8 _1 D5 L+ }+ d

$ Z3 W) ~& ^; }8 l4 p+ Z* _. c8 H0 Bvoid GetWmiInfo(TStrings *lpList, WideString wsClass)7 |$ r" U! w3 y5 K
{
$ |3 _% x- f; p: O0 D  IWbemLocator *pWbemLocator = NULL;
' W5 q6 D- q5 J3 P  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
3 x1 I" b4 I" Y3 w4 v2 A% ~   {
; Q# T$ e: i/ _% W6 l* F( B# [     IWbemServices *pWbemServices = NULL;
% {# }. X. L8 L- O0 J5 {' i     WideString wsNamespace = (L"root\\cimv2");
- a7 ~5 [" K2 X; e8 c" p+ u     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
4 o: J, M, `5 i8 E0 R/ _      {
0 a8 t6 n6 b3 X' Y4 f5 l" b        IEnumWbemClassObject *pEnumClassObject = NULL;# ^) d% c5 t' K- ?' Y: U# X$ B, L
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
6 K: e  P% V- }2 D2 P" S        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK), Z. X# B' {( }
        {% X' S/ U" ^, }- F
          IWbemClassObject *pClassObject = NULL;( N: R- o" I" }$ Z
          ULONG uCount = 1, uReturned;3 A3 y3 t4 W( {; Y3 P
          if(pEnumClassObject->Reset() == S_OK), @9 B# |  l8 w  _4 h, D
           {4 |  k! A5 q2 e1 j4 k" h. h
             int iEnumIdx = 0;6 |/ U4 B3 i1 s( _/ V6 Y7 M/ ]2 q
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
! ]) ^% d( y1 _! T, L  C+ @               {. [, T/ I' |. D8 [- L$ S
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");/ P( B* V- d. Y+ B, D

. v0 K2 C0 B1 ^4 Q  Y                 SAFEARRAY *pvNames = NULL;
1 I) Q9 p# f$ l6 y. I/ N                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)8 s1 O" \9 {9 ]4 t; K9 N
                 {! n  e9 `& g* D2 J+ f5 E' e/ e
                   long vbl, vbu;) }0 G' W3 g, q- X! @/ b
                   SafeArrayGetLBound(pvNames, 1, &vbl);
, t  s  H% f5 m- c) Y                    SafeArrayGetUBound(pvNames, 1, &vbu);% p, W& W% X- h6 g, ^6 e
                   for(long idx=vbl; idx<=vbu; idx++)& c# d* D# ~/ X- x! b
                    {
0 _1 |" L7 c) S                       long aidx = idx;
* o8 X+ e/ |! ~                       wchar_t *wsName = 0;9 @& h9 \5 N5 C: B
                      VARIANT vValue;/ @" \: c" ?+ j  d. v% `6 a* C
                      VariantInit(&vValue);
# v5 l' s4 w! y$ C                       SafeArrayGetElement(pvNames, &aidx, &wsName);$ M" x4 T/ i2 ~7 M0 ]0 Z/ \$ V
+ K2 R: ~% b0 A7 t
                      BSTR bs = SysAllocString(wsName);
* m# O2 f' R/ Y2 D( {: u1 s                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);2 N9 q5 l, V7 N8 ]. S; I) y
                      SysFreeString(bs);  h( L( {3 k' R: a. S
2 P: i. U# F8 i5 Z1 G% N( R: F
                      if(hRes == S_OK), a, I) N9 ?" ~8 |7 I9 S* R
                       {
, f5 K$ s3 j  P4 T8 d. X% @                          AnsiString s;
0 |$ @. o1 l+ u- c                          Variant v = *(Variant*)&vValue;- ~* z3 G- Q( T9 }
                         if(v.IsArray())
: X+ r. I6 }# d/ }2 q4 X$ n) }5 g" r                           {
: Y  x; {6 f# O6 @2 B! \                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)2 U/ n! }) E: E$ Q
                             {
1 s2 [+ d3 n+ m                                Variant a = v.GetElement(i);% G' a4 I9 O+ w4 p3 v) E
                               if(!s.IsEmpty())
$ w! t% l2 N- K  d. |8 B  {4 b                                  s+=", ";
' U# O* V* o1 k; I8 ?                                s+=VarToStr(a);
% W5 c. V' O2 J; o0 g                              }
) P0 e# b' c$ `- N: ?                           }
& _5 z$ P8 r$ Q. c8 k/ J% t                          else
, x  r% l9 d' k9 ]2 I                           {* S. n. m- r* V- q/ M$ o
                            s = VarToStr(v);
' ?' h5 o" L! F" Q6 J                           }! u/ l/ _' m4 E+ ^( l! F( b
                         lpList->Add(AnsiString(wsName)+"="+s);" }. A7 \7 D% @2 Q
                       }' K1 l8 ]' ]  B. v3 V8 C. f
7 P8 X$ h% Y+ R# T/ M; n
                      VariantClear(&vValue);; e+ L% [# X# i) u
                      SysFreeString(wsName);* e- Z# F  D3 z5 a
                    }3 j6 X( \6 P) y7 n- ^- w% C
                 }/ H0 E- y  @  Z. ^8 i3 U- L+ H
                if(pvNames)SafeArrayDestroy(pvNames);) v' u" t# p6 z2 R( B) w# |
                iEnumIdx++;0 q0 l; c- U' [+ g% R. u7 I) g: U
              }
- r; Z$ w6 q: ?* o) E            }
. g. p( w9 I( T6 b9 g3 g* p           if(pClassObject)pClassObject->Release();* f, k* w' F3 R( p
        }) J- g, U9 B3 @: M3 b
       if(pEnumClassObject)pEnumClassObject->Release();
+ s; f/ J+ I4 o9 {$ L; Y      }
/ r) D5 b& i# b( h     if(pWbemServices)pWbemServices->Release();
/ G* G* A9 g* N9 E2 d   }
& M$ r& S/ C0 Z, L& T) r  if(pWbemLocator)pWbemLocator->Release();* f! n" F8 |# L
}
# B1 f) T+ V. M5 ]; K. B//---------------------------------------------------------------------------1 y* t$ b6 J, C1 P* U$ O

% Z7 r0 g: u, q. |// 通过 WIN32_bios 获取 BIOS 信息:4 \3 h0 E# l9 D' g3 S1 ~8 @
void __fastcall TForm1::Button1Click(TObject *Sender)
7 z/ f" P' `7 C! {{
. b0 h6 j' Y0 M# d, O* B+ Y    Memo1->Lines->Add("================== [WIN32_bios] =================");
, F& _$ ^4 S8 C7 |    GetWmiInfo(Memo1->Lines, "WIN32_bios");
: O; S! l. k, Z! Q" v: Y    Memo1->Lines->Add("");
- R/ c2 \3 j# D7 M3 W6 }. p& L  z}
$ h" R' |5 U7 N  F, H6 r" F0 D
- q% l3 ]# n% h* `% H--------------------------------------------------------------------------------" M! c1 d9 l: k' V2 J' u2 O0 v# @
6 }5 j) s9 v  C4 y; y2 W
WMI 可以访问的信息类型有:
; D% p1 ~; L! j' }# p- a   Win32_1394Controller
7 d: b5 m' h' `7 w7 E$ L   Win32_BaseBoard
/ U# \0 N' M" N   Win32_Battery4 ]0 s1 x& n( `
  Win32_BIOS  Q8 }7 l$ e& ~. {  \0 p- ^1 s
  Win32_Bus
' J( N6 {( M8 c; p5 A; r   Win32_CacheMemory
7 p' C3 g$ n; O! K3 m  h- d8 ?   Win32_CDROMDrive7 X, R4 n4 W  N5 l/ r7 k
  Win32_CurrentProbe" U+ ?+ v  L7 l( [) g- R8 Y
  Win32_DesktopMonitor
, X" J4 g# p& R5 d! U$ V   Win32_DeviceMemoryAddress6 x9 ^8 f) A  K1 m' e
  Win32_DiskDrive0 V: A4 t6 r6 {* A
  Win32_DisplayConfiguration0 M$ h7 y$ g* |7 v, a5 g! o7 L
  Win32_DisplayControllerConfiguration
7 E. g) Q0 ]  K8 ]0 u- z   Win32_DMAChannel0 U- n- h/ w/ z7 i5 o9 ~
  Win32_Fan
' f6 o1 O; P, R4 P) ~   Win32_FloppyController
5 M& J: H) Z! |# W  G& X$ u   Win32_FloppyDrive
$ n( g8 C* B6 k) n3 D1 k   Win32_HeatPipe5 S0 J  g  V! y) ~6 a
  Win32_IDEController
4 W: F/ Y5 q% h! ~   Win32_InfraredDevice  ~3 b1 i4 x; ^* u
  Win32_IRQResource5 R, T9 E5 Z! M! ~2 u
  Win32_Keyboard
. V( T; D+ c2 U( ^# F! I6 X   Win32_MemoryArray
$ S2 |- Z% n9 x  y: ^% {) H   Win32_MemoryDevice5 n8 k. U' e. G& f/ E2 V) T% ^8 V& v9 V
  Win32_MotherboardDevice
, Q  O3 P1 D+ ^3 l! V3 a- w   Win32_NetworkAdapter
8 T4 h) G- U, b- F/ q   Win32_NetworkAdapterConfiguration
" E/ ?5 v8 ?: z# {5 N   Win32_OnBoardDevice
5 K- S) ?/ b% A! `   Win32_ParallelPort5 \- b6 U  U! \* M9 }
  Win32_PCMCIAController' @3 Y& b0 X& P6 N& x& w
  Win32_PhysicalMemory% x, o7 m  m9 N( [3 J+ w
  Win32_PhysicalMemoryArray
7 b  a- n0 g8 ?. M% _+ W2 N7 h   Win32_PnPEntity
! q, s" M$ Z) z' h, _   Win32_PointingDevice
% y9 e( U$ C; F# @5 x   Win32_PortableBattery
% Q: c" B! D! K: t5 L+ O   Win32_PortConnector
5 k' U1 _6 A' g5 k! j7 H0 O5 B   Win32_PortResource, v8 A* D# k' E7 K, F, u
  Win32_POTSModem+ N- \' O' v) p4 S& q
  Win32_PowerManagementEvent9 @6 [1 A- _$ v# w6 ~& H
  Win32_Printer
( j& S( J, f2 p8 T   Win32_PrinterConfiguration0 x: G' E! b% x
  Win32_PrintJob
' e+ T  C+ R! O   Win32_Processor
) d, M) D  A9 `$ {3 L   Win32_Refrigeration, W* M* T. \7 W  {0 W
  Win32_SerialPort
3 `7 F& F( j7 m$ m   Win32_SerialPortConfiguration
- Z6 Y1 V* t1 U  {1 K   Win32_SMBIOSMemory& {$ s/ B7 C( \+ K  D) e$ I
  Win32_SoundDevice9 v5 v, e' w" C7 N: e, U( }2 j
  Win32_SystemEnclosure8 A  n% D" @# w
  Win32_SystemMemoryResource4 p+ u: u5 `4 \+ p: v. N
  Win32_SystemSlot2 {; w* M: s$ w6 t0 s4 Q( h
  Win32_TapeDrive
& Y! H( s% q+ d   Win32_TemperatureProbe
6 v% [! y% Q" ]; R; \3 X* U( f   Win32_UninterruptiblePowerSupply1 V' k) u/ p2 l5 y, R  L/ @; }4 a1 q
  Win32_USBController( [, ]0 U0 I2 V$ J" c9 q
  Win32_VideoConfiguration
4 X9 }! I+ O" J; V+ K5 W% }   Win32_VideoController
8 w( Q8 z( f$ p: [   Win32_VoltageProbe( ^" |4 o0 p. u: Z1 o4 q

. m! c; u7 |. O以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-10 02:05 , Processed in 0.022299 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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