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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
8 ^7 c- V1 o7 i3 i- l8 k
2 ?- X8 g7 l) w8 f$ v7 f& H; L7 X8 |
--------------------------------------------------------------------------------
2 s+ S% D; [7 d, qWMI: Windows Management Instrumentation (Windows 管理工具)
) [0 n$ u3 V" _* i; ?; j   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 3 ]3 ]/ Q2 }! `0 g% x* x& P0 l
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
3 a# R. F6 K- t3 \6 O, \   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
+ U% T/ H) h- `4 u7 a) ]' H
6 G( _7 r" ]8 P# f% i--------------------------------------------------------------------------------
8 i) a4 p9 v; IBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
$ t' H$ v# r* i+ Y6 Y0 ]( }% Q: i1 S' h$ F3 z" v; ~; K5 g9 n4 v
--------------------------------------------------------------------------------
' L; i7 [9 ?, q% h4 y0 O① 初始化 COM 接口:
) G) s+ G' l' T" `+ W   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。# V. Q- o  K3 T* c
  这两个函数在 #include <comdef.h> 里面定义。3 A, F8 c1 ?  d  B9 \

( h2 y/ S0 K/ q' h  Q% N' t$ ~5 @# o3 C② 获取访问 WMI 权限:. D- S* y8 w7 e2 c  C
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);; r" R$ }7 v$ b8 a7 i
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。+ A5 z! C! C' G3 z' s2 b) T
, k# N9 \# j& R' `( A3 g
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:# o8 n8 t6 U- M3 \. G
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
, Q! w7 C: s( Z) ^# Q  |5 N; v* k+ W7 i. o( Y* F% G) N: y
void GetWmiInfo(TStrings *lpList, WideString wsClass)
  T% y; T2 A# F/ n3 U) H; x, W& N{* l( g6 N2 T! V+ b6 X5 A. n7 v
  IWbemLocator *pWbemLocator = NULL;6 ^3 a6 `$ t% U4 E
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)0 s0 d% z# O- `4 b/ Q
  {7 P: O8 b' {: e" \) V+ M# }' d0 }0 \
    IWbemServices *pWbemServices = NULL;
  {$ c, V; X" L2 g( O6 F     WideString wsNamespace = (L"root\\cimv2");
! ^& g: y# J* h, z7 ^+ k+ e     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
3 H( p% ~1 F  [% D! V# p/ n. P/ x      {
% a& M' C, r. `# n6 R) a, }- }1 ~" d        IEnumWbemClassObject *pEnumClassObject = NULL;
: \% J( f0 ]7 K3 B, L( [) ^9 e        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
4 N8 x$ E7 a& T$ ]2 R+ ^: ?- H' @! G        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)4 Z% \! ]1 l+ {! \
        {
2 d* k$ d+ o! |- L4 d. T2 b. O! H, Y           IWbemClassObject *pClassObject = NULL;; ?8 q! H. w5 k" _; c
          ULONG uCount = 1, uReturned;
4 @; ?/ L/ R0 q$ S8 z! d           if(pEnumClassObject->Reset() == S_OK)
  x, j- J$ J" q' s4 d) {& l" E# p            {
. }' W$ A2 z+ n$ p3 t& H              int iEnumIdx = 0;2 S! E! k! b5 J2 g. H
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
2 A! ]3 i! n6 [8 ^% ^! w. z" f               {. A2 ^7 j3 f0 J
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");$ o' Z$ @+ U7 C: k6 J1 ~2 q

! u1 L# |* e" o                 SAFEARRAY *pvNames = NULL;: N& g9 m) B  r+ n2 v
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
# F5 ]1 c# X2 Q" v                  {6 W6 m& w& `! R* l2 B* y. w: u
                   long vbl, vbu;. O. j" }) n8 v  l1 c: ?
                   SafeArrayGetLBound(pvNames, 1, &vbl);; h2 ?. X  B( [  L/ Z1 P
                   SafeArrayGetUBound(pvNames, 1, &vbu);" w7 _3 i5 a3 m5 |3 Z2 ?6 V
                   for(long idx=vbl; idx<=vbu; idx++)6 N5 \8 c# K0 W# p# Q6 |
                    {
# `* ^2 Y/ J/ J4 h( }/ z                       long aidx = idx;. S, f- `9 V% ?& c2 q9 x7 z
                      wchar_t *wsName = 0;2 K8 A  m' k5 L, P
                      VARIANT vValue;
4 d: b# u; n" K1 n9 N, `% U                       VariantInit(&vValue);
  {& r3 r7 P: v: m' \2 {                       SafeArrayGetElement(pvNames, &aidx, &wsName);
9 ~6 O9 n! I  \3 h8 a. Q! r; z; p" q
                      BSTR bs = SysAllocString(wsName);
; S5 s2 k: r2 T' k" {0 y9 f, R                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);/ _9 s6 K: j5 k$ K
                      SysFreeString(bs);
. H( ]0 L+ T4 J1 d  N! X
, j9 S. T# k; z7 r4 X1 b4 o  X                       if(hRes == S_OK)) n1 r2 y0 A! p: R5 K! ~
                       {, {3 A9 h7 w  {' B& ?, J. [
                         AnsiString s;
, Y& w; ~; \5 D                          Variant v = *(Variant*)&vValue;
3 p; `7 y: A: l                          if(v.IsArray())
! Z: H. V& t8 ]/ K                           {: h  l& l" }- @9 z: w5 U/ F
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
5 L, S' O1 m2 P% t) S# `  g6 C                              {
3 W! C$ y5 C6 Q. u8 J& Z2 L( ]8 C                                Variant a = v.GetElement(i);
% m) [$ v# k+ m, }- Q( g3 c                                if(!s.IsEmpty())
' w* |8 J9 K: A/ A5 ]                                  s+=", ";
2 M7 ~3 t4 z7 M. v                                s+=VarToStr(a);& B/ T  F1 q$ Q) S' A
                             }
" Q! }. ^1 @" y4 v' Z5 r3 \- G                           }' m4 |/ g/ A4 n1 _
                         else- @1 |: A0 E) B* X4 o0 t8 \, q
                          {
( [5 ?% g; N2 h/ p) D8 n+ H# f2 L                             s = VarToStr(v);2 X4 I( z' ]& P; K. B2 c- f
                          }
' n, x& c4 T* \5 B                          lpList->Add(AnsiString(wsName)+"="+s);! O: Q  R, K3 x7 N; V* `( [7 _
                       }
2 u: u  X  f, k) y( `
" N6 G7 M9 _0 C1 P' e% U" }                       VariantClear(&vValue);
5 E" y/ u( p& J& Y" |. G& K                       SysFreeString(wsName);
& v  @2 o$ V' T/ `                     }
1 H3 L. n1 S) e5 K9 @7 P                  }6 F% N. F8 V8 c& ]! z* m) \
                if(pvNames)SafeArrayDestroy(pvNames);) x. {' E0 X* W% i9 D8 z- s* y
                iEnumIdx++;  R8 J/ G. O: K: N
              }5 p* p0 I0 f3 Q, q( [* Q8 _' b/ i
           }- j: N- R4 [% f% s
          if(pClassObject)pClassObject->Release();
; v* p  o" }  e         }# N; l* o/ {' R' D0 W
       if(pEnumClassObject)pEnumClassObject->Release();" Z/ I+ D9 H& B. j" w. C
     }: s4 h  w3 R& z+ X9 p, O( q
    if(pWbemServices)pWbemServices->Release();) H) {: ?+ z% t# B- U5 ]8 D
  }
4 _1 V# f) q7 w- L3 n- X# R5 Z  if(pWbemLocator)pWbemLocator->Release();
  d8 Y2 G, [5 e: h1 `: B. `5 I/ @}$ k" x. b$ S/ X# o% o
//---------------------------------------------------------------------------
1 L+ Z/ W" P6 n7 Z& H0 l/ k4 H7 S( p: e( n0 h$ p3 S/ b& R
// 通过 WIN32_bios 获取 BIOS 信息:
# T6 g; g  i! G4 y6 V* q. Vvoid __fastcall TForm1::Button1Click(TObject *Sender)" O6 y: a5 u! E- _
{; I! o6 w( N3 W% |+ d
   Memo1->Lines->Add("================== [WIN32_bios] =================");
# o& i, t$ [7 R+ V+ H    GetWmiInfo(Memo1->Lines, "WIN32_bios");$ f) ?/ H" Y2 s. K5 c; k
   Memo1->Lines->Add("");- k1 \# o2 |) n3 q; F
}
) G- k8 y, _) z
3 w& W- p7 x3 j4 V  y' R--------------------------------------------------------------------------------: ~/ M- }$ o4 a8 U
8 j+ Z. U# \+ u% H$ d8 z
WMI 可以访问的信息类型有:$ L+ G$ S5 x$ k  i; J
  Win32_1394Controller
