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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
+ r6 k, o' k2 m7 T" W! F  o% h
5 V4 ]% a: H4 d. C& F
3 R, X' u8 r+ _& w--------------------------------------------------------------------------------
. m# C( u" ~8 }1 WWMI: Windows Management Instrumentation (Windows 管理工具)8 z0 A* _, V% A* q% k  L
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 : Z% O% \1 }( }7 [" [" B8 c1 \
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。4 b/ i2 P9 K; B- W; k
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
. y9 v9 m' a" g4 u  N
5 E8 ]2 @# p& A. M4 h$ W! k--------------------------------------------------------------------------------1 ?- R4 g" V1 p* `9 g8 A" N) p
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面/ @2 x$ `" U- E3 [/ r; V9 z. b

8 |5 B# z* {% z9 S9 c" F/ a- w& j--------------------------------------------------------------------------------
$ g7 C2 H7 B3 E① 初始化 COM 接口:
0 o/ q2 [3 w# V% a8 c   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
; `+ p+ x  t+ G9 u' m$ P' g   这两个函数在 #include <comdef.h> 里面定义。* J2 ]9 m0 ]6 v

* E- @$ Z/ ?- W② 获取访问 WMI 权限:
. a# N3 y0 W$ F5 c8 E   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);" N8 |: H- b' ~# N, z3 e/ z. @( D
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。' W8 y3 y6 p  ~3 h: W
" w& n' K$ D! ~' u; p
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:& V$ d( ]  d9 j0 N
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。  u7 x5 g+ T0 h8 ]' F

4 p* W% }$ p6 ~, u$ j, Pvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
- V  J1 t5 R' L/ b1 r3 u{' D3 U6 n& a9 a
  IWbemLocator *pWbemLocator = NULL;
$ B2 |1 O# r1 j  N1 F+ v: K  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)4 \& P; _. s5 k
  {% e1 h1 @! w# j2 y" c4 k4 `
    IWbemServices *pWbemServices = NULL;% j  h& x, w7 l2 ~6 Y$ v
    WideString wsNamespace = (L"root\\cimv2");( r( K$ O  l  D: M
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
1 V8 j, j: ?7 C4 v* l' p      {3 T$ s8 a0 h3 }  a0 l
       IEnumWbemClassObject *pEnumClassObject = NULL;% E: p0 m, i1 W$ W$ p
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
* e/ `* D" _6 `6 C+ D        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)! v7 h( v! s- z; e$ @3 h$ G
        {1 Y8 P# h1 D; D/ C4 I7 b, Y
          IWbemClassObject *pClassObject = NULL;) a! g8 p9 B4 P' d
          ULONG uCount = 1, uReturned;" |! w' j+ `/ z4 z9 E- Q8 }1 d+ o- [/ m
          if(pEnumClassObject->Reset() == S_OK)* x+ }  a% _2 g4 ~
           {" E0 i% [& s- P) D
             int iEnumIdx = 0;' K2 i6 A* b. T3 k2 `
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
6 l4 J$ _$ b) o  B               {
+ E$ P, h! V7 i                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
7 V  H" Y( q+ `- g0 k% R  E! R
5 H/ N$ ^: l; b2 U, w# C                 SAFEARRAY *pvNames = NULL;- m: \, ?  t( g) H  h
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK): D( N0 C, @( B/ c' n" F# \: W
                 {
0 I8 ]4 I$ I" }9 S! Q                    long vbl, vbu;
2 H0 B6 e$ ?0 o! b5 b% c# T1 _                    SafeArrayGetLBound(pvNames, 1, &vbl);
* A" Y: }$ v1 X4 L% L) Z! }                    SafeArrayGetUBound(pvNames, 1, &vbu);
  L4 D) ~# \5 b2 S                    for(long idx=vbl; idx<=vbu; idx++)
- J6 I9 X  t9 `" I/ w  N                     {
9 B- R. [& b0 e5 z! [; @                       long aidx = idx;
2 ~% Q# L7 i* j  F6 a                       wchar_t *wsName = 0;
! v0 c9 m" d2 W8 M                       VARIANT vValue;
1 E* D  s" x8 K0 @2 L                       VariantInit(&vValue);0 E+ a6 q' X: }: U) r* V
                      SafeArrayGetElement(pvNames, &aidx, &wsName);5 X: t2 v, e: l0 N: K# m! L! X5 D- B
3 ?8 v' I! f5 P
                      BSTR bs = SysAllocString(wsName);
6 t/ H9 O4 A$ O# }; U                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
( w2 m0 [2 I1 W" T+ K  \                       SysFreeString(bs);
7 D, [! Z; ]; p
" t1 v! ^7 c8 i                       if(hRes == S_OK)* v! j$ V9 {2 n( `$ f2 R
                       {' p# Z/ R( d; C
                         AnsiString s;
6 g8 X( a& p# p" _' {                          Variant v = *(Variant*)&vValue;
7 z$ k: l) g8 W7 b+ Q0 T                          if(v.IsArray())
7 N* n9 ~* T* |1 ^/ y                           {
0 q% \0 E9 R! A$ e0 G                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)1 t  R6 O9 ?+ e: l) ]
                             {
5 ~' ^/ m8 H& [; x( k5 w. M: K                                Variant a = v.GetElement(i);5 j- N8 r! ]8 r$ M3 }7 M# D
                               if(!s.IsEmpty())0 c0 G# C' m" Y3 M
                                 s+=", ";
* \& p5 e7 ^) y3 ~$ ?1 w                                s+=VarToStr(a);& O  W2 L$ @& F! X) B. C
                             }
