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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)# o$ m' X2 F" ]5 E6 O$ Y# k

( m# T" [! K# P: |" a# F7 h- m& v8 ^" g
--------------------------------------------------------------------------------  K  L! z/ n) U: L
WMI: Windows Management Instrumentation (Windows 管理工具)
! f! d! n+ \: y! `   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
# m& p  K8 l- Z7 [* U' }( z* ~  |   利用这个工具可以管理本地或客户端系统中几乎所有的信息。: ]! @1 T  Y. k# u. `& D2 \
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
0 T" p. Y& C4 d9 j# e5 h5 T1 \+ V3 Y# }
--------------------------------------------------------------------------------
) E8 J& l/ s9 X  K9 @1 c% bBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
! r* B! P0 n' e' `6 G. Z/ p, C/ X5 N, R* m6 n% O
--------------------------------------------------------------------------------7 w) [& w2 ~* ^  W7 z
① 初始化 COM 接口:, \. K/ M0 J- s# O. `% m
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。* k5 w6 ?7 X* F. n7 _; N
  这两个函数在 #include <comdef.h> 里面定义。
2 V, e! P" z7 G" C) _) P% D( z
- b* G4 s6 \/ {0 o# ^& r* x5 ~② 获取访问 WMI 权限:. C. ]/ B4 ]- I; M/ G
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);4 v. |' k+ x6 s7 q7 u
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
; n' b: E8 s& Y6 _' k1 r6 d
- e. O3 Y3 u( _, p4 R4 G4 _! N  F# B③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:% g) _' q* R9 }) h$ [
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
2 T; \1 G4 r1 g* S+ ]0 F* o
" P7 v! ?' @$ Q$ Cvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
: q3 T! S/ T! u, s{' [3 P1 E8 E& E6 r1 d3 e. d
  IWbemLocator *pWbemLocator = NULL;
: r5 q0 X5 e4 R* q; ?) `  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
$ N+ g' Y- ~' Y: F   {$ l; s' E& N& {& L* e: |9 r9 m
    IWbemServices *pWbemServices = NULL;8 h" w) e; s! V, B  J
    WideString wsNamespace = (L"root\\cimv2");
/ B( C1 L6 P8 r     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
$ N  r/ F, e. A- a  `5 l) }% x      {" V: b/ d- [& z/ ^
       IEnumWbemClassObject *pEnumClassObject = NULL;
4 w& p' n( j' E7 K/ B        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;- D5 n2 Q$ P5 U8 Y! W+ I# |$ y
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
7 c  J1 O* }+ K4 g         {
% l: C6 O  I3 F& U9 p0 c) P2 ]- }           IWbemClassObject *pClassObject = NULL;
$ |' O$ t* {& q( W           ULONG uCount = 1, uReturned;
  \$ E2 C) g5 D6 f# V" |' P- D           if(pEnumClassObject->Reset() == S_OK)
* J- q7 t5 J( T0 W" V            {! K, W* {7 A: C+ V
             int iEnumIdx = 0;
; `" D3 z8 q/ G. ]0 C  F              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
- {9 v( j' x0 a( j: E1 Q               {
  P& W- M1 k) |* H                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
9 o; c* U6 i, o; _/ v0 F% \9 F$ ^3 }0 o: c
                SAFEARRAY *pvNames = NULL;; M+ h" p7 I, ^% k7 o% W; ^5 Y8 z, n) i
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)  g5 H5 B3 x+ ~1 P& ]0 j" K/ v- D
                 {: l: H$ j- o5 Y7 }) i3 K; P* v
                   long vbl, vbu;
! P. k3 Z4 P8 k3 u                    SafeArrayGetLBound(pvNames, 1, &vbl);
# F. F- y+ Q9 Q1 p$ n, }                    SafeArrayGetUBound(pvNames, 1, &vbu);
1 \0 t% ~: U) k9 k/ v" @+ h0 V9 f. r                    for(long idx=vbl; idx<=vbu; idx++)
- l9 d. C: l. L. f5 k% Z( j3 [. z- [                     {
3 |1 Q% U# g$ z, h, P                       long aidx = idx;# F# i; b  x: C( S6 `) G
                      wchar_t *wsName = 0;, p$ H7 X2 B* R4 y2 |
                      VARIANT vValue;
; t" X. X8 q0 R                       VariantInit(&vValue);8 B) v( \. ]$ Y1 \1 i' a
                      SafeArrayGetElement(pvNames, &aidx, &wsName);  z$ C% N$ o" F+ R  t& Z
' A6 S# T8 j& F9 v2 p
                      BSTR bs = SysAllocString(wsName);
