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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
; B6 {2 P( d: U. o! o
! ?" b! \- E0 x: u- g9 b$ ]5 A1 o6 @6 g$ P' Z6 |% {
--------------------------------------------------------------------------------
! p$ q2 q+ O- y$ |/ M9 h* Q# c: UWMI: Windows Management Instrumentation (Windows 管理工具)! ^: Q& G3 u! B  `' G
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
  l) e! T& u% S( T. F   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
$ r. ^8 ~, o8 a" V   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
; m1 e5 F% n: o  [6 w0 e, m) o5 l) }& ]* X4 I; A
--------------------------------------------------------------------------------  [& u2 u& V* R7 W! @
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面) C9 v& G; _+ [: `9 y

4 B8 o2 O3 T5 ~0 J( U5 S2 x+ {; B0 U--------------------------------------------------------------------------------: Z. b8 Y, i; }
① 初始化 COM 接口:# W+ T3 ~8 m/ M5 E: W9 @( {
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
6 W9 y3 F5 u3 O* V+ R   这两个函数在 #include <comdef.h> 里面定义。6 e% V9 s! Z9 ]+ Y# y- r( d  g) i9 R

. |3 M; Q1 X  K② 获取访问 WMI 权限:2 Z& N1 a; z; i" c0 y# B. @
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);/ `/ j  ~1 E% A% N% Z$ i
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
! \2 A( n- q/ I0 Z* W2 `- }
9 Z1 B5 ]/ |( H/ B# L4 `③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:6 q0 w  W0 l# ]4 ~( y9 I# e- Y1 B) ^
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。  e$ T. Z+ L9 ~# J+ R$ ?

" ]6 W2 s, h% Jvoid GetWmiInfo(TStrings *lpList, WideString wsClass). |5 e; N/ w! [: `: V
{" [5 s2 z- c$ R2 @( \( H5 Z
  IWbemLocator *pWbemLocator = NULL;) t5 v& T8 o0 \
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
' Z# Z5 e7 t1 \) u   {
  k3 I3 t' [3 x4 n     IWbemServices *pWbemServices = NULL;
- N3 [, S4 P: u) }     WideString wsNamespace = (L"root\\cimv2");* t# h: b% k8 |- `4 T0 C0 F) {6 p  O
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
1 m0 k: o, I, e& s, z, L1 x      {5 \% {( X# @: C$ ^% p
       IEnumWbemClassObject *pEnumClassObject = NULL;. |1 t# b4 i$ x. v) ~3 T
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
7 D1 r, U" T1 \  W: U$ y- S: T5 W        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)0 m% m- f! }* w+ i) f. W9 {8 C
        {
, k* P7 ^  D, M3 A           IWbemClassObject *pClassObject = NULL;
3 U7 i8 t) W8 e! Q0 w5 q           ULONG uCount = 1, uReturned;! G, _7 t; m# L& X+ B) |; N
          if(pEnumClassObject->Reset() == S_OK). G, ^) R! q; y
           {% p" E6 N. C0 I  n
             int iEnumIdx = 0;
# M2 ~1 @3 B  F" E6 b0 @' j              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
+ [5 N) z8 b8 y( D; V1 p+ X& ]( B* [               {( \+ y' E4 m5 n1 L& J4 S4 e9 @0 S
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");; y" L: n3 P9 d! Q$ ^- _3 K
& [% @/ _. v+ x1 S' A/ o
                SAFEARRAY *pvNames = NULL;+ H8 D7 G% b0 a1 m3 {
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
+ K$ u5 q1 O7 t0 V- J+ z# r                  {
  y  Y5 y) }, f* S1 z                    long vbl, vbu;! t# v2 V  t& d) b! q- h9 |3 R3 x6 {" ~
                   SafeArrayGetLBound(pvNames, 1, &vbl);" d  X! p7 Z3 o5 z4 T1 [) R
                   SafeArrayGetUBound(pvNames, 1, &vbu);- m, B! R  t. m) Y( R$ H9 O
                   for(long idx=vbl; idx<=vbu; idx++)7 X" [; ]5 f- Y$ L. R2 P" B0 v
                    {
* T/ S8 Z0 {" S                       long aidx = idx;
, i' M) K0 ~! ?/ K                       wchar_t *wsName = 0;) L- f7 z5 K. c4 Z& [
                      VARIANT vValue;
, @9 e4 O$ C9 \; Y; C                       VariantInit(&vValue);
  R+ `8 y2 m$ @                       SafeArrayGetElement(pvNames, &aidx, &wsName);
1 Z) i7 T# h. c$ R3 \
; p1 t) o$ c" Q. E                       BSTR bs = SysAllocString(wsName);
: W, N0 s7 h8 N" u$ Z                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);0 O9 n2 K% ?# z9 u. N3 j* g
                      SysFreeString(bs);7 i( \; r. R0 C6 T! \( x/ ]" h3 }# ~

9 d9 a# b* m: Q% H                       if(hRes == S_OK)2 q0 I5 d; n( I! X7 g3 l, A
                       {
8 t$ _6 v2 ]1 s, V                          AnsiString s;' h2 A: S! o  S( K- U
                         Variant v = *(Variant*)&vValue;
! Y; Z2 ?( M& L* {( L% U                          if(v.IsArray())
) t0 o6 D; m7 L& c) ?# K  k2 x                           {  E' v) l9 r' u4 |! W; o# _
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)$ ?! F9 x4 U0 a3 H  {
                             {
7 R6 h6 o6 ^0 F& o- S% k                                Variant a = v.GetElement(i);
& t8 t* c$ o0 h& r5 G" \1 K0 B1 y                                if(!s.IsEmpty())6 S* i6 x) Y& s7 U! F
                                 s+=", ";4 g2 G/ M: H1 @" `( R0 E: P
                               s+=VarToStr(a);) t! v1 Y9 H% y% z3 c6 f
                             }4 L5 _7 d: [7 t0 f) p  V
                          }5 F6 `5 ?1 Q& n
                         else
5 K2 Q' R4 n, u                           {$ x# x3 S( ]3 }8 h0 D
                            s = VarToStr(v);
  _+ i& a: D! F9 z0 B5 \                           }2 x5 x4 T' ]+ Z8 z) |
                         lpList->Add(AnsiString(wsName)+"="+s);8 _0 i/ |# J8 t$ b( X5 f2 V
                       }+ I2 \$ P& c6 j$ j7 u& [+ P& g  ~; }

6 y# w0 p0 L+ t1 f4 [7 P( n                       VariantClear(&vValue);
, ^; ^$ x9 u/ Z2 X  p1 O4 m  C. Y                       SysFreeString(wsName);2 s/ r5 r6 N. a' F) L2 R/ f3 [" q! W
                    }) g6 C) c8 T( m, S$ U
                 }) W) V, t& R) y1 e, ~
                if(pvNames)SafeArrayDestroy(pvNames);6 J) |: b$ R: Y6 [, `- h# O
                iEnumIdx++;; `+ E, N) M& k2 j. p) z, H! V
              }
- ^- m/ a1 ]. L5 }; @  h            }
" S6 k6 ?. Z" o2 C, ~           if(pClassObject)pClassObject->Release();8 m: H5 _! R! h0 l
        }) @: }/ a5 E% F7 Q2 O
       if(pEnumClassObject)pEnumClassObject->Release();: G6 `. C& {+ B4 }" O2 `
     }
7 S1 y. d5 `' M; Q, E     if(pWbemServices)pWbemServices->Release();
3 B; m" n8 k1 Z   }
& I" K) s4 b; t' \) H, ]  if(pWbemLocator)pWbemLocator->Release();! y4 |( j& |3 A; _" I
}% m" H; u7 F( v9 H
//---------------------------------------------------------------------------( N  ?% M9 _) E
$ b! R& B  K; g& w5 g. M2 Y
// 通过 WIN32_bios 获取 BIOS 信息:
8 e& {' ]- z3 W: ]void __fastcall TForm1::Button1Click(TObject *Sender)$ ~6 j- ]; u8 v' g
{
1 F& W( ^& |$ x+ k( U! G: n    Memo1->Lines->Add("================== [WIN32_bios] =================");) o) _5 q" E8 x
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
: c1 J2 l, {/ v3 M# l    Memo1->Lines->Add("");
! H7 c1 A/ F& i/ M. I* j( W+ F2 ]}9 {* B0 ^" ^1 O2 p5 _2 u

/ u8 p; R& ~& C$ a( l1 K/ ~--------------------------------------------------------------------------------6 B" G" U( X" c& [2 w# A6 P

( M% j& w  S8 f& C  i9 yWMI 可以访问的信息类型有:1 U+ p- |- X- L1 t: Q1 a
  Win32_1394Controller
! o9 c; }; p/ K   Win32_BaseBoard8 k2 H( f( Z  v  Z# V+ P+ b; p1 k
  Win32_Battery/ v4 S. Q: g; W% Q3 b
  Win32_BIOS1 i. @, V/ ?  D: ]
  Win32_Bus2 A1 Y/ z# o3 H3 q; R
  Win32_CacheMemory
. U5 Q5 j5 \' D) |) `; Y5 y   Win32_CDROMDrive; v7 ~& t2 K. \+ ]' q& n2 m
  Win32_CurrentProbe
- }. t' `9 B3 t8 z   Win32_DesktopMonitor
4 X# Q9 n  }0 e+ T- _6 G* i   Win32_DeviceMemoryAddress4 \; x/ O$ U9 N% B7 s' u( t/ T
  Win32_DiskDrive4 x0 R5 a( @, c8 R3 B
  Win32_DisplayConfiguration
" d' S: J! e+ ~# k9 }. m( V1 H8 T   Win32_DisplayControllerConfiguration' _1 r& @  v0 U# T3 A
  Win32_DMAChannel5 |  w% C6 ^) ~7 i  B
  Win32_Fan
. B/ q6 \( r/ r   Win32_FloppyController: N. [* z" M  _6 s& [( }
  Win32_FloppyDrive- w6 C" c: P8 M
  Win32_HeatPipe9 s5 m# d6 t) O8 s  W4 e* x
  Win32_IDEController
9 `+ t- w3 u3 G/ B5 Y3 }" ~   Win32_InfraredDevice8 c* `% N7 b" t
  Win32_IRQResource
: I/ |" B/ s9 Y- h0 h   Win32_Keyboard1 x7 u- |4 e1 w; _
  Win32_MemoryArray* w0 w0 J: P6 ]! S4 `) l( _5 a) J" o
  Win32_MemoryDevice+ x0 M+ h7 d" G% d& f
  Win32_MotherboardDevice0 U6 Y9 N! l# s7 \
  Win32_NetworkAdapter
, @, P- V" Q$ @' K, f+ X$ u/ H   Win32_NetworkAdapterConfiguration
2 S$ D7 }& d6 Y; c: v$ Z) S   Win32_OnBoardDevice
2 J; M: M4 J( i" M& E   Win32_ParallelPort3 c/ y7 m9 w0 d# L& a6 K9 a3 Z
  Win32_PCMCIAController( e$ V5 e  x. j$ O
  Win32_PhysicalMemory$ I' U& h7 V. A# Z
  Win32_PhysicalMemoryArray+ a; g1 K$ R; ]$ m6 V" b
  Win32_PnPEntity
" u7 a8 |* o  k% \1 ^  i$ O. M   Win32_PointingDevice
- g# }1 I+ L. s4 d3 R; ^   Win32_PortableBattery
" a8 b4 T/ q/ y$ D3 }. h4 `   Win32_PortConnector5 s: P5 X$ i4 ~! k6 ^
  Win32_PortResource
6 @% a, k% M7 D* d& I# Q, l   Win32_POTSModem
7 O9 y" N) x. W, Z8 F! |( B$ h   Win32_PowerManagementEvent; Z6 w. x# f  @  k% {. D
  Win32_Printer6 ]3 Y; _/ t" g$ d" q% n5 o
  Win32_PrinterConfiguration
8 @! k: |. R" A   Win32_PrintJob
" N( U. h* C: X& c4 m7 q# A; w   Win32_Processor) j7 ^7 ?/ d$ a" q
  Win32_Refrigeration
! p) s9 P: K, q+ q# T' s   Win32_SerialPort. l  ]& [1 I8 u
  Win32_SerialPortConfiguration
0 H% `1 q$ d, h) @( V# N   Win32_SMBIOSMemory! J- t' ^" I2 A2 ~
  Win32_SoundDevice6 J$ [# B0 W( t+ t( l
  Win32_SystemEnclosure% x. V; ]0 E. H( q0 I5 t: h6 g# e
  Win32_SystemMemoryResource/ }3 s* C, F( K6 \5 C
  Win32_SystemSlot
9 ?- G' J2 M  @' ^: r   Win32_TapeDrive
$ _1 A: `  R  w8 T9 W6 M  V   Win32_TemperatureProbe9 r7 m7 y; ?# b/ h: S2 d
  Win32_UninterruptiblePowerSupply% ^, C  n5 g+ k  n1 ^# U( z- d
  Win32_USBController
9 I  Q5 i& x0 i# T- ]. k   Win32_VideoConfiguration
. E' C/ ^; Y% h6 W5 \8 w$ m   Win32_VideoController2 w+ p9 ]) k. `7 L
  Win32_VoltageProbe
$ X8 S5 [. D; }( c
# u% J. m, |3 [9 C" P9 s以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-9 01:39 , Processed in 0.021286 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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