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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)  i; g9 s, l5 i! r

  Q/ C9 g. T7 o  j
; {8 t. }$ L$ i& Y5 ?--------------------------------------------------------------------------------
/ K& S0 ^" K" U! p- V, ^; h& UWMI: Windows Management Instrumentation (Windows 管理工具)6 C  h: w' s  ]7 _
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
6 d% B' e, N- l& x   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
+ ?' o; O" z1 u' Z* E- B   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
5 @! J$ Q5 G7 D1 c8 s2 R: Y: c4 z* Q+ T
--------------------------------------------------------------------------------
: u" l) g0 X4 V9 D' R- l& X" a( VBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
) T2 l8 M% m: L: r
' U! o! A1 ?7 e4 l--------------------------------------------------------------------------------1 T: R$ N) Z6 g6 O* z( e
① 初始化 COM 接口:* I8 z8 ^6 h7 Q
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
6 G: l( J0 y6 c7 Z+ f, }2 j   这两个函数在 #include <comdef.h> 里面定义。
/ I* w7 o4 C: H) M# w; V( T/ o4 m) o& T' V% |2 l7 }
② 获取访问 WMI 权限:; p$ V$ r- K  q; M; m) G  }
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
6 }) Z6 I; b4 }# x, R- H   如果这个函数返回 S_OK 获取权限成功, 否则为失败。' C  I& V0 |; R% R4 d4 _/ s+ e