, L; ^* V0 W5 n7 i# G: N. _                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
+ N9 I3 w/ E; i% E8 i                       SysFreeString(bs);  R2 H9 T: H. N6 R* n, O
0 \- c% n0 A' w6 e8 S
                      if(hRes == S_OK)
( v! V, N7 F4 ~6 d) h/ @                        {
% M/ z  s! r- Y1 Y                          AnsiString s;& [# o8 Y, b; l2 u5 }
                         Variant v = *(Variant*)&vValue;, E! w9 A% x! a& j2 F) F( \
                         if(v.IsArray())
' o1 o( j  c' {6 Q# X6 t5 P                           {" |( K7 H& C& d  C5 _3 T
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)+ z7 Y2 B% s/ Z: S3 s
                             {/ Q' S% G5 d5 r0 t. A5 `6 U
                               Variant a = v.GetElement(i);
: o7 d+ ~# r( P/ S                                if(!s.IsEmpty())
' y# _7 Y  A, l( X5 Q                                  s+=", ";
$ K: {& X) O# x7 c. p+ t" w. d  K                                s+=VarToStr(a);
% ~) I/ A! u3 O1 i                              }
, e/ v6 }6 |  `) q                           }% x1 r- Z/ W- q* n
                         else
7 w* |; L6 Y+ D4 P                           {# A8 o- s1 R6 ]7 a! j* W5 I$ ^
                            s = VarToStr(v);
. n5 v, B8 u4 S. G; F& u, ?                           }
2 O- x/ m# k7 R                          lpList->Add(AnsiString(wsName)+"="+s);% [9 E% c, O1 ^3 q; Z
                       }
* P0 K- M) H  t5 q$ k, C+ R! _9 s& l$ v6 ^9 n
                      VariantClear(&vValue);
2 U  M; T4 y4 V4 o5 C                       SysFreeString(wsName);% K- _6 L& ~$ c" x" h3 }! r
                    }9 `) }0 {0 X* k
                 }6 F' y1 O5 c- Z) D- U
                if(pvNames)SafeArrayDestroy(pvNames);2 P0 u) `: m. _0 E8 ]' m2 C
                iEnumIdx++;1 R7 [: {& F  r1 W
              }2 V. a3 P; H( {9 V
           }
6 C) u5 k7 W. Q2 f4 w' |           if(pClassObject)pClassObject->Release();
3 `' h3 x. F3 d7 d5 X$ D: B" \         }
$ ?7 P! o1 t% J        if(pEnumClassObject)pEnumClassObject->Release();
  A6 D4 A6 R1 D" J' F5 z  u      }
- J9 ~; }4 w0 h( v6 Q- m     if(pWbemServices)pWbemServices->Release();; w* e4 P$ w' y+ x
  }4 L7 y4 O9 o; v6 n
  if(pWbemLocator)pWbemLocator->Release();8 p$ }, @. m% z6 V- W  m2 V
}
4 J, e/ _6 V- E  r/ t7 L. n0 W0 G//---------------------------------------------------------------------------2 U) g% ?% n$ N4 Z- J
1 U& u* q2 J% P$ q" R! f4 k8 _9 O' H2 O
// 通过 WIN32_bios 获取 BIOS 信息:
& t0 x4 E/ d. E! @& ?void __fastcall TForm1::Button1Click(TObject *Sender)
4 `; H4 k/ N% ]{% x. u& ]& G! W6 ^
   Memo1->Lines->Add("================== [WIN32_bios] =================");
+ S# E, ^+ X% r; Y7 T: N' n    GetWmiInfo(Memo1->Lines, "WIN32_bios");' F6 L) N/ {  Z% H" Z* _4 g3 B! r7 y
   Memo1->Lines->Add("");: s  x* ~4 m$ p0 u  v7 F. o
}* [7 ]  j7 S- n; F% }) G

: m, s% p3 J( X; l2 Y4 u9 e& n+ I9 W--------------------------------------------------------------------------------
, U  b# U4 M4 ?2 R0 Q) g6 B( @+ p9 _5 ~  t" c
WMI 可以访问的信息类型有:
+ \! P# u( d7 ^5 H6 f, Y& i   Win32_1394Controller1 p5 H8 \  I( B
  Win32_BaseBoard# l. I; G9 B/ J/ n. _% _! \, ~
  Win32_Battery2 I+ a- t7 ^( m% S2 Z, H1 T
  Win32_BIOS
5 k7 N9 E* J" i% t' l  P   Win32_Bus
' Z# \) B. f6 F* V: O& h6 o+ ?6 i9 n   Win32_CacheMemory4 K4 X; U. X# U9 C) b' {
  Win32_CDROMDrive0 @1 v- X4 g+ j. S( S6 _
  Win32_CurrentProbe
0 w- V) s2 a: o; ]3 O   Win32_DesktopMonitor2 S' R3 C1 I* z$ K( p9 m
  Win32_DeviceMemoryAddress6 j9 u4 m4 O6 n+ _
  Win32_DiskDrive
+ e) k0 y' z# V7 B2 p6 Y   Win32_DisplayConfiguration
( y7 ]  B$ U2 o0 |7 o7 W7 H& s   Win32_DisplayControllerConfiguration4 T- p0 F2 g2 d4 R
  Win32_DMAChannel( j/ D, Q9 w  A, s- U3 x+ Y3 G/ h
  Win32_Fan
+ B0 A- `& X  O+ k$ l# p   Win32_FloppyController
# p1 ~+ X# Q4 L9 y$ x+ V2 M6 Z   Win32_FloppyDrive
+ A& c6 q4 g/ E7 l$ I" b   Win32_HeatPipe# g0 z, y. W: V$ U) C6 d1 N9 C
  Win32_IDEController
