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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)' R# a; B& o! j( x' _

# V) `3 O3 q8 d) A  f+ F& r$ `( V) M  _/ R% f
--------------------------------------------------------------------------------
* ?5 `9 \1 m1 F8 [3 [WMI: Windows Management Instrumentation (Windows 管理工具)8 G3 \# @5 j% J8 f1 w
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
6 e* R6 q. H6 O   利用这个工具可以管理本地或客户端系统中几乎所有的信息。/ C* x: j. D1 v3 i7 J
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
4 j" Y+ C9 ]* h( Z; k& ?% o
9 E- W/ l0 @  _. j6 n--------------------------------------------------------------------------------
7 a( }- e! e5 k7 ]/ mBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面& B, ?$ w/ k  d; z- P6 V5 c

7 ?- z! x- U$ E' E--------------------------------------------------------------------------------6 g+ R( H5 r7 s" T
① 初始化 COM 接口:
* W; B/ o8 N% H, f   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。7 G6 g+ u! [5 F
  这两个函数在 #include <comdef.h> 里面定义。3 K$ }3 u" e" |" b9 K" ^
+ e# u% g' a/ J$ I
② 获取访问 WMI 权限:
8 U" J  y& v( Y! ^   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
2 a: q% ~- _5 G+ L' R3 ^$ f. B/ p   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
  D9 w+ [0 l2 Y- P; ?. R' y. j  @
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:; z4 m- Z6 ^- O  o
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。4 {2 X; D3 |3 z

$ s: q0 S0 n% N, a2 Fvoid GetWmiInfo(TStrings *lpList, WideString wsClass)# A- y# x  |' c- c9 z  H3 x0 A
{
! V1 ?; A9 n$ |* C& ?) U! M5 m  IWbemLocator *pWbemLocator = NULL;
. i6 g; F& ~! j) d' Z  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK): m4 g* c/ o; i& l
  {. i) E# }6 G4 ^$ `% z; f2 J% K
    IWbemServices *pWbemServices = NULL;
0 Q$ O$ _6 i4 j7 K, C4 X; R9 t     WideString wsNamespace = (L"root\\cimv2");
* H% v% \8 }, q3 k     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
4 m( L, |8 [8 d6 K; h& K% W      {6 k) n6 y2 W3 T" G
       IEnumWbemClassObject *pEnumClassObject = NULL;
6 W+ |' U0 O( g        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;( P0 G8 x7 g" q3 `& R! F4 R/ Q
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
# P9 o" W8 \- t& B' w         {0 P! F1 b/ O. \4 m- U* ~; o
          IWbemClassObject *pClassObject = NULL;8 ~7 h, ^2 Q2 k& `
          ULONG uCount = 1, uReturned;
( m! e8 J2 a6 n, l1 S           if(pEnumClassObject->Reset() == S_OK)
' H6 e. q# Y3 W6 ]. V; w" ]            {
8 X6 a9 h" G* C4 u! N  c              int iEnumIdx = 0;
* ~1 `. g+ S1 G/ R) ], I# `: p5 n              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)0 |6 R9 J& F$ ]: U
              {
3 o) z% }3 V% o2 e% v3 C! q2 ~% U                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");% C- x& e8 j4 p) X

" w  \) F  F6 R                 SAFEARRAY *pvNames = NULL;% R  Y6 E  H+ M' }
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
2 e8 ~4 D; h- }% M# ^. J                  {9 j! e- r, P& y9 m; @
                   long vbl, vbu;+ ^  {: i8 t% k: ~  F' c" j* d
                   SafeArrayGetLBound(pvNames, 1, &vbl);
& z# w# I; x5 Y5 W& U' n                    SafeArrayGetUBound(pvNames, 1, &vbu);1 ^  f8 o! N8 ?1 Y/ A1 w( s; x
                   for(long idx=vbl; idx<=vbu; idx++)
9 f5 ]! ~: p  c* o5 I) W3 L                     {! l1 _* P8 F, k2 Y' D( M
                      long aidx = idx;
5 I2 D8 i4 P: o8 F# |                       wchar_t *wsName = 0;6 i  Z7 _6 m, K0 a: c
                      VARIANT vValue;3 N$ z1 Q* v3 v! ]- A, q
                      VariantInit(&vValue);
