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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者), V3 r7 }! k. l7 I

. y  a/ B9 g3 i/ x& {, a; z6 ?7 \
, p* c, x: ]1 |--------------------------------------------------------------------------------
0 N4 u- f! P% JWMI: Windows Management Instrumentation (Windows 管理工具)
4 q) v0 O5 x$ e$ X- @: Z; ?2 x   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
7 d; a( E, B* |$ y! |2 z   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
2 ~5 h/ }: J9 r0 Z  C   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 7 `: w0 v9 ?. y8 V& G" P) v. H

& C" d' b! w5 x( J--------------------------------------------------------------------------------
6 |! t& b: t$ t9 k1 sBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
# I! M  D+ z% y0 E3 }2 y4 U5 a8 o4 e* l% I2 N! x
--------------------------------------------------------------------------------5 m3 M9 u+ n8 |: Q- S
① 初始化 COM 接口:6 S! o0 h% k6 ]- u$ Z: ], [9 B
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
8 x. T& Z$ e1 P: ^   这两个函数在 #include <comdef.h> 里面定义。
" ~- D& E' R4 `; n, J0 G
7 d, R) K" ]& m: P1 V- a- B6 N② 获取访问 WMI 权限:+ j( g- g6 B2 }
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);9 u6 f' ^3 ?% R4 A& n
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
, E1 q* D( E  X7 V8 A. y$ ]) V, |3 [  Y+ c
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
, a+ m; i, D/ w1 ^: |   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。0 t, V# f) x, L6 Z; R- l

- V9 o6 h3 \' ?2 ivoid GetWmiInfo(TStrings *lpList, WideString wsClass)
; w2 X) X5 g2 ?0 \6 N" m8 P{
' g4 G/ {$ _* m. h" ?  IWbemLocator *pWbemLocator = NULL;
: ?- ]9 n% f0 Q- [/ ]  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)$ c$ ~0 @( q" N9 h8 N, G" f0 S0 K) O
  {
& v* T7 e0 M0 e" i! ^     IWbemServices *pWbemServices = NULL;
' J8 u' L, D& R9 m. F     WideString wsNamespace = (L"root\\cimv2");* y7 F4 S0 V: k1 b2 }; N2 u+ O
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)2 n& l( W7 t6 y# F" F8 t1 e
     {
; Q  k& Q# S4 z' X& e) i! w        IEnumWbemClassObject *pEnumClassObject = NULL;5 |8 n! |! S+ C- n- M
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;" _$ f4 d  U( {* ~3 j
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
: h" a: d  X) n1 ^& \. C         {
- B4 y. N% I8 {9 B9 d0 H           IWbemClassObject *pClassObject = NULL;
5 ^( h; q+ R* p5 W) {9 f: p* u" s           ULONG uCount = 1, uReturned;+ z( U0 p& p7 d; U( r) H) |1 w
          if(pEnumClassObject->Reset() == S_OK)& Y8 J7 M7 J1 @* Z8 W" K  G1 o! |
           {
" _" ]- A1 x6 o0 E              int iEnumIdx = 0;5 o& A' {+ m7 x
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
- W2 Q2 k: Y7 M2 V+ z               {1 h& E' o. {; o' N3 Y% l
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");! J. g6 K) X% |% \6 E9 n

: G+ n! V5 j6 D- D0 \+ R7 ^5 Z* s: z                 SAFEARRAY *pvNames = NULL;
+ i: a; I, L3 n; W0 ~                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)& ~' d) ^& |8 i8 u( C
                 {
# ?( `; [- a, a9 P  }4 x                    long vbl, vbu;
5 q7 j  ]/ q* D9 m4 ~1 H5 ^                    SafeArrayGetLBound(pvNames, 1, &vbl);- y4 y: ^  q9 D. C# c: w! |3 u
                   SafeArrayGetUBound(pvNames, 1, &vbu);& P% Z! `' B& G" t6 X
                   for(long idx=vbl; idx<=vbu; idx++)+ O# t8 O4 X* s4 \8 B/ j3 d; t
                    {
" T& ]6 w' A9 \- U5 M; `" B2 x" C                       long aidx = idx;4 i3 \; R0 ]( K' {' I4 u5 f
                      wchar_t *wsName = 0;5 p! i* ?; p! z9 z' k* n2 [
                      VARIANT vValue;
; A) N1 j0 W4 S9 H6 p7 S                       VariantInit(&vValue);
& ?( g' \- I* k* R                       SafeArrayGetElement(pvNames, &aidx, &wsName);
2 R! p; J1 a$ Z2 n1 D- j- s/ E0 |. T6 N& J
                      BSTR bs = SysAllocString(wsName);' j1 k1 u5 J+ v* y# Y. \
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);6 H5 K; X2 J8 k+ _
                      SysFreeString(bs);. @9 S. M2 t4 h% }* g
# F) l/ c! r) O6 C1 K+ g! f
                      if(hRes == S_OK): R6 X* P% t# t* @5 w) D
                       {
0 ^: v3 Y- o/ c% s/ s6 H2 h                          AnsiString s;( m3 @; F5 Y- h+ `
                         Variant v = *(Variant*)&vValue;
) w) [! ?9 N: u- f                          if(v.IsArray())
3 H8 u! I/ f+ b1 F& s                           {
+ `$ j& m9 s# g6 p- E3 Y/ h% r+ T* X                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
8 |5 `+ Y. f7 n1 ~+ m: A  b                              {
8 T( E8 j8 T! D1 r                                Variant a = v.GetElement(i);1 {& L/ k9 ~) `3 ^8 o" O
                               if(!s.IsEmpty())
) Q  c0 o+ ]1 e: \- _' E+ `8 z+ J                                  s+=", ";9 r) ?0 ^2 z4 \* L, t
                               s+=VarToStr(a);& v/ u% H0 K, v
                             }5 Y: g6 S( E- D
                          }' P6 Q) j' x7 Q% K" t) @6 r" p
                         else. L3 f: E" @5 n2 J, S( a1 U  H
                          {4 a6 M% u9 z0 w! r' o6 q
                            s = VarToStr(v);
4 i5 X! p" C' q; @                           }
+ W" b5 P+ V* i$ u( ~! W# D6 G! L  ]                          lpList->Add(AnsiString(wsName)+"="+s);
! i4 I4 U! n# b( Y                        }- j) a& B9 J7 k5 K  q

1 Q+ w8 Z* s6 `0 X( r4 o/ g                       VariantClear(&vValue);
! t1 M; Q  E5 i2 k: f                       SysFreeString(wsName);
1 f, z; P  E0 {3 E1 e                     }: S! ~  [) h: F  J4 G& g7 j
                 }6 Z& g/ W% T; Z( q
                if(pvNames)SafeArrayDestroy(pvNames);7 V& w: i" z2 {3 _
                iEnumIdx++;
* e$ H% U2 Z! \$ C0 D! B               }
1 ]' l2 j3 Q! D2 t# @+ j            }
+ M" b2 K; z5 s. S* }           if(pClassObject)pClassObject->Release();# a* [! A. J& V& G+ G0 j
        }
# W; T. r+ F$ @: y        if(pEnumClassObject)pEnumClassObject->Release();
4 B* r3 ]) ~  }: K* t) ]0 X      }
/ C4 Z7 u' U  u4 Z% {$ y     if(pWbemServices)pWbemServices->Release();
# [/ _& x3 ]6 U# n! ?   }& U3 [  e1 E- p( ?
  if(pWbemLocator)pWbemLocator->Release();# @- _  K+ _- m* s- F6 A
}
* _  k  B6 \" R7 Z7 `0 Q//---------------------------------------------------------------------------
5 A. u: H* N# [) u5 f% A1 f8 u
+ L/ \1 v% b1 o5 W" V: g// 通过 WIN32_bios 获取 BIOS 信息:
. |/ A& x; L& Evoid __fastcall TForm1::Button1Click(TObject *Sender)3 i. r( W+ F! N9 ]+ z/ q* \- n
{
, ~3 t: D, o9 ?% N; J9 l' r    Memo1->Lines->Add("================== [WIN32_bios] =================");4 ?! s0 V! N  b6 M
   GetWmiInfo(Memo1->Lines, "WIN32_bios");( i( y5 Q/ O! U' G" G
   Memo1->Lines->Add("");( ]' o3 \3 s) Y1 J. q; J
}
; W4 ]. ?9 i" ]+ Q! |
; c, L, |6 R) |# ]$ A+ L--------------------------------------------------------------------------------
+ l  w3 _& H/ J  P; s% c* c4 l' g" ~- v% Q9 h6 Z, g
WMI 可以访问的信息类型有:, q; F. R/ j. C: W) _; D. C
  Win32_1394Controller
7 c( r6 D, Y$ v; M4 Q   Win32_BaseBoard0 P4 |, i  Q$ F. N
  Win32_Battery
0 L4 x( x2 C; a- e   Win32_BIOS$ C' s5 T" y2 y. ^& Q' h& V1 p$ i0 y; c
  Win32_Bus
7 ^& s2 P* G- c, n; V# k   Win32_CacheMemory
' I7 _, [5 t6 O+ q9 u   Win32_CDROMDrive( I, ]5 U4 [2 M( ?0 M  h
  Win32_CurrentProbe5 n% a. Q* B: C3 U8 z
  Win32_DesktopMonitor
! {* T' b- y' F   Win32_DeviceMemoryAddress
6 D, K+ y+ }2 @$ O6 _   Win32_DiskDrive$ a' \+ `2 _. ~1 ^7 A5 [! N
  Win32_DisplayConfiguration; `% i' ^* E. w5 C$ q+ G
  Win32_DisplayControllerConfiguration1 h+ Z# r/ X1 a, ~) ^
  Win32_DMAChannel
1 M0 Z$ M' ~: E0 Z- x6 L   Win32_Fan
: {, s  G7 k: F" c  O4 o   Win32_FloppyController; z6 O# I6 a* i3 Q. Y, e
  Win32_FloppyDrive
1 a. ?  [( ^2 i3 w0 l   Win32_HeatPipe" ]6 r; y# g4 q/ B
  Win32_IDEController
2 D! J% N" o" w* F   Win32_InfraredDevice
" {; A* @! K+ K3 Q   Win32_IRQResource
, a% c, G8 a( y& p2 L( ]1 v   Win32_Keyboard
! q5 _. `, P, x0 y4 Y   Win32_MemoryArray8 ]6 Y$ g) q, Q* Y) q0 r- g: L! i
  Win32_MemoryDevice
  s4 f; t9 p% c, @   Win32_MotherboardDevice
& M8 g5 l4 `; \, c1 W   Win32_NetworkAdapter
1 k" \. E' c" B, x+ q   Win32_NetworkAdapterConfiguration
. N0 l& c' u/ _7 v# V5 C* ~4 b   Win32_OnBoardDevice9 k& l- k7 n# ]- y9 `6 K, M1 c
  Win32_ParallelPort
+ M$ S7 m0 N, w2 }3 G   Win32_PCMCIAController
/ F1 j* R/ l7 f* E   Win32_PhysicalMemory3 ^6 `" v3 j1 q" O" ?/ D8 m: u
  Win32_PhysicalMemoryArray/ R8 r6 j: R, P
  Win32_PnPEntity
1 j+ r% s/ v5 F! ], Q& Y   Win32_PointingDevice
* k% B3 e7 u+ I+ i/ E. S8 `7 p   Win32_PortableBattery
/ `* N. c: k2 u1 `& a: }: Q' |- O   Win32_PortConnector( o8 o1 [; I" j) K8 b, z& o4 k& U1 ?
  Win32_PortResource# f- A9 E1 c* B5 S3 f6 V1 g
  Win32_POTSModem; l- c  K, W3 e7 W( ^: ^  f# C) J
  Win32_PowerManagementEvent
( ^, B+ r5 p, E/ T   Win32_Printer% X  W/ m+ r( c7 B
  Win32_PrinterConfiguration
  b# ~! [+ X6 U$ q8 N   Win32_PrintJob
1 S7 i: @! K' R$ B" x4 n$ |   Win32_Processor" G7 O( G. B3 [5 l, ]8 k* E, p
  Win32_Refrigeration
( ?1 g6 ^- M& k  U) Y1 @   Win32_SerialPort
" }4 |0 i" Z1 g1 P: m% x7 n   Win32_SerialPortConfiguration
, Y5 f' o9 ]8 \* H   Win32_SMBIOSMemory
7 \; l3 z8 D* U( C( L$ x! N: f   Win32_SoundDevice. v% {; L9 [+ \1 H4 G
  Win32_SystemEnclosure
5 a+ K8 T3 `: Q. s8 w   Win32_SystemMemoryResource
) {- d9 ~3 Z5 g; H# ^* Z   Win32_SystemSlot
0 t3 A8 z8 T$ _9 U   Win32_TapeDrive
  {, Q$ @' t- J# q% ?& w   Win32_TemperatureProbe
% J. z/ |( x# w+ ^3 n/ W0 a   Win32_UninterruptiblePowerSupply
4 p& a. Q6 d+ J3 y2 a   Win32_USBController
0 N$ {' \' m+ M$ P   Win32_VideoConfiguration
" _! f) L& _- n* u! J$ R& U   Win32_VideoController
, L+ p: A' n# A1 k   Win32_VoltageProbe
, l9 h$ z6 h8 U# Z' c% ^- A# w4 L$ U
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-22 09:07 , Processed in 0.020017 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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