! b3 R" l" I( t+ v4 c( d8 i2 L) ~, J   Win32_BaseBoard& b0 d% J4 I# k2 M& ~' k& z" T
  Win32_Battery& X' H7 m- j* \
  Win32_BIOS- x( V- I. P! K5 O
  Win32_Bus
+ `$ c- e/ @2 y& w& P" S   Win32_CacheMemory4 _0 f6 i1 M+ [4 A( x
  Win32_CDROMDrive: b5 |% }2 z, B- U# u- ?$ _& W
  Win32_CurrentProbe2 M& _. x1 ?8 b* H  O
  Win32_DesktopMonitor
2 q2 ~: D2 r1 O* X0 r3 |   Win32_DeviceMemoryAddress
' c1 k. g$ M3 R4 C! f( ^% R   Win32_DiskDrive
3 h; y- O* ~- A7 }8 W) @) [   Win32_DisplayConfiguration
4 G" H2 V$ t# f# Z" |& j   Win32_DisplayControllerConfiguration! N. D& N& |7 L0 K
  Win32_DMAChannel+ E+ o2 \! ^5 Y+ j5 I
  Win32_Fan
3 m4 `+ Z; ^1 V$ v8 h   Win32_FloppyController! O0 |4 K$ S% S. g  U5 j% t
  Win32_FloppyDrive+ R9 c0 s4 {: p/ X, Z; @
  Win32_HeatPipe
' w! }( M3 w* b% ]- i   Win32_IDEController+ i' @% }5 t. Z" X3 U
  Win32_InfraredDevice+ g4 M  h& @6 X. j+ w' ?4 Q
  Win32_IRQResource
0 O- R8 x. U* J   Win32_Keyboard
: J# y0 b: k/ e, d8 q   Win32_MemoryArray! E4 Z$ }% A; Y5 v2 N6 D3 h# K6 v
  Win32_MemoryDevice$ r; b1 K7 k* m6 @1 L
  Win32_MotherboardDevice; H. b6 k8 t, U) s; S% o) g5 @9 J
  Win32_NetworkAdapter
