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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
' y; z, m+ @5 x' Y" p  l, y2 g1 S* J

: u8 L) p8 }, v: n--------------------------------------------------------------------------------/ G4 R4 Z' v2 f+ P7 K" x* m
WMI: Windows Management Instrumentation (Windows 管理工具)
. F, F; o. V4 P6 l   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
. h: O! ]- ^( w! }! i$ D   利用这个工具可以管理本地或客户端系统中几乎所有的信息。" T; P9 j6 g* w' ^8 F! x
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ! Z* q7 b% A" J/ S% [$ O

* j. B" f/ ?5 f+ W7 t0 N--------------------------------------------------------------------------------
* |* ?: O* ~8 @+ I/ x+ I5 tBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面6 r) ]( ]& q+ P, j6 K* B
: C1 P; k" r* W1 d( a
--------------------------------------------------------------------------------
0 _& w: w& ~3 r: i  a( K1 B  h① 初始化 COM 接口:
; E  @5 a  w% j$ x/ N# S   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
: ?; z. a) l* @% {, H   这两个函数在 #include <comdef.h> 里面定义。
9 ]; m# U. W4 P: G# [% m: @4 C2 ?  q8 w8 m
② 获取访问 WMI 权限:
2 L0 J5 H& \, m7 u; `0 @% |   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);8 v2 ~/ F& o* o
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
0 H% O* j0 z3 r" M) A, c& O
/ z" [" n! v' X! b. H9 P) A! V7 G③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
# Z* |: W9 N. o. v2 g1 }# F3 T   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。- l7 @/ _- i; m4 e1 {

% i  @, H0 F+ N& |# jvoid GetWmiInfo(TStrings *lpList, WideString wsClass)4 z# p6 e) g. q
{" Z; G( v( _% d7 p
  IWbemLocator *pWbemLocator = NULL;
) v+ `7 X8 e' [% E6 |2 X  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
9 c  ~9 l5 _+ L- F  }   {
) R8 D  z* I4 F     IWbemServices *pWbemServices = NULL;3 Y+ x/ d, e9 s1 Q' ?* f* g
    WideString wsNamespace = (L"root\\cimv2");