0 b/ E& k: Q! w7 x5 f& l                       SafeArrayGetElement(pvNames, &aidx, &wsName);
8 S1 \. P% G! n& X5 c! M) X: |$ F( F4 M9 U0 f
                      BSTR bs = SysAllocString(wsName);- P; n% g7 q6 |" ]
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
' m' {# u! Z& h                       SysFreeString(bs);% C1 c  Z% }6 {* v; ^
  h2 D" N/ t/ @9 f3 ?# n& J: x3 T
                      if(hRes == S_OK)1 W1 d* S5 J; G: C- x% `3 k
                       {$ F) J/ W2 ^/ e
                         AnsiString s;' d) F, p) |* x+ T7 W- A+ b$ ?
                         Variant v = *(Variant*)&vValue;
% p1 B, R, ?: R5 U4 d                          if(v.IsArray())
' B6 Z4 d6 n' x* e3 w% c                           {
4 o  |5 K+ N6 I- }' G3 h3 I                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)% q9 }. ]. i: l* b4 R
                             {
6 f# O+ Y1 _8 U$ t( ?, n                                Variant a = v.GetElement(i);) C1 g1 S# u6 S
                               if(!s.IsEmpty())
% L" f% A4 F: [4 u2 e% P2 g; T                                  s+=", ";! Y! }& o( e: {3 ?
                               s+=VarToStr(a);/ k1 D* U% u1 ]/ R$ e% R- l: r, B
                             }4 a" W  d) N8 p: w
                          }. s! c9 e) B3 S" `: t0 U* y  z0 \
                         else9 S) R! t' J5 e$ P( k
                          {
( G. v. Q: P( q. @1 e4 ^: V                             s = VarToStr(v);: N( ]% _/ k0 V3 M  j* r4 T
                          }) D7 G( i7 J* M" c6 U
                         lpList->Add(AnsiString(wsName)+"="+s);
' D) C, a' Q. i" ?, g1 m) d/ m& Z                        }
  I8 u/ x& F5 H, Z# u( R2 p
5 c- s" F7 q9 J, r                       VariantClear(&vValue);( f1 I4 c0 Z4 P" H* ~2 j) w
                      SysFreeString(wsName);
- Q2 K* p5 V9 [6 Z9 B0 r                     }2 |' ~7 L0 }! x# x9 r& Z# v
                 }
0 H. {# d( o) v8 a4 N) z3 S                 if(pvNames)SafeArrayDestroy(pvNames);& `# O) @; e1 O5 o
                iEnumIdx++;" {- h, [+ N; Y7 m
              }
/ A# h( k8 f  b( }7 L! s6 l- l# u            }
- o. C& ]8 n9 d% u% ~( _           if(pClassObject)pClassObject->Release();) q0 u  }2 M( B$ S% t0 t# W
        }: O6 H( E' Y1 B! `  [, v
       if(pEnumClassObject)pEnumClassObject->Release();
7 B2 S& x& [$ }3 q& f      }) G  @( v9 E  I/ W
    if(pWbemServices)pWbemServices->Release();% W# p4 {2 U" l1 Y
  }  w' K  N3 ^% v- ]1 {) l8 X
  if(pWbemLocator)pWbemLocator->Release();
$ m4 J' s$ i: f}
! M+ V7 |. p; l9 Y$ g% r% a//---------------------------------------------------------------------------$ S/ \! A5 `/ N" a4 B

  I4 o* {9 _3 h1 H1 |9 N# d2 M// 通过 WIN32_bios 获取 BIOS 信息:* K9 H+ R2 P( ^
void __fastcall TForm1::Button1Click(TObject *Sender)0 n" K! b2 m3 \- N/ J1 V; w& n
{$ E9 f2 D/ i0 V- C
   Memo1->Lines->Add("================== [WIN32_bios] =================");
' e/ Q% o) x3 H: l, a0 Z    GetWmiInfo(Memo1->Lines, "WIN32_bios");
/ B% }+ b" |9 z' `2 v    Memo1->Lines->Add("");& }# u1 [+ ~4 V. g" T) B% D
}7 e- Y; J  H+ G5 R2 o
6 w: o( S& p  H3 {
--------------------------------------------------------------------------------
7 {  h( D+ g7 o# d- g: n; P* o8 j- m6 _+ v" x8 b
WMI 可以访问的信息类型有:
4 |6 @; T+ _( h) N0 b& j4 }, Q   Win32_1394Controller+ k; i2 Y( M$ D) Q* v  _7 M- I3 V
  Win32_BaseBoard
' w- C( f8 m3 ?) S$ r2 E. {9 ]   Win32_Battery
* B+ @) }: C" B% i( p1 L3 j   Win32_BIOS* f4 n  l7 X- t" o5 R1 M
  Win32_Bus1 E9 S' z! ~+ c7 l- }; o  N7 d
  Win32_CacheMemory
# ]4 j0 D* `6 u7 D; Z% W   Win32_CDROMDrive; j. ]- p9 ^# w6 |# J+ @
  Win32_CurrentProbe
! W) k: e) L' c$ o0 T   Win32_DesktopMonitor, e+ e1 \$ C/ t( y4 y7 [' p
  Win32_DeviceMemoryAddress8 Y1 }5 k& |, M: i9 B
  Win32_DiskDrive
