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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)/ A( g: |* [7 S% Y+ N+ [# M0 _) S

+ p. J4 c5 I3 N) X" _% F, C6 |# v- l' G  a  J0 ]7 i
--------------------------------------------------------------------------------
9 T) ]  T) M: VWMI: Windows Management Instrumentation (Windows 管理工具)
1 ~+ g+ M9 Z- b. N$ F' T   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
# o1 \6 \% q: g5 w/ ?   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
- Y, w% A! C& Y9 r. s   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
4 ?2 x  j$ G% }+ C5 n4 t% M5 ^0 V- t: N8 p+ v% l, |
--------------------------------------------------------------------------------! f1 M0 S4 R. c
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面" k  y8 l$ ]7 @# D4 N

$ @/ T+ K7 J# ^# m( R$ N--------------------------------------------------------------------------------
6 f* V* ^+ c$ Q; b" P① 初始化 COM 接口:5 E: l  i9 j- S0 q: ~# K3 Z
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。: C; G. N* B& q
  这两个函数在 #include <comdef.h> 里面定义。
; `( U4 r1 R1 j. X' \1 p, s! w* i; ^- x; c
② 获取访问 WMI 权限:
" q$ r1 }! Q% m+ k+ a   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);+ e: O2 |% V, O" O0 f" ]+ {9 ?
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。6 z0 o6 z( P9 c0 z
( y5 L9 V* r, h( z
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:+ y+ T9 O7 |( Y2 ^# \2 Y) ]0 H4 S
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
/ N0 z& ?! |8 h" ^; p% i2 j" f! T" [) y3 a) l8 e+ _. {
void GetWmiInfo(TStrings *lpList, WideString wsClass)
* R1 C- e8 I- `# p; n{2 y& ~# a6 E+ P9 G$ T
  IWbemLocator *pWbemLocator = NULL;; H) I% `  @) O4 H/ E  a/ \7 ]
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK). ]( ~1 b5 _/ t! y
  {8 p- k+ }2 W5 C8 L- x
    IWbemServices *pWbemServices = NULL;
. A' U* C% S# ?$ T     WideString wsNamespace = (L"root\\cimv2");
3 F/ _) F7 y" s& M1 w     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
" N, F% Q8 G' V# w5 B. F      {% F7 I/ s1 c: A7 j# z
       IEnumWbemClassObject *pEnumClassObject = NULL;
5 z0 J! h) }$ l        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
& l0 r7 q% \7 r- D4 |        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
3 K8 K  ^+ h5 U( G         {" X3 G/ e& }  v' S  i$ u
          IWbemClassObject *pClassObject = NULL;
' o: m( f7 l  u- {5 I, {2 q           ULONG uCount = 1, uReturned;: H% H; H/ V% E+ y8 T
          if(pEnumClassObject->Reset() == S_OK)
0 Z: ^" m4 s0 u$ K3 J8 X            {3 n# \$ e" X+ G/ }, D+ `& v
             int iEnumIdx = 0;
+ V9 Q& p% I' S6 d) B              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)- j* X$ y6 K3 U) H
              {: m) j4 ~* Q. N: L/ n2 u, x
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");. O+ h0 D+ F  @- I: `$ N" c* b

4 H5 o; \; a* i4 t, w. S  d$ {) u2 T                 SAFEARRAY *pvNames = NULL;
$ k8 a* S& @/ I9 {! C. z- r4 b                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
4 w6 K; C/ J! d' v8 S+ q+ l                  {
9 U# Q9 [% [3 d1 q( C( Z- c0 g                    long vbl, vbu;
2 n4 B0 c; ?( _; v+ @                    SafeArrayGetLBound(pvNames, 1, &vbl);
9 R; T5 C5 t+ v* v                    SafeArrayGetUBound(pvNames, 1, &vbu);$ g8 e4 o; {7 I& }% ^! ~
                   for(long idx=vbl; idx<=vbu; idx++)9 ?6 q7 z! \9 A. j0 u% W% x
                    {! C! \- j- e2 F) z) `
                      long aidx = idx;2 ~4 \6 z" z/ i4 U$ ?: o
                      wchar_t *wsName = 0;
, ]/ x7 J& b3 J+ q+ [& D                       VARIANT vValue;3 ?8 R; I5 }3 `6 ~' I
                      VariantInit(&vValue);/ x" J3 i6 Z7 \8 d' x  P
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
7 M" q- R, \4 I- E6 A  a
0 `, G, w# [& ^5 T; M                       BSTR bs = SysAllocString(wsName);
# c8 ^. x$ X" g1 i8 h                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
* C$ D1 N* {3 ^                       SysFreeString(bs);
3 y( c, {5 s( j/ A+ T* z0 I
; p/ i4 t6 n, M; R+ Y. h                       if(hRes == S_OK)( b4 H! y. }+ q- f$ }$ @. `
                       {
$ N2 G$ u( T* `$ t+ S7 `5 E! j2 d                          AnsiString s;
8 J1 H8 E* {" v1 p! o6 u                          Variant v = *(Variant*)&vValue;) |( c# ^+ V6 L6 g# d  ~0 O
                         if(v.IsArray())3 Q' a: U/ g: f
                          {+ l) I6 R& M4 S% t, _
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++): `( v, N; ~; r. w4 E9 h! A
                             {5 _6 A% Q* A" X0 o9 u
                               Variant a = v.GetElement(i);
9 k3 G/ |. ~! h                                if(!s.IsEmpty())
2 I" _( ?1 F4 R, {; P" U% |                                  s+=", ";
, ^& ]4 \7 o; B$ d- F6 V% N5 E                                s+=VarToStr(a);! Z1 f+ `7 M4 N: n1 Q6 m. O
                             }1 }/ P6 q/ }# m, T- ?7 z1 r
                          }6 ~1 c$ C- ?% |* U4 r- P
                         else
