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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)* K+ |( [- U8 T/ L4 ~, I* J
3 m6 ^5 J1 @2 U! r5 G8 d# {

# r+ T0 ?" _( S0 n, I; `--------------------------------------------------------------------------------
! |! ^9 X5 @: s+ x6 P0 [( aWMI: Windows Management Instrumentation (Windows 管理工具)
, v6 I6 q6 d9 s0 g  n2 Y6 o+ R& t2 D   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
9 o; O+ v# v# t+ p  N   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
- I% r4 y4 a8 c/ v: g   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
7 @/ ]- i+ S9 i- q; B; S$ \$ ~1 K1 s& X: [% r, t
--------------------------------------------------------------------------------& r  T9 w* }0 z% l! g+ f
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面7 F9 u8 ]7 R  @
7 }* E( ^( M8 i$ p9 d9 q" O% Z) h
--------------------------------------------------------------------------------  i' ?: S( T9 \) X
① 初始化 COM 接口:6 D2 C  d9 d# I- K- S" [& `5 k& J
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
2 t) Y' S- p7 A% a8 \   这两个函数在 #include <comdef.h> 里面定义。
7 X* r! J$ Y& U0 d6 |6 f' c9 C8 x, w$ i3 u9 G: {& `7 ~' r! }- F
② 获取访问 WMI 权限:
) K# v8 v) u6 `1 w7 ]   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
2 k6 \  d4 z- c' S& `   如果这个函数返回 S_OK 获取权限成功, 否则为失败。4 M  j  a7 j" z8 e! p6 J3 v
* o% l7 V0 r) r! U8 J
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:3 d5 t: K8 _4 U/ [
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
7 [0 s4 o$ ]5 Z% u& t8 }* O
9 D/ p: D3 i% U! T) y9 mvoid GetWmiInfo(TStrings *lpList, WideString wsClass), v3 J1 O" j6 }/ z$ V( U, ~
{4 h) Q; }5 x, {& Q9 F) a! A$ q! W
  IWbemLocator *pWbemLocator = NULL;
( [( k5 n7 [% h6 B/ A1 _  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)( z! E& I3 \2 K
  {/ o1 i" ?8 }9 B6 o7 S
    IWbemServices *pWbemServices = NULL;
, y% \4 ~$ ]* `2 _8 q: \1 C/ D) j     WideString wsNamespace = (L"root\\cimv2");% p& t4 e4 g* X9 j6 K
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
7 G9 V0 j( n' f4 b! W4 @) Z      {
! b2 {8 p7 }# b1 o        IEnumWbemClassObject *pEnumClassObject = NULL;
! m  y/ z  _" @. C. d        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;+ Z2 t4 N  V5 s# y& x6 S& _) g
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 K& O2 `+ z' I5 O         {
* C- }5 \1 t0 P; @           IWbemClassObject *pClassObject = NULL;% E: W+ e/ V* X  `
          ULONG uCount = 1, uReturned;
; ~2 p- c# F5 b: Q           if(pEnumClassObject->Reset() == S_OK)% M5 |! z, Z/ a$ g
           {) k3 ?; K& I1 O' l4 A
             int iEnumIdx = 0;( R: b/ q) O2 U* B+ l- f1 N0 [4 G
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)$ T2 i' j/ W) q
              {% P! U5 b& F2 J% h+ s8 I& J  u
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");9 e  i3 Q$ n# T- ^" E

7 W2 i* Y/ p0 O) n8 B4 M  P; q6 o                 SAFEARRAY *pvNames = NULL;% g0 x% j* ~0 W8 Y
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)2 z; X  ?+ ]! E/ ~9 A
                 {1 r, t8 M8 Q& r0 L
                   long vbl, vbu;
( U4 L) C  I+ A! @4 I/ t$ R# N                    SafeArrayGetLBound(pvNames, 1, &vbl);! J. M. x- \8 K: Y; G% j
                   SafeArrayGetUBound(pvNames, 1, &vbu);
. Q& K* e/ b  t) U! }) y  z# Y+ }                    for(long idx=vbl; idx<=vbu; idx++)
  Q' E* L/ S- ~( [% p                     {
" L2 ~3 {6 v9 u                       long aidx = idx;
! C4 }2 ^/ T- F* g                       wchar_t *wsName = 0;
; U4 d# K4 i* R+ D" a7 P                       VARIANT vValue;
5 O1 R4 n7 _- c7 g; `& C, @                       VariantInit(&vValue);
% U: g/ L: Q1 T- y; m; P5 K                       SafeArrayGetElement(pvNames, &aidx, &wsName);. I0 `2 l+ Y$ r- r! t- T

9 }3 P; }6 \6 L# ~, u                       BSTR bs = SysAllocString(wsName);" C% Y4 {3 \% V4 L
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
- d* P' W' r$ L* O# O2 g# A                       SysFreeString(bs);/ |( X( X2 A3 s5 F$ b1 ~; z8 @7 x% G0 t

  P  v3 t7 o/ n0 `. P                       if(hRes == S_OK)
; J" [/ x% L. ?1 t                        {: ]# D8 @" f" }
                         AnsiString s;
3 J6 x% _. [8 U& d                          Variant v = *(Variant*)&vValue;
# i; \% X% o+ _                          if(v.IsArray())% p3 N7 W/ |. N+ a# g  D
                          {
/ g7 b0 m, ?( C- r                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
0 J9 [. r/ u' Q0 X5 R; A/ c0 A                              {2 d4 V8 E5 o0 k' k' R
                               Variant a = v.GetElement(i);+ w8 A* X3 M+ A) C
                               if(!s.IsEmpty())
9 H9 U6 |: \; B                                  s+=", ";! {5 k, D4 i) t
                               s+=VarToStr(a);/ ]4 [/ _8 O9 s1 j+ Z7 ]
                             }3 o& [3 D0 m2 L3 h4 @' E5 S; l
                          }/ M! ]5 J. ]9 X" H* Q
                         else
9 x4 R, R4 s. a" \; K                           {
; B9 F  C0 p8 ^" O, \, s8 S' `" ?! O                             s = VarToStr(v);; X; Y% \* [+ _; K1 Y9 O# |" X
                          }' w5 |/ Y6 K% T7 b4 n/ N
                         lpList->Add(AnsiString(wsName)+"="+s);& ]3 n7 {1 b1 d3 j7 y) u- y( ^3 j
                       }
+ [* W# A5 x# v" F6 i! c/ @7 x
) H3 A! g2 U. W7 Y' z+ ]                       VariantClear(&vValue);
/ B6 E( m% p3 T0 T                       SysFreeString(wsName);$ B3 W& Y! H: w' t; K& `
                    }' F  m0 m. Z# z% N0 U0 [; s
                 }