* }0 V* Q3 p  b7 v  _. x   Win32_InfraredDevice
! d1 |; r' z5 G9 d6 |5 W   Win32_IRQResource5 l, h$ Q" N5 @/ E4 F
  Win32_Keyboard) b0 A; }; `$ I2 U1 S7 V
  Win32_MemoryArray
* Y6 Y; I. O$ y6 C5 R. s7 v   Win32_MemoryDevice6 @7 m( ~3 A! v' p! a1 |* @* U
  Win32_MotherboardDevice
# ?5 e  G; v. x' i# R$ G   Win32_NetworkAdapter3 y0 {3 W7 B5 {% S$ q; z
  Win32_NetworkAdapterConfiguration
) G. C0 p5 P7 k, y2 g& L) r   Win32_OnBoardDevice8 C/ n7 b+ Q6 J; H( O8 h
  Win32_ParallelPort
- L' `! n% z$ ?. S$ N1 m8 a, e   Win32_PCMCIAController) _# }: ^% R, j0 m" b
  Win32_PhysicalMemory. D$ u  {% T1 @* f) d
  Win32_PhysicalMemoryArray
; p* s. V- n3 [! _- B   Win32_PnPEntity
9 I) a! i; J; A* ~( Z   Win32_PointingDevice2 K8 @6 [2 @8 S) w/ r
  Win32_PortableBattery# |! W( R; K. H' t: f0 |+ \5 K9 z
  Win32_PortConnector
6 T8 Y# S3 e, H, Y6 ^   Win32_PortResource# m. S" N: T% H
  Win32_POTSModem. l. G) Z( Y7 m1 S& J
  Win32_PowerManagementEvent/ E# d, Y9 h! j; _/ |9 F- D; \, `
  Win32_Printer
+ k4 b8 f7 {( L7 A- h6 ]% u   Win32_PrinterConfiguration) _1 f, [& N9 t: u* e
  Win32_PrintJob# f6 b& X' W9 R4 P1 n0 b) x8 r
  Win32_Processor
3 ?1 `8 u& j0 C0 L/ ]7 Y   Win32_Refrigeration
% M8 `5 v1 w$ ]' \1 k   Win32_SerialPort
) r% i2 w% |. {2 q# s   Win32_SerialPortConfiguration
1 F3 W- o' P7 r5 e# _   Win32_SMBIOSMemory
7 `( P- j; ]  Y( K4 ^   Win32_SoundDevice
; F& n6 i% ^" F2 B+ A4 j, R   Win32_SystemEnclosure
$ [$ i" V" O9 l  q7 x) k   Win32_SystemMemoryResource/ E0 V# {& R% _
  Win32_SystemSlot4 b& T" @7 B- S6 r, T* y7 E* F# S
  Win32_TapeDrive
) `& p3 u+ o# E' G   Win32_TemperatureProbe  P9 d! @  @- t% D4 l9 A# v
  Win32_UninterruptiblePowerSupply# {- l1 y2 m4 P% }) Y
  Win32_USBController
* p& G: ^  X  V   Win32_VideoConfiguration7 |  P* j5 h7 K
  Win32_VideoController
+ w2 l4 T  b) `/ M& ]) y' h   Win32_VoltageProbe7 w9 s+ d$ r: L' C$ k
6 i2 p; T7 T$ p. J9 L
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-11 17:49 , Processed in 0.020367 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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