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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
: b% [; Y* C% P& O1 D* L- \
' ^4 H8 p4 {1 c+ D9 C- \+ H$ r# u, n: E$ L
--------------------------------------------------------------------------------# A1 v* u( T' v+ c* y. [8 V! f
WMI: Windows Management Instrumentation (Windows 管理工具)
3 U+ S# a4 t& x3 `) e. h9 w; U5 X& x   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
" k# U9 t* L6 |   利用这个工具可以管理本地或客户端系统中几乎所有的信息。) y0 l  e4 w  T2 ^- w
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 3 X3 N1 X5 f7 }* [( `% B; u
5 H4 g* _" q' X. b
--------------------------------------------------------------------------------
8 c, c  I4 f- o! [. q4 UBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面3 T" G; m% K  h2 r3 k4 V2 z0 _
% d" e8 T* W' h) D% u6 j
--------------------------------------------------------------------------------: F8 {0 |% j3 N" x: n& A
① 初始化 COM 接口:
$ ^* |' ?. m" |   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
# J3 j. L3 @) f2 U   这两个函数在 #include <comdef.h> 里面定义。' E0 c3 Z$ w& s2 N1 t, y8 ?+ Q
* M4 Z. b! k4 z5 |. D5 N! p* I
② 获取访问 WMI 权限:
0 V9 H  m# u9 h, Z# o   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
! x0 h+ o) D5 s6 h8 M% V   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
8 H& [! S) z8 r, o6 x( T: i7 o# @2 A' O- v
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
6 V3 B2 V& i+ |   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
. O9 W' c% `6 `# h1 l/ I' K/ F# r; v+ b1 N- F5 O5 B
void GetWmiInfo(TStrings *lpList, WideString wsClass)( F2 V1 ~+ ?1 I0 l* M
{' Z+ n$ ^, F$ _/ u
  IWbemLocator *pWbemLocator = NULL;6 k- G! f6 l2 x& c2 G: Z2 G
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
2 v' g2 P4 ?$ m2 L! o/ _   {- y- n# }" q1 q6 t
    IWbemServices *pWbemServices = NULL;
( j1 q, }1 R3 ^' B     WideString wsNamespace = (L"root\\cimv2");
$ X: N5 z& d& C  ^     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)% e1 J$ ]4 V" G9 f( j: Y( _, e
     {; w# w+ t; H+ Y
       IEnumWbemClassObject *pEnumClassObject = NULL;3 C3 S# I7 k& n2 ?3 z
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;1 H$ v- z) K; v6 V
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)8 ?% q: h# K' W! ?' }
        {
! m1 i4 n+ l2 c& X; j0 q# I           IWbemClassObject *pClassObject = NULL;8 N( h2 B. c; d3 e5 B, T
          ULONG uCount = 1, uReturned;" q: g9 ^+ U, Z, v- E( D
          if(pEnumClassObject->Reset() == S_OK)7 O" P1 c  F6 R% n0 J# Q+ B
           {
# E" W5 m. }, ~' h              int iEnumIdx = 0;
. g9 c$ [* @% `! H2 O/ g              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
+ {( P4 i- C) w" {& g' T( P               {; m# q& _, P9 m/ m- ~
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");( p( T0 k4 X: O! }! X! Z6 m
1 s' z: z& e' ^" d9 v8 |9 Y: U
                SAFEARRAY *pvNames = NULL;0 D2 p: Q, ^5 s6 f0 v
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)7 i  ~& G; a4 Y# Z2 D) z% v& |
                 {
1 k$ [: C$ A4 ~# i                    long vbl, vbu;
! y9 f' Q6 [* T                    SafeArrayGetLBound(pvNames, 1, &vbl);
0 @5 y# a: h, c7 T: D8 t3 B" f0 o! O  M                    SafeArrayGetUBound(pvNames, 1, &vbu);
2 Y' S, w) g( m" C. ^                    for(long idx=vbl; idx<=vbu; idx++)
; U; a2 b/ L* |5 n1 @8 v2 }                     {
4 k4 g; r: x' R; L, m                       long aidx = idx;- M: Y, a6 X1 f" ~( b5 o6 K+ V
                      wchar_t *wsName = 0;8 m$ r+ t( [: Z. c+ U
                      VARIANT vValue;' o" c, {+ W8 S5 d, |& l1 D$ s
                      VariantInit(&vValue);
7 H8 b$ T- r. k5 {                       SafeArrayGetElement(pvNames, &aidx, &wsName);0 w! [9 _9 [: z. X
) o7 }9 D1 b" |6 |5 P- [5 t" A6 P& {
                      BSTR bs = SysAllocString(wsName);
4 m5 n) F$ s/ c9 l' L% j                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);# D1 H# X! y. p
                      SysFreeString(bs);
$ I" C( ?8 X' L+ O* H+ X2 S! g- E+ U, @6 r! h/ q) t
                      if(hRes == S_OK)
0 G2 b8 {4 o0 w- x  A! h% v/ u) B                        {
2 L& k& x  D" ~7 @/ S5 g( B                          AnsiString s;
, I' K$ p: F3 V' J3 G' N                          Variant v = *(Variant*)&vValue;
" z: k* ]9 T3 P$ q. J; W                          if(v.IsArray())
; m7 [( u+ L2 D+ [% P' n: k                           {- L$ x  @  ^1 {% [6 ~2 V
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
8 k' G  y+ \/ E                              {
  i9 K2 g( P4 I7 d                                Variant a = v.GetElement(i);
" ]% l1 x/ m" q" T- P1 ?+ q2 u                                if(!s.IsEmpty())& z4 X  B* L! x, m( V7 k
                                 s+=", ";5 H0 @3 Z+ T" L2 G! O, \
                               s+=VarToStr(a);  A+ s: K( ~2 m1 \# k
                             }
" \! f( k  Y' i( D4 q0 u. A                           }4 F9 \! S* p& m9 C3 Q- a# q. O
                         else( c) c- E% g2 E
                          {$ F( }8 }" C$ \1 {' n
                            s = VarToStr(v);
* g9 U! F: d2 Z! R                           }5 U: s/ s, D$ Z: O" k, o
                         lpList->Add(AnsiString(wsName)+"="+s);
# t9 X# r: v8 b: [- ^                        }$ {' G% q, |+ E; s4 A, J$ E

4 b: N* R; n% A                       VariantClear(&vValue);
- }3 |& r/ V3 t$ O: l                       SysFreeString(wsName);  S. J  |# R/ _' K, l
                    }+ n% o# ]3 L7 }- t% W
                 }- \2 g9 X; @& e
                if(pvNames)SafeArrayDestroy(pvNames);
: j3 U% |& f2 u" ?; Z# p6 e                 iEnumIdx++;8 w' Z6 ?; m" ~5 K; M6 f
              }
; `3 g9 e, c) `# b. t# ^            }1 V+ w( O' F  @& I5 C
          if(pClassObject)pClassObject->Release();
+ i/ G7 A; C. B- `4 R         }' F7 i& v; _0 R3 t# ^
       if(pEnumClassObject)pEnumClassObject->Release();
+ [( J, g3 n4 M+ C. L      }
$ T2 J5 i! ?$ i' S8 K     if(pWbemServices)pWbemServices->Release();
9 Z' h. E' Z3 O) b& I, e$ G  A7 E( f   }
1 Z0 _4 k5 h0 `% @! [+ f; D  if(pWbemLocator)pWbemLocator->Release();
. r2 Z" w  U7 S. Z# J) x, p) J) o+ D7 i}, k: z& O/ U- [/ L1 E) U4 C
//---------------------------------------------------------------------------
5 W' v( Q2 v# ]7 @, ]# m" ~
$ U$ X* h3 h2 V// 通过 WIN32_bios 获取 BIOS 信息:
1 T  s: F3 m* z2 n& Svoid __fastcall TForm1::Button1Click(TObject *Sender)
) C" ?4 p" E; A6 a/ i, W2 n3 I4 B{
  \" c; H* F/ P- v/ v    Memo1->Lines->Add("================== [WIN32_bios] =================");
+ s7 `1 C  _0 j4 [" S, G3 x  D9 @    GetWmiInfo(Memo1->Lines, "WIN32_bios");( i; |! t9 |6 U4 m
   Memo1->Lines->Add("");
( s) y' H: J% c* e* U}( R2 {7 m; t. t6 f

$ H9 ]) n: d. A2 x--------------------------------------------------------------------------------8 {. d( C! O/ p+ q; ?0 T8 G

3 ?8 y3 u2 P* D8 ^$ c: q! z3 w( lWMI 可以访问的信息类型有:
7 Z# I9 f$ \' f- Z6 |$ r# Y( z   Win32_1394Controller
; B5 J& [( Q7 L2 |5 A   Win32_BaseBoard
. k% X3 Z$ B3 D0 `$ ]   Win32_Battery4 q0 I% O9 _7 K4 P
  Win32_BIOS6 y% @6 r8 w& ~) I
  Win32_Bus  ^# I" n3 _8 `; |# L6 ]. d
  Win32_CacheMemory
0 r  n  @# p$ f+ p   Win32_CDROMDrive
$ G( \1 i9 P  A) W& ~. `$ y: Q/ D0 T   Win32_CurrentProbe" G# ?, I) Y( }
  Win32_DesktopMonitor
2 b5 i; I) y4 }: G5 _6 c0 [; t   Win32_DeviceMemoryAddress  z* G) A6 f3 q( v" E
  Win32_DiskDrive
# P. }$ [& e: x- c/ k# T   Win32_DisplayConfiguration
: S/ w) P+ _' s+ o' a   Win32_DisplayControllerConfiguration
) x$ K5 |5 o# `6 [) N, c   Win32_DMAChannel
% S  G, i" D7 B' R0 Y* ]" }2 l3 O$ h   Win32_Fan
# c, e$ o, ]* G2 ?  \4 ]   Win32_FloppyController
5 w% H" s" T9 i- M) w   Win32_FloppyDrive
$ y9 @% m# L/ ?( Y1 d2 O' g' g   Win32_HeatPipe
- ?8 R6 E- h4 l' R/ z3 @   Win32_IDEController
  w! U1 e  v8 L  [3 ]0 G8 p2 z* D   Win32_InfraredDevice/ l# ~  c( Y* X  K
  Win32_IRQResource6 B1 v7 i! I8 }4 Z3 V
  Win32_Keyboard& ]% P9 D% c! u( }% _7 ]
  Win32_MemoryArray* Y( [5 D% \9 [* D: d& H
  Win32_MemoryDevice
# f& C( j) a( A! T/ H) ~, B( `3 H   Win32_MotherboardDevice9 Z; S* X' b) A! t. R
  Win32_NetworkAdapter
& ~+ }! ]; H* H! a& S0 U   Win32_NetworkAdapterConfiguration
8 E6 O+ F7 |$ _7 ?! a   Win32_OnBoardDevice/ Z; E4 ~1 U' J
  Win32_ParallelPort* c/ u4 J  b( D  N6 U$ E: a
  Win32_PCMCIAController
, r4 t& _# ~  r   Win32_PhysicalMemory/ w. [# r6 C& q- v
  Win32_PhysicalMemoryArray( A) c5 s& U0 a& j6 U
  Win32_PnPEntity1 _- X* @; q: Q+ G
  Win32_PointingDevice
8 w# E: L+ C* F   Win32_PortableBattery7 d; l2 X: [6 c( F1 ]4 q
  Win32_PortConnector
% N+ j5 j, i0 N* p- C   Win32_PortResource9 b% |" t3 t+ _
  Win32_POTSModem+ J+ I3 l+ y5 l
  Win32_PowerManagementEvent
+ ]. Q" n9 J- D3 s! c   Win32_Printer" P; W; P1 n! `" y4 K
  Win32_PrinterConfiguration
+ k1 X3 a3 i0 G# K   Win32_PrintJob: k% v$ ?' Z4 f0 O7 C9 j- ^
  Win32_Processor
, ~# {% u$ N" O  N1 Q4 M   Win32_Refrigeration
; N+ `, y6 \/ a   Win32_SerialPort
+ x1 R% d) k; F  C   Win32_SerialPortConfiguration
5 H: B! F8 N/ W' S# }" s   Win32_SMBIOSMemory1 G6 X1 L" k2 M5 m
  Win32_SoundDevice7 D- o# E! n3 l
  Win32_SystemEnclosure
! E! E) M+ }6 K; K   Win32_SystemMemoryResource
" m  H4 _7 k9 B+ B# q' O4 W+ |. f   Win32_SystemSlot
; w3 }; ]( F) P* W* @9 G   Win32_TapeDrive
* Y" ?7 F3 A7 z( L   Win32_TemperatureProbe
$ f+ w- ~: c+ ]4 R% _8 G   Win32_UninterruptiblePowerSupply7 h( }; ]/ A& ^; O/ F/ I
  Win32_USBController0 |" o1 h* j: N: E/ F
  Win32_VideoConfiguration
! O9 j, f6 q& U& m' |   Win32_VideoController% h1 Y4 ]. K- T- h( ^
  Win32_VoltageProbe% d* F. Z# x+ Y. h: `3 L1 d
: q# E, o1 m# R8 {6 p
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-30 11:38 , Processed in 0.021216 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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