/ C0 Z7 y7 e- w3 W9 I     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
* k, f: s/ x5 J, d      {: f: O/ P$ l; g
       IEnumWbemClassObject *pEnumClassObject = NULL;
; V. O: O  U& ?* {- d4 q. s: e1 x+ }        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
" a) X1 `) `: |/ T+ A        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
) G( @0 Y8 d) v8 r( W         {7 a- ^) q' E( l; A) H4 E& V4 N" y
          IWbemClassObject *pClassObject = NULL;
- P* o" H8 e7 A3 q8 L           ULONG uCount = 1, uReturned;0 q/ L2 L, |8 a3 k$ g2 a0 G
          if(pEnumClassObject->Reset() == S_OK)
. M* k9 R; s- I            {3 J8 U+ F% M; s4 o7 M* Y$ h2 J
             int iEnumIdx = 0;" \" I7 J7 e% g( v- H
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)* w# e! B2 r# x" }# i; \0 m% n
              {
8 s! \1 D/ \: p" S* U& \                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");) k3 P6 W9 m( f% S+ m! p5 H: O
  s0 B8 `' i4 p- I" |# y6 ^4 O
                SAFEARRAY *pvNames = NULL;4 m: y# l5 B) v6 ?" L
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)  I  c6 f2 A( R. j
                 {
9 K! Y% p# z9 M- \( k7 h6 U9 P' e: m                    long vbl, vbu;
: E, M- C6 q( G' T; M/ \. y- s                    SafeArrayGetLBound(pvNames, 1, &vbl);. t4 a0 Y5 h6 b/ u
                   SafeArrayGetUBound(pvNames, 1, &vbu);- W& K& W+ ^" ^' ]: [, ]
                   for(long idx=vbl; idx<=vbu; idx++)* v4 u6 E: x1 o! q  I
                    {
7 l. P( v' A' O3 p% [, |; ~) W; {                       long aidx = idx;
% h8 R, q4 K/ z8 [                       wchar_t *wsName = 0;, I2 O: A/ L& c
                      VARIANT vValue;
8 h( l) K% F# _7 |' c3 U                       VariantInit(&vValue);
& `$ `5 b) h' s/ a6 b                       SafeArrayGetElement(pvNames, &aidx, &wsName);4 M9 l1 d' j$ Q
: X% E/ F0 w3 d- q  B- ^' ]
                      BSTR bs = SysAllocString(wsName);8 e- t2 V5 u8 Y3 t8 t; l1 Q
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
% u$ Z7 C9 c! ]4 ]- s. ?                       SysFreeString(bs);
* j4 @: K! w- J1 c7 k, ^6 R- ^) W8 U1 M; g% u" b
                      if(hRes == S_OK)
; o7 z" \0 i" _6 ?: [                        {
- J& `0 V5 `/ H% n  M                          AnsiString s;
0 H$ y3 C# F1 h8 L8 Q+ Y  o  e) w. h                          Variant v = *(Variant*)&vValue;, E/ e: N& l& p$ ^
                         if(v.IsArray())
: F7 W  H# F; D* {9 ^- v                           {
( U2 _+ R/ s% g9 @3 L( R/ P" x                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
' t& k# h3 _; k& a8 U: G                              {
7 ~8 v4 ~* U$ ~4 ]2 f                                Variant a = v.GetElement(i);
1 {4 `; N9 \( D  ~                                if(!s.IsEmpty())- w% k9 `& V1 @" o' @
                                 s+=", ";
; F7 w& v6 K$ _7 ~% B) p                                s+=VarToStr(a);0 T! ~* G% w; ~6 o9 o9 |" }# i
                             }" R& X2 f5 e7 `" ^* Q# L5 o
                          }
- G( Q6 \% a/ u3 Q( G& r                          else4 B& X/ B$ L* r& `; I
                          {5 }- q0 B6 k! }$ M0 C. A) h
                            s = VarToStr(v);
+ y, R: A5 d+ p9 e                           }0 W2 w7 u7 y! D/ L% X( U
                         lpList->Add(AnsiString(wsName)+"="+s);! t+ _" M2 @0 V  w2 t, o
                       }
+ |: f6 ?* @# {* X; @7 q% i- q/ I7 I( _
                      VariantClear(&vValue);5 ]! |. z  J) d
                      SysFreeString(wsName);* `+ m* w) F4 J8 @' m' t  l
                    }, v# Q" x  `; g6 T& l
                 }
  }; ^: F5 b! ~6 o                 if(pvNames)SafeArrayDestroy(pvNames);! ]3 r9 r& o$ S5 Y1 `7 W3 c# F
                iEnumIdx++;& k  F# D9 M% ?
              }
# Y2 P. u. J- |2 ~            }
8 {" P5 p" m; ^           if(pClassObject)pClassObject->Release();- ]! x% p& S- M$ l* j1 t
        }
; S# t, S7 F, |" U% @        if(pEnumClassObject)pEnumClassObject->Release();
- z( r2 o. a1 r6 s5 d      }( @2 g; i4 L# c5 Y( X1 U
    if(pWbemServices)pWbemServices->Release();0 W) {: w: Y8 ?7 p  |% a6 Y" a+ {
  }8 Q6 V7 A$ v9 a  g0 }
  if(pWbemLocator)pWbemLocator->Release();
6 F& F* ]  A8 k) {) O}
5 F( ^- ?7 |7 C* O. \//---------------------------------------------------------------------------
# s: E/ U, g( W. e+ U' ?
( i& u  C2 D! U- `9 I" l, T// 通过 WIN32_bios 获取 BIOS 信息:2 V$ z" q4 r) X
void __fastcall TForm1::Button1Click(TObject *Sender)" y' w* l5 B! D# w
{. [: c9 {% x5 F! H) d# E9 B* d
   Memo1->Lines->Add("================== [WIN32_bios] =================");
4 ~+ k( h2 h, A0 U! l' ]) q    GetWmiInfo(Memo1->Lines, "WIN32_bios");
1 C' t+ w% }0 n" x    Memo1->Lines->Add("");
+ M+ m, ~5 p4 ~}
1 }& _) e, ~* A2 m% V8 V( ^0 h' u8 a& c
--------------------------------------------------------------------------------. J# T' j& h0 f

; S- }7 E$ @3 u. X: xWMI 可以访问的信息类型有:
, \. V. m3 r: @8 Q9 f: T* t5 _7 }   Win32_1394Controller2 J, w: a: G% m: i; ^
  Win32_BaseBoard$ j& O" k# k1 \  h! I
  Win32_Battery) A) X; |% g( P' f- }
  Win32_BIOS
7 k, _6 M# [& W& P$ {   Win32_Bus7 ^# e" y9 Q# Y6 ~
  Win32_CacheMemory
, G1 o6 d5 o  L4 G" {   Win32_CDROMDrive0 |2 D' Q, r* m8 f( ~
  Win32_CurrentProbe2 F6 L& K8 c( e, \+ K$ {
  Win32_DesktopMonitor
! \6 W" S& E; [( O! C/ Q3 a& t! ^   Win32_DeviceMemoryAddress
9 d' n8 A& l! c/ k6 C; \1 V& I   Win32_DiskDrive# Q( u. U+ A8 E8 l7 |- ]
  Win32_DisplayConfiguration! V# G) z* i5 ^
  Win32_DisplayControllerConfiguration& ^" D6 i2 g7 Z* h' n/ j) Z
  Win32_DMAChannel7 \" Z5 J5 c# f% Q  q* k+ _6 K* s
  Win32_Fan
% O1 j  E+ H" q  p' |' k   Win32_FloppyController
' z8 s. J; s0 O9 ~4 M   Win32_FloppyDrive
( z1 r3 E! h1 r8 ]- X: _   Win32_HeatPipe
, J9 [6 ~1 l0 N   Win32_IDEController
: v( y0 L- L$ O2 e   Win32_InfraredDevice$ p( t( T# O- \# M/ V
  Win32_IRQResource: r; i" W- d# P( B: e
  Win32_Keyboard
! s, |) j7 L( ^3 E7 a) l   Win32_MemoryArray
# x; Q2 Z& T4 R   Win32_MemoryDevice9 j1 }% p' ~7 ^9 m7 s. _) c
  Win32_MotherboardDevice
" ?: A# ~6 i! K; }% V, S   Win32_NetworkAdapter! `/ k/ p9 `6 C5 ^& J
  Win32_NetworkAdapterConfiguration
, V, `6 G4 W- X1 A' t6 I5 u   Win32_OnBoardDevice5 a' }& v* h: F+ D! n- @) T
  Win32_ParallelPort
5 S* s5 Q/ `5 Z   Win32_PCMCIAController: s7 g8 h0 f3 j5 C4 U4 w! W
  Win32_PhysicalMemory! h. c+ J6 ^0 u: K6 _5 U
  Win32_PhysicalMemoryArray9 f6 E- r+ d9 e! ?% u
  Win32_PnPEntity! n1 [! I9 T' D" l2 w( i
  Win32_PointingDevice
/ L+ e9 y; w( o   Win32_PortableBattery& Z3 \# X3 ]' {/ k% g
  Win32_PortConnector# v; U# p' m; i; O. n5 q
  Win32_PortResource: v/ r5 {# m% _: F
  Win32_POTSModem6 O. f: p% r  D$ [9 ?
  Win32_PowerManagementEvent
. T/ ]* B8 B  J- y   Win32_Printer/ [# e, J2 i+ D% B3 Z
  Win32_PrinterConfiguration
+ I" J6 o- }/ D  {' [; W  B   Win32_PrintJob
- k: r( h& K9 X7 G4 n   Win32_Processor
' [2 v& P# Z' A! R2 a1 P   Win32_Refrigeration
5 ?8 W: w' h7 ~2 E; [$ c- o1 }+ K2 u   Win32_SerialPort  Z1 s& l' b+ ~0 O: I! _; c
  Win32_SerialPortConfiguration3 e3 r2 y) N6 D9 Q
  Win32_SMBIOSMemory
$ y; f3 s2 @; W' l; J7 I   Win32_SoundDevice. X3 m8 ?5 `9 {
  Win32_SystemEnclosure0 ~' ]9 p' S  [" i- `, y7 S
  Win32_SystemMemoryResource" @& x* R/ k+ j# ]2 M; y# f
  Win32_SystemSlot
5 t& J* ?+ M2 f% y/ c  Y. d+ M   Win32_TapeDrive
" \4 F' d* @1 h6 e2 A- t; W   Win32_TemperatureProbe
! ~' s7 m+ a4 ]   Win32_UninterruptiblePowerSupply
6 W0 R; A! O- t. a; k- y* D   Win32_USBController
+ Q9 H6 j0 z4 y8 _7 l/ m  k. a   Win32_VideoConfiguration
7 B  S* }9 S* y) v; y: ~# W8 p. p   Win32_VideoController/ L) A3 V: l7 C
  Win32_VoltageProbe
6 `1 y+ z8 X" P6 o$ D
5 H, }/ w, L7 P& n; ~, L: S! K以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-27 10:47 , Processed in 0.022139 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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