. I- X+ F" M. ^                 if(pvNames)SafeArrayDestroy(pvNames);
7 x3 T$ U' v- K6 m: d                 iEnumIdx++;) [: Y4 C5 v% c' c# s8 v, E
              }' @# J5 V' G& z2 ~+ j
           }
; k* _( j" Q6 [9 m           if(pClassObject)pClassObject->Release();
! t3 |& r5 O1 U0 A         }
$ Y0 c) K) g' Z  u. ~% D        if(pEnumClassObject)pEnumClassObject->Release();4 ~) T- H0 b2 n) c* w% ^
     }
) Q" U7 ^: J% x: A& p9 z     if(pWbemServices)pWbemServices->Release();
1 ~/ h$ S3 C0 U3 k; c7 I   }) j2 h- W8 x6 [" O) I* p
  if(pWbemLocator)pWbemLocator->Release();& w& `4 l6 V. r% X9 S
}
5 t% @' T6 p2 C+ {* T) y8 t8 {//---------------------------------------------------------------------------
. A7 i5 e! ^3 D" W3 d, q4 H
% a1 S# Q* |8 A  @  V! d& `+ U// 通过 WIN32_bios 获取 BIOS 信息:
; I2 l+ m; X- Q/ |void __fastcall TForm1::Button1Click(TObject *Sender)$ T$ }& W* P* |( r/ y2 U. @/ m
{, w& j' n8 z- M5 p( }
   Memo1->Lines->Add("================== [WIN32_bios] =================");* v: N) O6 N9 x" [4 _
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
9 X, S0 W# p# s    Memo1->Lines->Add("");6 x1 y6 D/ ~# c: @" l: S
}
4 ~3 }( ^5 @! t5 e6 \0 J: _8 I1 b( G
--------------------------------------------------------------------------------; G% y( }8 S1 u4 u' B- ^; N

3 s" o% U8 b* `9 WWMI 可以访问的信息类型有:/ F. u( H" }9 K
  Win32_1394Controller
* D" `1 f4 k8 v* v+ z& }! F   Win32_BaseBoard
: j$ J( }3 V- N1 [   Win32_Battery
; B& i7 K4 }& W/ [" Z/ E: ~7 [" _' k   Win32_BIOS
1 W% g5 G) X9 u# j0 c! R7 q4 u   Win32_Bus7 u8 O0 S! Y1 g' E# h9 M( q; m
  Win32_CacheMemory) S) K6 P. I6 [# `
  Win32_CDROMDrive9 F3 E0 L7 K# D+ P: p: c; {
  Win32_CurrentProbe
& _. V2 s9 |  ~0 E6 k4 b0 J- J. ~   Win32_DesktopMonitor
& O% q; F( k  Q   Win32_DeviceMemoryAddress
9 i# U  m/ x9 I, L5 L! Y   Win32_DiskDrive
8 b: F$ ~, \+ U  H   Win32_DisplayConfiguration
; x+ i0 C. w" E2 Q- V" N% l. R   Win32_DisplayControllerConfiguration
% @# u! V2 `2 Y  w   Win32_DMAChannel
4 ~9 S$ _$ j9 X& u   Win32_Fan5 N  `  S$ y! ?: c% Y
  Win32_FloppyController0 ]. C2 U8 q! @1 p
  Win32_FloppyDrive
; g6 T6 A, h: v$ z   Win32_HeatPipe, n4 q# J* m9 a& u& S
  Win32_IDEController
- c8 ^; t% e; ^9 I+ n' m5 j% I3 g) g   Win32_InfraredDevice
! L' F. L3 Y% `+ o; H" E   Win32_IRQResource* I6 Y/ ^9 p: t" ]1 }1 a$ Z
  Win32_Keyboard