8 X" H- |1 h0 B( Z# K③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
, t) F1 u5 m# l   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。" R; I7 q8 v1 _
7 ^; w) {- G" g* z5 |5 c6 k
void GetWmiInfo(TStrings *lpList, WideString wsClass)
- w; l' I4 q4 n% ^; r{( T5 Q* x7 Q+ P  ]* K
  IWbemLocator *pWbemLocator = NULL;
" c& H/ E! a. O* k8 h) Z  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)4 a7 a% ?  X, K+ J% c! g. W! X, m6 t
  {2 t7 i9 Q. K! r- W$ K1 O' i
    IWbemServices *pWbemServices = NULL;7 y0 j3 v0 S' e5 G! h+ u
    WideString wsNamespace = (L"root\\cimv2");8 b+ {# {- M; H' D. a
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
7 l' ]! o" O/ T0 G5 |* q. p# Z      {
+ o, z$ g7 P1 J9 v/ ~' |        IEnumWbemClassObject *pEnumClassObject = NULL;
/ _) \- p2 o$ `. |3 x* J$ V$ B        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;0 \" c+ W: g% u" R* V* V1 S: b. G
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)- m5 b" b4 M. a# o* h
        {4 W7 ~. b3 B- W9 d0 N( p! @
          IWbemClassObject *pClassObject = NULL;
/ [% t* @) x: H) W* L' d) c, K3 o           ULONG uCount = 1, uReturned;' I+ v- G! X, I' M& h
          if(pEnumClassObject->Reset() == S_OK)
) K% ?" Y2 S& I- s0 x            {0 J3 e7 M: n$ C" @5 D& [/ k
             int iEnumIdx = 0;2 N5 j) F8 g' z; o6 |9 e3 w
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
. X3 g8 ^" x# [4 @1 ?               {) R' d( G. z0 S2 n
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");! E* c% p1 q$ j8 H5 D/ M0 }

) p8 ]6 X! x/ t8 G                 SAFEARRAY *pvNames = NULL;$ e; u: c9 R0 m; [- `
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
: \% I$ T& I, _                  {
; {) q% u: u( F7 t. t                    long vbl, vbu;2 S, \1 n6 D4 Q! B
                   SafeArrayGetLBound(pvNames, 1, &vbl);
6 C9 r+ F& o% X# O8 ?                    SafeArrayGetUBound(pvNames, 1, &vbu);' ?& l, {# T$ W- L! I
                   for(long idx=vbl; idx<=vbu; idx++)! j$ z  W" N/ e5 E
                    {- ?( b9 K, E; s, u. f
                      long aidx = idx;; B; E8 [( l" q  P/ ]) a. m8 l# k+ e
                      wchar_t *wsName = 0;
7 s. @2 G! k0 a                       VARIANT vValue;
) b0 e! s9 N/ p                       VariantInit(&vValue);
( I- R% `# N7 g, a. s                       SafeArrayGetElement(pvNames, &aidx, &wsName);0 Q8 W: |1 r% s) L, y

6 V' c* R1 G% W4 |5 q                       BSTR bs = SysAllocString(wsName);
% E) b% f9 P) I. n* W! h4 i                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);6 \! Y& h! \# ?, t7 M8 L
                      SysFreeString(bs);1 r& U  T! a) g: Y2 [

1 }" U" Y! j/ W1 z; D0 d5 C% ?4 K                       if(hRes == S_OK)
# n$ k, `. K. J$ L                        {0 M# ^3 C. W2 M, u
                         AnsiString s;
2 s9 k; l2 `; b  S                          Variant v = *(Variant*)&vValue;
& F$ X  X1 l% E) Q) I                          if(v.IsArray())" d( z: C! D2 X
                          {1 `9 O/ t& X' f9 D& r" e
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)& x9 p) t  |& V" g# V/ ^7 C4 Q
                             {5 g  ?4 n$ v4 r. S( ^; n
                               Variant a = v.GetElement(i);7 r# \2 w- \3 b! v' H/ }7 }
                               if(!s.IsEmpty())
; H) j! m+ D. M- O' p                                  s+=", ";! H* h" Q; _& {( q: ]
                               s+=VarToStr(a);) W$ y( L+ Y2 X' s  M3 }
                             }
" d+ d" M# P: j% T                           }* P' S; z, b5 p# ~6 B6 a1 f
                         else
' `- h9 D6 o7 `3 e  A( j# H8 l7 ^                           {  T; q, g7 p  Z
                            s = VarToStr(v);
5 B( V$ e; K0 T6 x) o( E                           }
( z0 u$ ]# Q1 n4 S# p5 m                          lpList->Add(AnsiString(wsName)+"="+s);
, }+ g. |4 J) O( O% P+ h. x                        }, M. ~& `5 }; ]# i* i: r

: M0 x- e3 A0 t/ b, B& A& }                       VariantClear(&vValue);
# [! ?+ w  v6 U: h. ~7 [" N! i                       SysFreeString(wsName);! G2 u8 C3 h1 L4 Y/ v2 h; [# K) \, D
                    }
# `, Z/ K  i( x5 x. q" ?/ n                  }
# Q( n3 K9 X& s2 k8 W! x8 F                 if(pvNames)SafeArrayDestroy(pvNames);
/ x6 ~4 X, F. B5 A5 |                 iEnumIdx++;# }, p& f/ z+ _0 d1 Y5 l: d
              }$ G2 [9 _6 g! v( S
           }: b! o2 t, ]( N5 i! Z8 M
          if(pClassObject)pClassObject->Release();" ?5 @( I+ ]/ i- s
        }
+ T  S* Y/ S( F" Q! L! b        if(pEnumClassObject)pEnumClassObject->Release();
4 G) N* }: ~5 y( ]' G  {      }) C8 o) y% Y% e
    if(pWbemServices)pWbemServices->Release();
+ m2 l7 ]$ q) i, V9 Q) h' C   }
% [$ K1 v. {, y- z. f  if(pWbemLocator)pWbemLocator->Release();1 [- w4 a* B- Z% V0 r9 U0 T& y
}/ [! \3 i, T0 f# F. p5 A1 x9 J
//---------------------------------------------------------------------------
' N; V8 x( Y6 F  [' d1 y3 L' @' |* ?3 ^6 t. v$ G+ }2 T
// 通过 WIN32_bios 获取 BIOS 信息:# N' f$ t+ U; g. L# U
void __fastcall TForm1::Button1Click(TObject *Sender)" z" w$ \; g: |4 w
{7 m' p" G' c. F4 L+ e1 T, s
   Memo1->Lines->Add("================== [WIN32_bios] =================");
1 Q& m! X& R" o2 h0 }9 E4 V! w3 o    GetWmiInfo(Memo1->Lines, "WIN32_bios");3 u5 L4 R' H5 B: [+ R8 J
   Memo1->Lines->Add("");
% a: }  a5 I: T1 X2 ?* ]}
2 C6 ?4 S. Z5 q. ^/ d8 z% H! \( I
--------------------------------------------------------------------------------
1 A: g3 f' w# r9 l# Y
7 N5 I- w; N% W3 }( Y5 u! i  ZWMI 可以访问的信息类型有:( e9 C7 r) a2 L! N5 {$ q/ b
  Win32_1394Controller% v' X5 f2 k. a
  Win32_BaseBoard
+ ^: s- p( X+ `   Win32_Battery
# ~# ~6 Z' x1 l   Win32_BIOS; X$ t5 C% S/ V5 H' z& \3 X
  Win32_Bus1 Z9 w9 G+ k, b
  Win32_CacheMemory4 v: }/ I  @* h- m" F5 Q
  Win32_CDROMDrive
# X* w% G8 m' W' h& p   Win32_CurrentProbe
1 N5 J* R; K2 M3 H   Win32_DesktopMonitor
/ Q( t# K8 N2 z/ E, S   Win32_DeviceMemoryAddress3 J  X9 E- N/ e/ K
  Win32_DiskDrive
% U/ k; o& N0 g+ r' |- N, Y   Win32_DisplayConfiguration. H* n& i" x. l2 n3 S( o" X  ]1 }
  Win32_DisplayControllerConfiguration
+ a1 F6 @  r$ Q7 e. F' W* k" c! ^   Win32_DMAChannel2 X: Y& N6 [* j5 m" \2 }
  Win32_Fan3 d$ H8 L% i9 a9 U. z
  Win32_FloppyController
% v' {: d8 u+ s' J8 A" e; D* z0 S   Win32_FloppyDrive, h& {& p3 Y2 s, @2 c$ e
  Win32_HeatPipe
" h9 a8 ^- {* H6 w  c4 v   Win32_IDEController- _( M0 p6 N/ w) k6 g% t3 v) q
  Win32_InfraredDevice: e" a/ i+ K! q3 C% B, ]2 Z3 ^
  Win32_IRQResource
% m) |  [6 W3 y! ]   Win32_Keyboard$ I) }' w8 I8 R3 j3 o" i% v7 I
  Win32_MemoryArray& Y) w: |' n! r: K2 ]; [/ l; K
  Win32_MemoryDevice, H2 p$ I. X0 K5 `% h% G* x* K9 X
  Win32_MotherboardDevice/ e  Z, J! q: y0 r
  Win32_NetworkAdapter
7 v! q+ L% V. D9 |$ y6 R' @   Win32_NetworkAdapterConfiguration
* x; l1 M( F9 H$ ?" V8 D   Win32_OnBoardDevice
  z  l1 g3 \/ ?7 |  P  x   Win32_ParallelPort' g! \  `# G# y' E+ a0 [
  Win32_PCMCIAController
+ h. O3 m; s! i' P   Win32_PhysicalMemory/ h' x0 x6 }( \: {1 S) k
  Win32_PhysicalMemoryArray
0 y; g4 T  u$ Y% B   Win32_PnPEntity/ r! [9 i8 i0 z
  Win32_PointingDevice
1 m0 I6 X" a  I) X/ s! T# T7 Y, C   Win32_PortableBattery0 f% z( K) L+ d
  Win32_PortConnector
( b+ Z& @8 I* {% B& V& D   Win32_PortResource/ i1 R" a3 O4 }; h  |9 ?  l
  Win32_POTSModem& ]6 k4 O* V& l) @
  Win32_PowerManagementEvent
  V4 @8 w" g$ F9 D7 a   Win32_Printer* T8 N8 \! y0 D7 T% E
  Win32_PrinterConfiguration: f. v5 t$ o& I* X" {+ f0 g0 D* b
  Win32_PrintJob, }+ }) h$ r: @% }
  Win32_Processor
- M/ r' m1 U+ ~7 v   Win32_Refrigeration4 I7 ?1 _- e& H: b& p5 {  S* B
  Win32_SerialPort
! T$ t; p& i8 ~   Win32_SerialPortConfiguration3 V: I1 t5 c/ N0 e8 L
  Win32_SMBIOSMemory
# T( u8 u) c# x- K/ M/ T( M7 \" x% L   Win32_SoundDevice5 E% J5 R6 G+ {! N# ~/ c4 L" [
  Win32_SystemEnclosure  p9 z; C4 f+ d- }
  Win32_SystemMemoryResource2 ?5 y& [$ t. L( |6 h( k& j2 d
  Win32_SystemSlot
) ?/ i" z2 U0 G% o   Win32_TapeDrive  Z% E: j; [+ k* \
  Win32_TemperatureProbe
: U0 o5 Z4 A8 {. K! @   Win32_UninterruptiblePowerSupply( W/ r5 Z8 T9 a  c8 R  g" L
  Win32_USBController
5 P3 j9 S  W) a4 U, s& c: a3 C   Win32_VideoConfiguration$ W# S' l" u: N+ i2 C; J  x
  Win32_VideoController
9 `1 \: k0 T% f. I% E   Win32_VoltageProbe
# @+ G  [" l) _- w
0 Y' i4 J. K' c3 Y; E以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-7 01:47 , Processed in 0.018217 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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