2 y4 u+ n* d; e7 T                           {
" q* K, m1 D2 w" U) F                             s = VarToStr(v);
! L; G, K& I2 j. A* G% ^, J4 N, c                           }  j: L' z: a8 O/ A
                         lpList->Add(AnsiString(wsName)+"="+s);
5 F1 i( F2 }4 A1 }                        }' z* \3 \3 ?# F6 D6 V: c' q- k1 N9 h

% K2 I/ V3 K3 _# o+ o) d) }                       VariantClear(&vValue);
- m. q9 V  P6 X9 X                       SysFreeString(wsName);
+ c5 ~8 t+ S- o+ S/ F                     }7 }, G* B0 S6 r& O3 p( M% X' {
                 }
6 |8 F4 t" F7 o$ Z4 n" F                 if(pvNames)SafeArrayDestroy(pvNames);
! X, p) V; m. H; E2 B% o1 S& b                 iEnumIdx++;5 W! O0 q) }$ n2 _  n6 a
              }( n7 g0 z6 D7 [4 X% W! z
           }1 o  I6 s4 I. @! a  ^3 n+ p. ?' c4 t" q
          if(pClassObject)pClassObject->Release();
4 V# k- p1 F2 _2 Y1 j         }9 V2 u0 P$ x5 u5 s+ a" @. B
       if(pEnumClassObject)pEnumClassObject->Release();7 D! B: v2 A1 c
     }! z; R; A2 f8 W3 h' @
    if(pWbemServices)pWbemServices->Release();
8 c6 L) ~7 E' N. }; u* q   }
' R+ @/ b8 v" r) c! r) \  if(pWbemLocator)pWbemLocator->Release();6 t) f: V4 r& m0 u6 T; D
}& V/ i8 `0 X) G* ~
//---------------------------------------------------------------------------
3 P  q( m7 j0 I8 n' ?* V3 t/ }  @3 ?: o* r: ]* C( d
// 通过 WIN32_bios 获取 BIOS 信息:
+ e. F. r2 y! ?8 `' x* v: F+ Jvoid __fastcall TForm1::Button1Click(TObject *Sender)- s4 b: B4 g7 n1 l3 \
{2 G) _3 m; {& i6 A: C& d
   Memo1->Lines->Add("================== [WIN32_bios] =================");5 u' S+ Y7 X7 W  W
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
9 w! y4 r. m# V: w9 u( E$ H    Memo1->Lines->Add("");5 m3 l2 r! y+ `9 M4 h+ x# C
}7 O" Z: [0 B9 W7 C! t; y! E) i

