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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
7 r, q. J( ~( g7 s5 m1 L$ z" f+ ~! |

: |% C& Z4 `) e0 ?. R+ N--------------------------------------------------------------------------------  i5 A3 @4 I  G3 }0 _* `
WMI: Windows Management Instrumentation (Windows 管理工具)
4 S6 l) K3 L8 f% ]1 `' p   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 & a6 W- ~0 X. x6 L+ V5 n( q
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。$ v. w5 Y: U2 v! }/ d
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
$ [( n/ w! C. {6 b0 e8 v6 b$ f" {& G# h6 ?$ O, S
--------------------------------------------------------------------------------$ h, U+ i. c+ C8 e/ d  X: v7 G8 d
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面, w- b' V/ m3 M  M( X5 o
  `- U: K4 ^! o) c6 l  F
--------------------------------------------------------------------------------
% a7 t; I, q3 H8 J: c① 初始化 COM 接口:
9 E; x3 P6 E( F) Z2 X6 _1 @* g   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。1 u$ j3 {2 _9 _2 z0 @+ D( `
  这两个函数在 #include <comdef.h> 里面定义。  Z( o+ Y4 }6 X/ y' y/ c
. U2 e% L/ x; ~5 }% i
② 获取访问 WMI 权限:% k  p$ U; m8 q" o+ b* u. ^5 Y
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
' Q7 U# t2 M* k7 [- M   如果这个函数返回 S_OK 获取权限成功, 否则为失败。; d; E- [+ v7 f/ o

% b9 f" x: n4 V③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
0 d/ u4 n) i* {   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
$ A$ i% y' }: R( X; L2 R+ E, W* i4 W9 h2 x& L5 t
void GetWmiInfo(TStrings *lpList, WideString wsClass)8 T! |4 d- N3 s, V" L2 c
{6 T+ B( d3 R$ @. m7 N, C) `( W
  IWbemLocator *pWbemLocator = NULL;
$ b& S! y6 p) P# s8 T  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)' B7 I9 d3 E6 P2 M
  {- W. z$ J8 o0 z1 y5 J8 Y8 E
    IWbemServices *pWbemServices = NULL;
5 h5 I% y) i* z; M* K8 |     WideString wsNamespace = (L"root\\cimv2");0 }# _) q" j" H' T
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
; H- p% X$ L6 M7 l      {
/ r* L, x& g: E! ^        IEnumWbemClassObject *pEnumClassObject = NULL;
- a% R/ _7 l3 `, w: ], m( z  t' G! ~+ D        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
2 }+ V5 ~1 V9 \% k8 s* Y        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK). A8 d: v& M. e3 P( g) v3 V4 n/ [
        {. C9 Q: z. X) m( _6 T' r6 l4 ?
          IWbemClassObject *pClassObject = NULL;6 `$ I6 S- ^, P7 c9 ~; A$ ~
          ULONG uCount = 1, uReturned;) Q$ O- ^* q, i1 E+ y
          if(pEnumClassObject->Reset() == S_OK). S1 F: j2 n! @# c- _/ N; D
           {1 ?$ f8 D7 L: k6 _' T0 @
             int iEnumIdx = 0;
8 p7 y1 h2 w1 ~              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)% O, ~7 q4 n  ~. @0 e
              {
6 C2 n, Q2 T4 F; A                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
3 e( X& z* V( e  n9 q3 f0 Y8 b: Q1 S
* g& q% Y; H! b$ i- X6 t* n" f9 h1 ~                 SAFEARRAY *pvNames = NULL;
: e7 z% ^( B' s$ R) a                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)5 U$ {5 D2 ^- C/ A  A+ |
                 {
/ q: t. e$ _) H1 R) J                    long vbl, vbu;
4 l; x/ a7 m3 g; }! i7 Z! q$ m                    SafeArrayGetLBound(pvNames, 1, &vbl);
( u+ a) X* U# e                    SafeArrayGetUBound(pvNames, 1, &vbu);
6 H! O- ~1 _% Y: V: b                    for(long idx=vbl; idx<=vbu; idx++)" W0 V/ c7 Z, o+ c
                    {
; g  q, ^5 i1 Y' i                       long aidx = idx;6 H7 K! O, W, j) i
                      wchar_t *wsName = 0;
& E4 f. t& y# o$ _, u; x; X- B0 R                       VARIANT vValue;( }9 h, G- }% X3 K8 v9 S1 ?
                      VariantInit(&vValue);
& S( T  `0 }0 v' V; M2 c9 O+ a                       SafeArrayGetElement(pvNames, &aidx, &wsName);
: \2 d8 U0 ?# m+ J9 S% X- k  U/ z8 h1 H+ |
                      BSTR bs = SysAllocString(wsName);
- ?0 Y& T/ Q+ m6 O( K( B                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);. n' Q7 _* I$ L9 O4 r
                      SysFreeString(bs);
; C. ^; z- Z% t
# p) }" X- X8 _                       if(hRes == S_OK)& t: M+ k+ _  s% `
                       {( Q: |3 r# T' ^4 _: F" c
                         AnsiString s;( G- d3 W1 g! b0 |- S0 {* M: Q
                         Variant v = *(Variant*)&vValue;
9 V8 N  c- o: J) e! f                          if(v.IsArray())
  K( O3 q0 }7 i; x/ b. l) G                           {
6 k2 O  t' l7 R% Q! {9 }! \' ~) V                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
! }6 r8 t$ C0 P' }                              {
1 \" }5 {" [. o$ F' [- [                                Variant a = v.GetElement(i);
" G) w$ l6 {0 V8 g# L0 t6 K; }5 M                                if(!s.IsEmpty())
! F2 c* T! i2 x" u% W/ z                                  s+=", ";
$ z+ K! K& [  \/ \, _2 i0 ]0 E; k                                s+=VarToStr(a);$ }( E" `; T/ B
                             }
3 T' q$ Q+ v  N) T                           }
, o! ?  g+ q$ r  g                          else
7 k( ~) y- f- F                           {
5 w. [  D$ d# G6 F- w7 m                             s = VarToStr(v);$ ?, U7 t' z3 D3 E
                          }/ e% _$ }: Q$ P; J5 R+ ?
                         lpList->Add(AnsiString(wsName)+"="+s);
% Y# u, B' N; L, j5 u/ ^7 [9 s9 U                        }+ c! A( i+ O# X( V1 [% B  B0 H

, {' r( D- v! }& J9 @9 j3 x                       VariantClear(&vValue);1 V' j$ k" p- L$ X& P) f
                      SysFreeString(wsName);
3 e- I5 ~; I6 b* S                     }) _% Y% Z8 A3 s/ ]
                 }
% y% a4 H& e: N% J* Y+ q6 z                 if(pvNames)SafeArrayDestroy(pvNames);$ P& h& ^  g; M
                iEnumIdx++;7 ?+ X& p: h. R# b# m; q
              }9 J& g! P7 }% P
           }, m7 o6 |# t$ @
          if(pClassObject)pClassObject->Release();
( l; i& {0 s/ S0 ~! N3 t  t; F         }- L% B+ u' U  `9 ^9 r& S
       if(pEnumClassObject)pEnumClassObject->Release();# F8 E0 K( e" h+ ^
     }
8 O+ i8 b# D/ ~3 }! |( u$ b% x# y! z     if(pWbemServices)pWbemServices->Release();$ @; O7 N7 {4 G& F
  }