6 ?9 l, \; B* ]  c6 i. ~   Win32_NetworkAdapterConfiguration- G7 o1 y% ?1 L; K1 ^+ h
  Win32_OnBoardDevice+ v& R* {4 w- [% q5 {4 f' M
  Win32_ParallelPort
# @2 {5 \" i' m' ~, K, G# \' A" I3 ~: `   Win32_PCMCIAController- T' n3 ]+ {  h
  Win32_PhysicalMemory
9 R, z6 V) o$ n2 H   Win32_PhysicalMemoryArray
. f6 i4 q0 }) F   Win32_PnPEntity; P, Z, z' q" n, G
  Win32_PointingDevice
! r6 v, o9 M0 N8 ~% b2 O$ x' T   Win32_PortableBattery
# @8 _+ L* B: ?1 j   Win32_PortConnector1 q) l: Y* \) O0 S2 E6 X7 |
  Win32_PortResource
) I) W, a* g' k' t' ^  ~   Win32_POTSModem! t! f! E; w3 f$ m
  Win32_PowerManagementEvent
0 M! {  @$ D* o5 z   Win32_Printer
  i4 V- [# J1 x% I7 T: p  u. |   Win32_PrinterConfiguration- b1 T* p# x' g+ ?9 A0 b
  Win32_PrintJob& Y8 b# O: V  O. i4 E: T
  Win32_Processor; q: Y4 Y" v! G6 }
  Win32_Refrigeration
  o, [! y3 o. H5 t   Win32_SerialPort1 a6 C7 q) x4 a+ M4 G6 u0 H
  Win32_SerialPortConfiguration1 J8 L$ {7 X9 x! K: g( I2 Q
  Win32_SMBIOSMemory$ B! D4 J& A6 \" Q
  Win32_SoundDevice
/ ~# I" a9 B9 t: h* U( R% l# ]& R9 |   Win32_SystemEnclosure$ A) t0 o9 X; x" G; w3 F: Q
  Win32_SystemMemoryResource& K0 C4 @- ^. U* t$ m% T
  Win32_SystemSlot
6 j/ K5 L: g9 m; m5 W1 y7 K  B; ^   Win32_TapeDrive1 S9 ]4 j) h) R* F7 h0 K0 h
  Win32_TemperatureProbe
2 ?1 y' o3 N% Y/ a+ o; o   Win32_UninterruptiblePowerSupply4 V8 `: [+ I6 ^0 c, ^
  Win32_USBController
1 O" e% ]3 u) [6 U: V+ D   Win32_VideoConfiguration
5 H% s3 Y4 E& y: d/ X   Win32_VideoController
4 X: G$ i. F5 E8 O8 D   Win32_VoltageProbe) [+ m6 |+ n& O' b
& x, I* G; z( `% L" A
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-5 09:38 , Processed in 0.018520 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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