* a6 S. w# I, y# G7 ]: U                           }4 b) g, C0 f* l6 d, }( _
                         else
( Y/ Y9 {- `2 d. ^) P                           {
1 F+ y3 O+ l1 m% K7 W2 s                             s = VarToStr(v);0 C! Z, D, }9 ^# @' U
                          }
; o2 f# p- c) _3 w) P  y                          lpList->Add(AnsiString(wsName)+"="+s);
5 b9 x* z& w/ [                        }/ d! g  l  d% e9 [  ?0 m1 b

3 g- ~2 C* @$ z& E* x& J, }: X8 Q9 Y                       VariantClear(&vValue);
' \) B7 K* u7 P7 J" R  P                       SysFreeString(wsName);* B1 V  H6 y( @" U$ X
                    }/ ]9 z: q7 W; C
                 }' Z  ^% i& b3 f" U/ F; ]
                if(pvNames)SafeArrayDestroy(pvNames);
7 k' Y2 t0 o  N7 F6 Q4 b                 iEnumIdx++;
3 A4 G6 w& G; H! \               }
/ f5 f0 r$ V' B            }7 P, V$ C& f+ C' x$ V% t
          if(pClassObject)pClassObject->Release();: A1 y- j6 f' `5 C) S4 C& a
        }
, p8 S# u2 T7 V2 O* f        if(pEnumClassObject)pEnumClassObject->Release();
+ j) X0 m5 Z! I+ E- E) ?' i      }; u; U/ C$ I" P4 d3 W/ M( V& [4 Q. Z
    if(pWbemServices)pWbemServices->Release();3 D+ W: e4 M  [3 t, ~
  }