* f6 N* b5 f& Y* B0 H   Win32_DisplayConfiguration
& Y7 u2 D  @% Q0 S5 f   Win32_DisplayControllerConfiguration: H, z( V" u0 {6 ?( ^
  Win32_DMAChannel
* ^$ K. Z( _4 z' m+ S   Win32_Fan# x# W- G5 R' b, _3 s6 G
  Win32_FloppyController
1 Z" _8 A% L1 [   Win32_FloppyDrive
' r" r, i! r, e0 Q/ e   Win32_HeatPipe2 G' ~- z; W! @  l9 y) V, e
  Win32_IDEController
' a+ C/ q- B) v1 C   Win32_InfraredDevice: B& T# Z6 i" q
  Win32_IRQResource! U- F1 K& z, {. z' q$ j
  Win32_Keyboard
! M& P- c  ~7 z, t9 M) K/ {" l/ g   Win32_MemoryArray
3 s0 P5 D2 r* g# J: \0 l  ^1 I  _! @   Win32_MemoryDevice2 @2 k$ x/ S& `
  Win32_MotherboardDevice) {) C; ^  W: s$ a! v
  Win32_NetworkAdapter
8 v. Y1 E, y2 C2 `( e1 F   Win32_NetworkAdapterConfiguration
1 e! m/ C. o7 Z: p   Win32_OnBoardDevice+ B1 G3 T: g4 {2 d# v
  Win32_ParallelPort
$ d  }; [) O' u% r" V   Win32_PCMCIAController
  C8 @+ k4 b1 S! Q# F# a0 g: D: q   Win32_PhysicalMemory  G5 Y" j. [' S% \) f7 k
  Win32_PhysicalMemoryArray8 C% q) R7 G0 j; x) k
  Win32_PnPEntity
: Y# T. E; v& G5 o/ h! w3 I   Win32_PointingDevice; ]% ^2 i  B* o2 F! F# ~/ D
  Win32_PortableBattery
8 M+ u# \$ W2 P   Win32_PortConnector) j6 m$ v/ Z% B. k
  Win32_PortResource
3 \+ J& F7 O- Z' D& L- T: V   Win32_POTSModem
0 z8 ^, j5 \& G   Win32_PowerManagementEvent
" r; L2 A0 A9 L( o7 U( q. a   Win32_Printer; f* j6 s4 {  \! g
  Win32_PrinterConfiguration
: \/ a$ N" h7 V, z   Win32_PrintJob
- f- W0 b9 @2 x9 ?6 x   Win32_Processor3 |* Y( i1 v! U$ g- z+ f
  Win32_Refrigeration
; M* k7 u: ^3 v' B% |; ^   Win32_SerialPort
& I" r. x; W" M" Y6 t   Win32_SerialPortConfiguration; k; h4 A$ T! O3 U9 Q  s
  Win32_SMBIOSMemory7 x4 A# M- r( {, O5 M" R; T  V
  Win32_SoundDevice! H) [# M+ M( q3 m/ `
  Win32_SystemEnclosure
8 R+ G3 d8 d  W! q8 n0 F   Win32_SystemMemoryResource3 M, h5 a8 d, q+ {
  Win32_SystemSlot0 y- X9 E! }  J8 q7 u8 J! k# d
  Win32_TapeDrive# r+ I4 c; W$ C0 I: R" ]- C% X
  Win32_TemperatureProbe0 F" }( P* J0 k. v& @
  Win32_UninterruptiblePowerSupply
) R2 F1 f- O3 N! b1 N   Win32_USBController$ d; N/ E' j) T' t
  Win32_VideoConfiguration% C8 ~. |6 ]/ [; z1 Q% l8 T: |) s
  Win32_VideoController+ K. e7 m, E% P
  Win32_VoltageProbe8 v$ J8 [* S/ B& C0 d, r7 C
% f4 h: ?$ n# |* w7 v4 ~' ~# G; X
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-17 17:44 , Processed in 0.020844 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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