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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
* Z2 F# L/ t" |( P3 Y. o& ~5 a/ r6 w* U" ?0 d2 ~' }! w

8 A. }! r- O6 J+ I) P9 \--------------------------------------------------------------------------------1 [' Q4 K, E8 B7 \. g: `' a9 D
WMI: Windows Management Instrumentation (Windows 管理工具)
* l1 f; O, P8 @2 J   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
' P/ G4 o$ Z# i" y   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
' m. e" b' |, f$ p, H8 D. T8 O   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 $ n# [, w, ]/ |6 H; D' E" |

0 M" \; I' W2 P  p2 B--------------------------------------------------------------------------------" B' o1 T' O( V% q8 o4 r
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面& A$ I) W7 H5 m% t4 N3 w3 U
4 V% |* S& N9 m5 Z: I
--------------------------------------------------------------------------------
6 j) Z! v' b/ z% `① 初始化 COM 接口:
3 i! [) m# i, v1 }, _8 I   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。; w/ Q- R+ g1 D% a* j
  这两个函数在 #include <comdef.h> 里面定义。
2 g5 Z" @* ~+ _( t7 P" \4 y+ i
1 A8 K3 p: Z/ Y2 y! V( A6 ^( H② 获取访问 WMI 权限:2 j$ P" i$ b& [2 D
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);+ w  u4 t+ @& M1 ~) j" A
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
0 s4 }6 ^- J* z" c$ i) A1 Z; z/ L+ w/ u$ k
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
% k' S! ^" Z! S9 f% [   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
0 \$ s4 U6 U* B8 f' X. ^3 K
% F8 w6 ^: X. N& ]/ H8 |void GetWmiInfo(TStrings *lpList, WideString wsClass)4 @5 x- \+ c! ]1 c/ x
{
" P# J7 s% U, Q- }$ N: h) n6 b* y  IWbemLocator *pWbemLocator = NULL;( y) ?/ H9 t" K
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)  c7 a; u# }: {0 |" f& k% V
  {/ |6 C" w5 j' h, b
    IWbemServices *pWbemServices = NULL;  n; T: Z' E! {' y$ d- Z
    WideString wsNamespace = (L"root\\cimv2");$ f: v5 L4 b0 Z7 c7 s7 X6 G
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)% ~! m7 x/ }2 P' Z& W! m% m
     {9 Z. b  {: J3 H7 i, B% o( Q
       IEnumWbemClassObject *pEnumClassObject = NULL;
1 P5 s3 T* I8 N0 n  @' e3 I5 ~        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
& C0 u) Y* l0 @  O        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)2 h: d# T8 Z- Q% K6 A7 x
        {
' p0 k9 m- i+ A0 Q  D           IWbemClassObject *pClassObject = NULL;
+ [3 ?; m* x4 a6 A           ULONG uCount = 1, uReturned;
5 o$ t5 V2 I9 m           if(pEnumClassObject->Reset() == S_OK)
( P- h$ j# n* n9 N1 B8 `6 y! T            {: X- Y# I8 O% u* }
             int iEnumIdx = 0;8 A0 ]: k5 m# ^9 k, E
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)6 I4 B+ p$ G. q, h, k  X
              {" ^: i& l3 E# `! y6 x; J1 b
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
5 C; i+ O4 K: t7 C& p4 F6 J* U) ]  I* f' y2 g) t
                SAFEARRAY *pvNames = NULL;" m1 Z; Q6 j  a" [9 V0 l3 M
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)  M8 Y4 v$ H; Z4 F1 E
                 {# D# r/ b0 W- k  k
                   long vbl, vbu;
, _$ @; ?1 e5 K* `0 _                    SafeArrayGetLBound(pvNames, 1, &vbl);
2 V, u& v9 y0 _( W, K+ G) h                    SafeArrayGetUBound(pvNames, 1, &vbu);# h' m7 m  K1 v
                   for(long idx=vbl; idx<=vbu; idx++)" M* n9 ?2 o) Z9 ]; y3 [
                    {& ?6 p% T% m  h0 w* p; j+ W( r( y! m
                      long aidx = idx;
8 D5 o. F7 G6 |/ K; b, K0 O/ e                       wchar_t *wsName = 0;- I1 u" V( e/ j9 q, D  n7 ^9 \, {
                      VARIANT vValue;  Z8 v7 R& T: H6 \" A- \3 P+ d
                      VariantInit(&vValue);
- h/ E+ x& [1 f# L9 h: D9 u. `                       SafeArrayGetElement(pvNames, &aidx, &wsName);
/ M+ J% D7 S! Y
- k* g4 U( ?) I8 \; f4 K1 T                       BSTR bs = SysAllocString(wsName);! j, Q1 R. S& |9 m8 h" n3 u0 ?
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
2 j0 c) y8 `# l; B( _0 E                       SysFreeString(bs);2 T4 Y4 Y# O' ], K7 t

2 @3 p( Q. `) ^& g  a0 R# @                       if(hRes == S_OK)
+ x5 G# G; N+ K, o- ?                        {3 x( p! f3 _! D# W1 E1 k3 J
                         AnsiString s;
) l2 L! F9 p* |2 S                          Variant v = *(Variant*)&vValue;/ @6 D. W) d, W4 b1 S7 T; g
                         if(v.IsArray())