9 s& E1 t% ~7 c- ]: C. e5 |  if(pWbemLocator)pWbemLocator->Release();0 }6 x7 x3 i3 P+ j5 [( A
}3 p) @) X# P( c( Y
//---------------------------------------------------------------------------# E$ T6 f/ B2 E
* T4 O/ p$ V6 }1 \4 @9 X( R
// 通过 WIN32_bios 获取 BIOS 信息:! u3 G7 C" g2 B
void __fastcall TForm1::Button1Click(TObject *Sender)
& o) z; G. l% F$ `: ~{
9 x4 i% i' j4 K; T  i& A  Q; q* y) I8 [    Memo1->Lines->Add("================== [WIN32_bios] =================");8 d' C6 S' ^& D. K+ B  {, n
   GetWmiInfo(Memo1->Lines, "WIN32_bios");% N$ n/ l/ M! y2 O
   Memo1->Lines->Add("");
/ o) ^# \) r0 C8 j! _: d+ i}
- C' @# a* w, d5 f
( h! j5 P5 e9 l/ ]2 x/ C9 X--------------------------------------------------------------------------------
8 M/ D  D0 ?" w7 e3 ~. ?  A" o
" ~6 \) Q3 l- D9 a/ \WMI 可以访问的信息类型有:
! g! n' Y" k$ o9 E5 Z   Win32_1394Controller% D& \- {/ c, E- k
  Win32_BaseBoard0 d8 X# F$ b1 J
  Win32_Battery
0 ^6 ]' W0 K& P% z/ s  U4 r' x   Win32_BIOS9 Q0 N5 D& ~6 R1 B7 d' u' z
  Win32_Bus
' Q' a" t( o* Y+ J   Win32_CacheMemory
# G" `5 T+ B2 U% n- H   Win32_CDROMDrive4 Q4 f6 u$ X5 e8 {7 x# J
  Win32_CurrentProbe$ O3 j7 U: V3 a' b# u9 {- l9 x2 O
  Win32_DesktopMonitor1 s' t/ C% P# ~; ]8 P& Q* c
  Win32_DeviceMemoryAddress6 L# y$ q& p3 j7 L8 a$ r
  Win32_DiskDrive
+ o$ l7 V9 Y+ n9 P5 ~/ u( ?% B% u   Win32_DisplayConfiguration
6 i. ?! E" Q2 R) B1 P: R& F+ T2 A   Win32_DisplayControllerConfiguration
4 k/ Y6 r0 @% p3 o7 w   Win32_DMAChannel
9 {' c0 G) n4 W' H1 c   Win32_Fan
* P- H' K$ ~5 j- a* r" u   Win32_FloppyController
5 y  X, W8 |% x8 U4 B' B   Win32_FloppyDrive
% n0 {# G# y6 {( R3 m   Win32_HeatPipe$ l& E5 U+ k' o* Z
  Win32_IDEController
/ a. [! \. C7 r1 O; Q- b- ]   Win32_InfraredDevice
, v1 U& q2 N, @0 V   Win32_IRQResource; j" A1 I7 g6 a6 R  D* b
  Win32_Keyboard
3 a! n# Y8 \; Q: `2 E. V   Win32_MemoryArray
# ?+ K' r% Q! ~; n   Win32_MemoryDevice
8 Q0 g  U% ^! L6 J+ }' M3 \   Win32_MotherboardDevice
! W5 @2 [: M( l! G* F7 \9 y   Win32_NetworkAdapter7 d2 ]4 O: o6 B2 K% u. }1 u  r
  Win32_NetworkAdapterConfiguration
) B" h) @  x  }& Y5 D( ~* d" S% F   Win32_OnBoardDevice
% `* u4 c( l3 z7 |; ?4 u   Win32_ParallelPort- z( `1 K  t7 e! A- B' ?$ c
  Win32_PCMCIAController
. L" S+ L) l, ?. v2 L1 ?   Win32_PhysicalMemory; _/ J) J9 @! X" m
  Win32_PhysicalMemoryArray
, R% @: W! ?4 B   Win32_PnPEntity
6 }6 _: C  [0 f$ }% q. q: v. Q: |   Win32_PointingDevice) V6 m3 U' R: |1 U4 a$ b8 @2 }+ R
  Win32_PortableBattery7 Z  H& z$ _- d$ V3 T
  Win32_PortConnector
# [( k+ s, }3 k5 m. L8 ~   Win32_PortResource' o( y/ @* l6 R2 \" _2 p
  Win32_POTSModem: h" }: ^* H: J4 g2 e  _2 h
  Win32_PowerManagementEvent
! ^5 k. S! W; v   Win32_Printer. J( A, ~, x, q/ R) u
  Win32_PrinterConfiguration1 r6 u0 t& F8 k% U$ P
  Win32_PrintJob; v3 x. |# n5 F
  Win32_Processor- M, k% a( A( l/ f/ W& Z8 \
  Win32_Refrigeration  S! n. m; C  L1 V9 w" |/ I, z
  Win32_SerialPort; ^, \* F  }. V0 F7 F' L. W
  Win32_SerialPortConfiguration+ b8 a  Q0 T) y; w
  Win32_SMBIOSMemory
- H/ d  O1 J/ G! A/ p& x& _9 B1 N   Win32_SoundDevice
4 j+ [) m  h. s7 {9 V9 c9 V   Win32_SystemEnclosure( p2 G- n. q2 z; s  r
  Win32_SystemMemoryResource
0 l( ^; r: t8 H2 S+ d/ [6 Y   Win32_SystemSlot, x' ]: r: Z  C# B# @# m3 s6 `% y) G
  Win32_TapeDrive
7 J* I7 i1 Q5 |  n   Win32_TemperatureProbe
: ]+ _. \4 p( R2 h   Win32_UninterruptiblePowerSupply: p0 j( S$ c5 f
  Win32_USBController
4 n7 Z" N& ~! m0 M6 }& ?   Win32_VideoConfiguration
8 A; [2 }9 P% y) L- f& ^   Win32_VideoController8 u$ S' R9 V5 ?' X: S
  Win32_VoltageProbe
2 c( Z: y2 K1 w3 L- R* o+ N: I% D1 H
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-21 18:00 , Processed in 0.019522 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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