& }  Q: O8 W, J4 E" r% R% i% @   Win32_MemoryArray
, E, W+ y9 Z" M7 V9 r0 e   Win32_MemoryDevice
$ A9 o# a7 T  F: ^- U( j) I, t   Win32_MotherboardDevice
* \6 a" Q5 P+ N) i1 }   Win32_NetworkAdapter
$ ?2 a7 G, ~- L0 z6 B+ R4 M   Win32_NetworkAdapterConfiguration% S7 G/ V2 p) E" b+ _
  Win32_OnBoardDevice
$ t6 y9 \+ A( w   Win32_ParallelPort* D- W+ Q. n- N. [0 Z# W
  Win32_PCMCIAController
/ j9 \7 ~- u% u) E, ^& J* A: R( W   Win32_PhysicalMemory0 |3 i  c. A5 D9 ?
  Win32_PhysicalMemoryArray
3 S1 c3 y8 f2 N' }$ j' O   Win32_PnPEntity6 f- _2 |' M* R
  Win32_PointingDevice
% I! j/ a4 b2 I( R( {   Win32_PortableBattery# _: W; P& z, Z. A# A+ |$ _! z# q
  Win32_PortConnector' s$ @6 |0 N. h! Z) W' h
  Win32_PortResource
+ k- ?7 K& J& [/ W/ ^4 C0 @" }   Win32_POTSModem
2 q$ D3 S- \% g5 P( `! Z6 L   Win32_PowerManagementEvent
- A. F! B* f$ d( M5 k2 {2 Q   Win32_Printer7 w0 H  e* X( M5 s1 I5 n
  Win32_PrinterConfiguration
5 l/ W. e( f$ L- i' b   Win32_PrintJob* l: L+ e% }7 r# b+ j3 l; n
  Win32_Processor" w, ]) B8 x; d8 k) P8 g& i
  Win32_Refrigeration: d6 k- j# f- @4 J! ?  n: K- l
  Win32_SerialPort' P3 B- V) [& d# h; {- F/ C
  Win32_SerialPortConfiguration
5 w  L! Z% q. m7 u# M   Win32_SMBIOSMemory
( }& N& y! o% X   Win32_SoundDevice7 K" _  J/ i. Z! k- A* t
  Win32_SystemEnclosure
: m5 V: f( B3 U3 G' d( S6 A. ]  I   Win32_SystemMemoryResource) j: K5 J( I' {; o& s
  Win32_SystemSlot+ f" c9 g' Q! q/ r* y
  Win32_TapeDrive
; m6 v7 R! u* V   Win32_TemperatureProbe# g8 g/ @. w' t$ l
  Win32_UninterruptiblePowerSupply  i% H1 Q7 k' ?& R! t' i3 Y: w
  Win32_USBController$ B$ `& K8 r5 E" p
  Win32_VideoConfiguration. W  R$ ~% W) c) l: t+ e
  Win32_VideoController
1 m6 n4 b  _/ j$ `   Win32_VoltageProbe  a9 M1 }0 V0 Q0 h) s0 B7 j1 G
, ?) b7 E+ U: l
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-25 03:00 , Processed in 0.017944 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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