6 [, V9 g1 M2 U--------------------------------------------------------------------------------6 i! o: J$ K; S- H3 M; u% o; b2 y2 z
6 `, A3 h5 l/ N- [2 y
WMI 可以访问的信息类型有:7 ~: n0 h  ]7 P
  Win32_1394Controller
8 r0 l* b; c7 o: W0 @8 T   Win32_BaseBoard! t6 ^6 k% c# ~6 u- s: M
  Win32_Battery
0 ?/ R. T7 U2 @8 v9 ]* h: S' a   Win32_BIOS' K- C( C9 a; G$ }: f: r0 [) H
  Win32_Bus! O- C* |$ ?. K  ?$ `! T! P
  Win32_CacheMemory
0 d5 ?- y" t: E! w# ^  ~% E- `   Win32_CDROMDrive! ]# F/ G; w: I- y
  Win32_CurrentProbe
) q7 {: i- f- n2 P   Win32_DesktopMonitor
0 C: k( d# k3 Q8 I- W   Win32_DeviceMemoryAddress
/ E" Z8 D+ `7 O' F7 m. c! V   Win32_DiskDrive) [/ `! _9 `/ O* J
  Win32_DisplayConfiguration4 I3 j2 Z$ Y. E
  Win32_DisplayControllerConfiguration
7 X2 ]6 G$ f' @; J- P   Win32_DMAChannel9 J7 T1 S( h  L# M; u# k
  Win32_Fan
- D' |) j) d/ B1 L/ u   Win32_FloppyController
0 W( f# r0 y* Z6 [9 K! V   Win32_FloppyDrive) ]: R, h- Q! U$ x" l8 T
  Win32_HeatPipe2 q; _, k3 H5 Y' C
  Win32_IDEController6 M* E. g2 c" B" g( p! }
  Win32_InfraredDevice8 u( k! J' A, O8 F/ z
  Win32_IRQResource; ?+ ?+ I. e- s4 a1 W5 j. m! }
  Win32_Keyboard
+ ?( ?) Z3 P/ S+ a  O, Q/ c   Win32_MemoryArray5 C7 z+ l' D0 X/ E9 [
  Win32_MemoryDevice
- H) v8 I1 t; b9 j   Win32_MotherboardDevice" V: d  u, O, z
  Win32_NetworkAdapter
( e! Y+ O5 g) n3 Y8 |4 g1 C   Win32_NetworkAdapterConfiguration: b. t4 A2 H* m: i
  Win32_OnBoardDevice7 s, Y+ n. w( U
  Win32_ParallelPort
* N, K7 g9 A' X4 c. N: u   Win32_PCMCIAController
' r; E9 ?& F& O% \# B4 M, }   Win32_PhysicalMemory" x1 _( N& g, ^5 x# F- K# g
  Win32_PhysicalMemoryArray
( ]6 t% O2 h5 x/ m) Z   Win32_PnPEntity
- X- o" l. P' n, F) J2 x   Win32_PointingDevice
: u0 h& z( C* t   Win32_PortableBattery
$ v% `- v8 P8 F" D* }" @9 W- d/ N% K   Win32_PortConnector
2 I4 s- h, V4 f' [$ M" [   Win32_PortResource9 k# i: P% a. B3 M; a8 u
  Win32_POTSModem. s$ g$ U1 N) b% `4 l
  Win32_PowerManagementEvent1 p: f* h/ Y7 k7 q+ b
  Win32_Printer# `- Z+ s- a3 `  ^$ T4 Y! h
  Win32_PrinterConfiguration0 }) W. `9 o" v7 g) Z
  Win32_PrintJob
" P) B+ t% {/ d$ d( I$ O+ r   Win32_Processor/ P4 g  Q1 g1 L, ^9 f9 s5 z$ C
  Win32_Refrigeration+ q8 T" g  }- b9 E( G  K* H
  Win32_SerialPort
* _7 [* _- U4 V5 b) X& a   Win32_SerialPortConfiguration9 v2 F1 c/ N; L& I0 n* \0 w
  Win32_SMBIOSMemory
5 y6 w" W0 A  Z1 }) i   Win32_SoundDevice) t9 ]$ ~4 U4 |5 O' m4 x/ Z
  Win32_SystemEnclosure
. W/ h% s$ g1 l) S1 d7 _   Win32_SystemMemoryResource
9 X$ ?4 e9 s) z& x" r4 U   Win32_SystemSlot8 S7 _  d; F) Y
  Win32_TapeDrive5 g/ Y1 `: x$ ]. T) I
  Win32_TemperatureProbe+ ]4 v0 Z" V: G* [0 ?
  Win32_UninterruptiblePowerSupply* e' O" g9 A4 v5 r9 b5 d2 a
  Win32_USBController* Y8 {& u, q3 i0 q" G
  Win32_VideoConfiguration
* |- F: j9 }9 W6 o# I  G! m0 w* \: b0 |   Win32_VideoController
& K2 p4 `9 K# d( L" \* X   Win32_VoltageProbe& J' C. g0 i; X% k: L$ a$ |5 c1 u2 S, L
* N5 b, U" v) ]% p2 U: {  y
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-17 14:41 , Processed in 0.023584 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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