7 A1 A* M8 D- V) Y% W$ f2 q4 h                           {
2 X: n, h0 k* K9 i7 o# G9 H5 u                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)+ }9 p4 p7 B( {; }8 @1 x, m7 H/ }
                             {9 Y" s9 Y# }# k7 @4 C0 t+ m6 O
                               Variant a = v.GetElement(i);
) u+ v3 ~% O' E" K# a3 H                                if(!s.IsEmpty()); `0 w" V0 t" s3 T, c3 @' Y
                                 s+=", ";
7 e( n+ b+ ~9 O6 m0 T& o9 W" E                                s+=VarToStr(a);
5 J! C: b" d! _: _                              }
( p7 t2 v+ B' k! N8 u# U                           }
# Y% ^7 J  n6 W( p* |                          else! h6 r8 G4 x2 d* x! s5 G- B( V" Y
                          {
, v* m. Z+ ?4 I( _9 Y" ]2 t                             s = VarToStr(v);
8 V1 R4 ]. Y8 N( {7 ^                           }
7 [6 r8 Z9 z2 I6 x' z5 c$ Y                          lpList->Add(AnsiString(wsName)+"="+s);9 z8 \: l3 ^; D. e0 e" T
                       }/ T5 h5 Y' q7 q# F+ P

. X2 \  l$ m9 F( A                       VariantClear(&vValue);
- _) y2 u6 {3 g  S8 U                       SysFreeString(wsName);
+ ^9 N6 \9 s& K# ^8 R& e: q* k: X                     }
% z8 \5 g" F* H2 h  p                  }
& A1 F& j# O3 H- j                 if(pvNames)SafeArrayDestroy(pvNames);  M/ ~2 \9 K; O8 _& Y
                iEnumIdx++;
7 W" F( d1 U9 l( Y; s               }
3 W! i* i- V* \1 B6 o9 d2 N! p            }
/ x6 W( p$ B4 ]1 J: f: l           if(pClassObject)pClassObject->Release();
. a3 l* @0 S( s: n) T: B         }
7 `( ~" o& F! B& X% o4 Z, @        if(pEnumClassObject)pEnumClassObject->Release();
! {4 ~. `- v4 a* v! j4 {2 `      }
+ U3 C$ C2 o% r3 T  Q     if(pWbemServices)pWbemServices->Release();
5 B/ W/ Z1 |$ B% Z! G* E( S   }
" ~' B. S0 Z' b) n  if(pWbemLocator)pWbemLocator->Release();
: l* W! Z4 G4 e' Y% a2 z+ Q5 |  V}
, }6 V; D6 `! o4 S' w//---------------------------------------------------------------------------4 ^8 t5 `) a5 e

* Y. V3 x+ e& G: L5 S9 f; \// 通过 WIN32_bios 获取 BIOS 信息:
! ^4 d0 {. _4 C, avoid __fastcall TForm1::Button1Click(TObject *Sender)1 ^' X+ o- v" M8 Z7 U/ v, b, C
{5 L  W7 d9 x) X8 t9 @4 V' w
   Memo1->Lines->Add("================== [WIN32_bios] =================");
& G  d( [( m! n  c    GetWmiInfo(Memo1->Lines, "WIN32_bios");
* M% t& E  a2 G" J    Memo1->Lines->Add("");
& z7 j- `9 v, |}
* T6 |) b& K$ l. L7 V) w8 a- Z( V; H& d. _
--------------------------------------------------------------------------------
1 g# F" Y7 i$ P% ^" T7 q" |6 ?; h
WMI 可以访问的信息类型有:
! l0 `" c$ k/ u3 V5 J. d6 h+ |   Win32_1394Controller# B+ e# I# W; r
  Win32_BaseBoard
; g3 h" R- M! v. q; P0 u   Win32_Battery
& A1 ~* _6 b2 i+ i) [- s   Win32_BIOS
- v) t: n# l* b. Q* J* h3 ]   Win32_Bus
$ \/ s7 l4 Y% [   Win32_CacheMemory
5 I* f7 X0 u. N9 R; Z+ V% S9 ]   Win32_CDROMDrive
2 o# y, ?% w  ?" C! r3 J& b   Win32_CurrentProbe' H$ v) [8 P$ E% k
  Win32_DesktopMonitor2 E- A5 u; s- f2 l9 \# p7 g
  Win32_DeviceMemoryAddress. Y# s/ E% r% v4 {* X7 ]
  Win32_DiskDrive9 m: }0 ~/ G7 X. O, d3 H3 r- c  E
  Win32_DisplayConfiguration
! i% ]" o7 M( N+ }' b4 a   Win32_DisplayControllerConfiguration
8 `. `5 x7 ]/ H. {, u  ~4 p   Win32_DMAChannel
9 L0 b* o: H2 c0 P   Win32_Fan
% g0 e) O, p6 A. b   Win32_FloppyController% s$ Y6 |( Q/ G: L. C/ j+ N
  Win32_FloppyDrive
, x1 Q$ B( ^& r$ \   Win32_HeatPipe
1 {6 E* r# h! v5 j( J   Win32_IDEController
+ U! P$ P8 z; _4 c   Win32_InfraredDevice
9 g  y1 |( O4 Z7 H* U  `4 k7 v( H   Win32_IRQResource# S( \3 w" I' o: u3 z  f5 y, d- _
  Win32_Keyboard
& ^) w; P% t  K! g0 `   Win32_MemoryArray0 _8 k5 G9 j& v" m- }
  Win32_MemoryDevice
2 y" Z& Y: H. E/ C/ H: Y5 i   Win32_MotherboardDevice
# n; l" U+ Z. {% s7 [   Win32_NetworkAdapter
# @7 o  S7 ^; \6 M  G% b& s. h: r   Win32_NetworkAdapterConfiguration" A) ^  l2 I7 V, a! T& z( I1 @
  Win32_OnBoardDevice) a- O% R/ Z. M" \
  Win32_ParallelPort2 f. o! `4 |0 z" z* }% l
  Win32_PCMCIAController
0 l/ J; S8 S4 ~! q* t   Win32_PhysicalMemory) y$ E$ M. y7 r  C, }' W
  Win32_PhysicalMemoryArray' R+ e) B* l0 T
  Win32_PnPEntity( ]+ X6 J) m1 Y: X- g" N
  Win32_PointingDevice
  e: V. y9 n0 o2 \) f   Win32_PortableBattery. a( Q# T* t. ~0 X; w0 C
  Win32_PortConnector& V* s1 J9 F8 W- D4 p
  Win32_PortResource5 Q9 k* s! E) J9 G  ]5 N6 X
  Win32_POTSModem
' ?, J+ Q: ?5 y   Win32_PowerManagementEvent
3 n. P& J0 J7 a5 h. j' x2 L; r   Win32_Printer( o1 ~7 e2 |# B1 p
  Win32_PrinterConfiguration
1 e0 K/ B) z' y3 N; j3 r5 h   Win32_PrintJob
% g% r6 g' r, l5 F3 c   Win32_Processor
) J& B9 a7 l; v7 A  V! [   Win32_Refrigeration; t4 Y9 M+ O+ y) M8 l% s( P
  Win32_SerialPort0 M" G, ]3 `* t- u8 o. a' T
  Win32_SerialPortConfiguration1 g( I; U* y1 A) _6 Q
  Win32_SMBIOSMemory
3 R6 B3 m! |& }: a: G- }; G   Win32_SoundDevice
  A! a' I. R8 H/ a4 S2 d+ X$ ]   Win32_SystemEnclosure" A) C1 J3 O6 T* c: s  p0 v0 w4 ?
  Win32_SystemMemoryResource; w! Q4 H# o$ b! V/ }
  Win32_SystemSlot
% i% f2 y+ q3 ^* g$ t; Y   Win32_TapeDrive! x# d4 F% t. }- K- L4 ^$ j& Q" E+ \
  Win32_TemperatureProbe3 C7 l! I: h9 G; A9 e
  Win32_UninterruptiblePowerSupply& Y! ]7 \/ v' r$ y: F7 B
  Win32_USBController+ h- g# v6 T* `- s5 p
  Win32_VideoConfiguration
  e! E) W9 N) f: z9 v. c7 R$ X/ q' h   Win32_VideoController  h+ l: _) \+ t2 c. ?
  Win32_VoltageProbe% `  t. u5 w2 }, A

- {# o0 U& c1 N  x以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:50 , Processed in 0.024727 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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