0 ~" q  k3 ^: [& d8 a  if(pWbemLocator)pWbemLocator->Release();
/ F: J1 z+ M2 D* s! a% b}0 b- k- G5 x( Q0 S/ D
//---------------------------------------------------------------------------
& T! r5 X' a. P& t- ^) t
* ^  o0 g# Y& @1 C/ g3 R// 通过 WIN32_bios 获取 BIOS 信息:
4 [6 k+ o% H; U3 Y* `. ]void __fastcall TForm1::Button1Click(TObject *Sender)
' \' `8 s& G) N# z  M! j+ u{
1 G! s4 v0 A  e0 `, T$ |5 s2 t    Memo1->Lines->Add("================== [WIN32_bios] =================");+ c3 q7 f! S  o/ Y) F# C
   GetWmiInfo(Memo1->Lines, "WIN32_bios");: {' \( F& Y, w3 M! H3 b
   Memo1->Lines->Add("");6 n) L/ y/ j" F
}9 d0 s& i. X8 j: b: t1 `) A

8 ~3 k; Y, M: Q' G1 b8 I--------------------------------------------------------------------------------- Y$ u& Q- V6 ?
' q; H/ I/ y. T( n) O# C8 p
WMI 可以访问的信息类型有:. l1 [# W; [; p1 R) G
  Win32_1394Controller
5 v7 n. q9 V) {1 s" i4 i   Win32_BaseBoard
: D/ x; k. l9 i6 ?+ T- B   Win32_Battery9 m' y0 O; Z9 s
  Win32_BIOS+ T( `+ L4 B9 d$ S2 n
  Win32_Bus5 q# }# n+ T/ z! ]+ S9 i; Q/ ~
  Win32_CacheMemory# x; B4 i1 L) Y& b
  Win32_CDROMDrive
+ t6 n& u# k4 Q3 O9 j: ]& i  R   Win32_CurrentProbe
$ N) b! J* I) Z1 n   Win32_DesktopMonitor; t5 d" w: S' Y8 s# p' K/ r9 b
  Win32_DeviceMemoryAddress1 l; ]/ V5 D1 M& f% Z0 n7 Y+ N
  Win32_DiskDrive
. q, V3 f2 V1 m   Win32_DisplayConfiguration  O5 h2 Z: b% r( k4 l% f
  Win32_DisplayControllerConfiguration) C6 o! u. W  \+ }1 m( O
  Win32_DMAChannel8 i% z/ F3 m. }
  Win32_Fan" q# m0 E" C1 C/ w6 a
  Win32_FloppyController
" j+ C. T/ x6 i) X& J7 x   Win32_FloppyDrive
2 ]" e$ K; w+ y3 E   Win32_HeatPipe* y" U# U7 ]4 p1 E- ]# Q
  Win32_IDEController
: v# B4 E+ Z: |7 b+ `   Win32_InfraredDevice
& J1 J" H7 ~8 w( T1 \   Win32_IRQResource6 B* `8 m  L, r( T2 b- d% W  w
  Win32_Keyboard
% p5 u1 p; n& ~+ V+ r: C; Y; o* O; B' a   Win32_MemoryArray; |0 N/ \$ q. r. T
  Win32_MemoryDevice# g9 q+ ~. \! L) R/ l
  Win32_MotherboardDevice9 N( F, x) l! J8 t' ~
  Win32_NetworkAdapter
* [. M) n& {' _% h3 x6 `   Win32_NetworkAdapterConfiguration/ o4 k) K# P+ c& G8 D9 F* o* |
  Win32_OnBoardDevice
& j0 e+ M9 [" c  a' ?0 L, E2 o   Win32_ParallelPort
' U. V+ F0 n) `. {   Win32_PCMCIAController
; r. P* G' F  u# C  u2 I0 M   Win32_PhysicalMemory
- k+ o; l6 U  ^; x& T/ w9 Q   Win32_PhysicalMemoryArray
  G" S: P* [4 X' \0 t   Win32_PnPEntity
$ O$ ]/ b  N. ~, U7 D' w6 ?   Win32_PointingDevice9 U$ \+ O- r, `; Y
  Win32_PortableBattery
* s- g9 Y" N0 @) `% O   Win32_PortConnector
: |+ ^- H% S/ Q7 D   Win32_PortResource
3 M$ f0 k. b" n3 `   Win32_POTSModem% j/ n6 t6 l2 n7 P* A1 o/ q
  Win32_PowerManagementEvent
1 n- U1 M; O1 v& s   Win32_Printer
4 Q- I7 j; H1 i  x   Win32_PrinterConfiguration" F7 u* W+ X& _1 g
  Win32_PrintJob
' E& D7 q% n# V+ r+ f5 O+ W   Win32_Processor2 s' k9 Z& B* t! N6 Y! m
  Win32_Refrigeration
5 I+ v; U/ F' n1 f- i   Win32_SerialPort
3 E3 `/ S* X) s6 n   Win32_SerialPortConfiguration' c* t0 E& a; J. }
  Win32_SMBIOSMemory& m* n$ |$ u# V! N$ n0 l' Z6 a
  Win32_SoundDevice0 @) T3 s. E, P5 s' v6 e% y' I: k6 O
  Win32_SystemEnclosure
1 C8 y3 ~* ^$ o/ }. P; e4 j   Win32_SystemMemoryResource$ d9 Y: Y, K- W4 n5 N
  Win32_SystemSlot0 m6 \. u$ E9 P' G9 @- o- [3 L) Y
  Win32_TapeDrive
& u. ?' K& x  ~0 D+ P) o; B! o9 O/ J   Win32_TemperatureProbe4 ~3 M4 Q& b3 H3 d2 A6 A
  Win32_UninterruptiblePowerSupply
2 w& _+ j% {% q& e; M   Win32_USBController
" o# @: Z3 q3 q4 k; E   Win32_VideoConfiguration6 r8 G1 `- P$ \& ?" B. q5 X1 z
  Win32_VideoController& t% m! z" ^& ~% u* a# P8 [
  Win32_VoltageProbe( w/ N* l, R- f0 \& u$ _  d3 }- c2 t9 X4 d9 Q

& o2 `( o1 I+ O( A+ _8 P以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-7 14:15 , Processed in 0.021001 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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