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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)8 {6 N% A/ Q  t  w9 W, e

% N# p8 d0 X7 B% H4 p: ~
. h3 C' Y& l8 Q! A7 t--------------------------------------------------------------------------------
' ?; T3 F2 e, f, J3 o) PWMI: Windows Management Instrumentation (Windows 管理工具)  `6 o0 T; w. F8 i! r. D) `" ^
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
( M4 x$ _% m' _9 |4 i  M2 G% B   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
4 g* P* n# B+ M6 A   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 3 L( S- a% S% f) o& y. @
2 A! D  l1 `, M& i3 T8 k
--------------------------------------------------------------------------------
5 r1 n9 u6 x2 |4 `2 G  }BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
: I6 p' q0 G6 f4 L7 c1 r0 Q  p' s' f% j0 n9 M2 l7 ?+ R
--------------------------------------------------------------------------------" c* j% F0 h7 F
① 初始化 COM 接口:8 K# ]  H0 {4 a2 N* A
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。3 Z# s- V8 M- Z( T  m: o
  这两个函数在 #include <comdef.h> 里面定义。* M9 o9 u7 i% s) Q5 x
) L: {7 L# J3 g# k1 D* {; G
② 获取访问 WMI 权限:' L) X6 L4 ?$ g$ _; m. F- ~
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);- s4 C1 [" x4 L+ ?2 n6 q
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
! h& t( u3 r6 D- t) d+ p1 n. r+ w
1 \+ |( {7 @: ~/ o③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
, Y6 }) ?6 a/ n) U' z$ Y   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。6 [/ ?' ^) ?9 o5 s
; N! t; h3 q& O0 F3 O
void GetWmiInfo(TStrings *lpList, WideString wsClass)
4 c0 y( h' G+ L{# {  H; z9 {1 I  C0 k
  IWbemLocator *pWbemLocator = NULL;5 |! W/ J  a4 X" h' S
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)- T- E: E1 f3 M  s
  {6 d, \4 h0 u- Q, T
    IWbemServices *pWbemServices = NULL;/ Q& G1 ^. ]! j6 C
    WideString wsNamespace = (L"root\\cimv2");
3 n, D8 g6 j+ D2 y: J     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)  ?' K; [. v% h8 D5 j9 Y3 Q1 _
     {
; O3 j! V! a6 ?  l: ~        IEnumWbemClassObject *pEnumClassObject = NULL;: J. ], Q/ [/ U5 m8 E; h5 n
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
3 }% V3 h) `% Y; z* i5 s' o2 A' [        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)" \* ^( l, J7 |+ S0 f6 Q8 P) `
        {
1 Z* t: K# j" S0 v           IWbemClassObject *pClassObject = NULL;
8 \& ]2 T/ X- m! y; N$ u           ULONG uCount = 1, uReturned;5 T  n# U% K3 k' C" O6 O+ h, W
          if(pEnumClassObject->Reset() == S_OK)
5 ]+ \& Q, U. E$ o            {
" h2 u3 W% ]4 ^              int iEnumIdx = 0;5 ^# `1 h2 s/ d' z0 l
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
7 U' S8 w/ E+ _  X% o; ^; [! Y               {
/ o+ x! F. {+ Y9 j% I) s                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");3 N2 b# r1 R2 E) k8 J  w* q% r

9 p9 }/ d" U) K0 \/ F                 SAFEARRAY *pvNames = NULL;. \# v8 h" N. j! W
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)+ s. N% a: T' C4 f  K* p* V* `
                 {
2 q% L/ I- h( [- q' _                    long vbl, vbu;' Q1 }; X& C5 _8 H9 I* E
                   SafeArrayGetLBound(pvNames, 1, &vbl);
5 j: |. G) H! A, E                    SafeArrayGetUBound(pvNames, 1, &vbu);
# B* O8 F* O# n" b2 P                    for(long idx=vbl; idx<=vbu; idx++)
' I4 D: ?# N4 X2 g. F                     {1 T* W  c: r' g6 I/ r" A- B( Q
                      long aidx = idx;
! b  V5 j2 _! A8 {                       wchar_t *wsName = 0;1 R9 B5 q9 U0 Q% s
                      VARIANT vValue;" B: D* I: T* F1 t8 j; _
                      VariantInit(&vValue);( `& Z9 f! A/ ^6 q) a
                      SafeArrayGetElement(pvNames, &aidx, &wsName);$ J3 ]5 e& U) v( x( J( t& {6 z

6 k( ?4 o8 V5 B, a% S# ~1 t                       BSTR bs = SysAllocString(wsName);
2 g8 T4 |5 ]  N3 _1 z/ R& r5 z                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);. b% p% O# d5 U# c
                      SysFreeString(bs);' U& s9 P. H* l5 ^& ~  J3 Q/ q# o: q

+ I; H8 v- q) g1 ?0 m- }- n                       if(hRes == S_OK)8 J! ]" Q' N; ?3 ~2 _
                       {
4 ]  E" U, f% l2 Z                          AnsiString s;! l) T! O; d. D7 [# d  R
                         Variant v = *(Variant*)&vValue;
* W& X8 Y2 I0 I" C* D/ b" l                          if(v.IsArray())$ ^  E! A- C+ f
                          {2 k* I4 I( v* b9 M# P& C
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
+ v$ o- U6 t% p' |  @* l5 j$ f/ d2 H                              {
: O6 ?7 Z, e9 ?! Z                                Variant a = v.GetElement(i);* l+ E1 w! v$ m. [4 q
                               if(!s.IsEmpty())# N& Y" h# Q0 L0 N2 w8 b1 {
                                 s+=", ";
+ a. j' G( A" Z. p                                s+=VarToStr(a);
) v. {5 v' z6 W+ K                              }
; R5 i' A/ T# s4 d# ]6 N# D                           }* @+ P" m% A+ o+ D2 J* L& C/ [6 f
                         else
8 G0 D$ b$ i2 e* y                           {
) H, v3 l3 y- z2 X/ V                             s = VarToStr(v);
  P8 _* H/ h% [                           }' n: N" x  M0 T$ X; ^) O
                         lpList->Add(AnsiString(wsName)+"="+s);
# `. v& L$ A# E- N9 l* D                        }
, l. \- J* y# e( L6 N( q1 G5 L9 I, O( w: f. p# w0 Z
                      VariantClear(&vValue);
5 }% ^: \- U5 M, U$ j! ]3 [                       SysFreeString(wsName);
$ k/ ~5 _8 w/ A0 ]2 T+ j+ U8 C                     }! x8 K& _" G+ _
                 }
" D) P% K& G, `                 if(pvNames)SafeArrayDestroy(pvNames);; J7 }# W6 A; Z# g$ u+ `
                iEnumIdx++;
/ D' x6 @; y8 ]% y4 ?! K9 G: p; M0 f               }
2 N7 ?* {4 o( P% Q; h            }! b7 M5 ]8 C& M/ U; E" W# ~5 S
          if(pClassObject)pClassObject->Release();9 B5 f- ~1 `' d' J+ l9 P
        }
- P, }0 f3 }$ }9 C7 L# Q        if(pEnumClassObject)pEnumClassObject->Release();0 D2 H& a. M2 \; e, Q( F
     }
) C+ S/ D4 e3 g$ Z     if(pWbemServices)pWbemServices->Release();( T- C6 N, J* r& Q5 o7 p
  }
* a- O. T4 M- w  if(pWbemLocator)pWbemLocator->Release();
1 o* E/ x9 z6 j/ }5 l2 g; |/ w}2 x' V9 R' _# E- j4 G
//---------------------------------------------------------------------------
" h: a4 e& f6 t/ |/ V: i/ g) l8 p# f- ]
// 通过 WIN32_bios 获取 BIOS 信息:6 U  B) O+ o3 u5 O+ A/ ~# H
void __fastcall TForm1::Button1Click(TObject *Sender)
$ K$ G0 m3 `7 G+ |{9 ]+ _' G4 {5 F/ u( }4 Q- O
   Memo1->Lines->Add("================== [WIN32_bios] =================");1 L. O, b0 n6 W4 m
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
; m/ P( r; V* i* x* b    Memo1->Lines->Add("");" Y" @9 N/ U% S  ]' B" F* x! ~
}' f; z& {/ p& l

) J3 X+ E# l  k: M( X7 i+ C$ n) ~0 c2 {. B# n--------------------------------------------------------------------------------
8 ~, ?  d- b* w% C. q  k/ N6 e* k
0 ?$ e# R3 m$ `9 n) \. F9 n/ K* YWMI 可以访问的信息类型有:
3 l$ Q; |+ L1 u% ?   Win32_1394Controller; x' B5 K1 {: a( w8 V, \4 G
  Win32_BaseBoard) Y( @3 K' G+ T* q0 x% x! O- S% [
  Win32_Battery  e9 J; _# Z: ]* Z# S6 ?
  Win32_BIOS0 c, u, ^, E; R# {* }; d" e
  Win32_Bus
+ C2 T0 _' s: z% X/ C4 Y' p0 u$ P   Win32_CacheMemory
: \" @0 u5 L$ A$ o1 i   Win32_CDROMDrive8 G# f! ~+ g( e2 z7 i
  Win32_CurrentProbe6 B, f2 `+ q1 B$ M: S" j
  Win32_DesktopMonitor
5 Y& R2 h( G% K6 e- ?) j) Q   Win32_DeviceMemoryAddress- g4 n; C1 o$ |, \+ @; z& g/ o- [
  Win32_DiskDrive
# E' I& N- Y* A- ?   Win32_DisplayConfiguration! {! O8 }+ w7 n: i- I1 E3 j& ?9 |
  Win32_DisplayControllerConfiguration
! P6 I% i; G0 K7 n, f8 f  J   Win32_DMAChannel  f6 E/ k7 N4 w  ]6 p1 }5 Y% ^
  Win32_Fan
' A8 ^4 O4 a1 I" E7 g7 {, k   Win32_FloppyController
& X% P( Z, {4 A   Win32_FloppyDrive- ~  @8 Z$ ?0 x3 _
  Win32_HeatPipe
3 Q4 P; Q: i% x3 \' {! m2 b+ r* I: o! h   Win32_IDEController
: a' h7 F; R9 d: C   Win32_InfraredDevice
* c6 X8 a( D3 g& l, k. j6 k   Win32_IRQResource8 d) |& k& o; m, ^3 S' P2 R
  Win32_Keyboard
1 |# v% `8 }7 h   Win32_MemoryArray
$ H1 M8 H6 E" c5 B: e6 Q1 M9 b7 E   Win32_MemoryDevice$ {1 F- B5 \5 N5 P3 y& E
  Win32_MotherboardDevice
, o" M: G& m& M$ H1 L   Win32_NetworkAdapter) O; {: ^* m2 S
  Win32_NetworkAdapterConfiguration
7 P+ O( }+ n3 N8 E( p3 z6 m/ \5 ?   Win32_OnBoardDevice
! p9 K1 ]) H" y6 d( o   Win32_ParallelPort- k. C5 |2 c( [7 X5 k
  Win32_PCMCIAController/ j" ^8 j  G2 j2 p" b
  Win32_PhysicalMemory0 \# w  V) U, v+ E
  Win32_PhysicalMemoryArray
1 J2 J  g# O# n4 v4 K$ G; m   Win32_PnPEntity
( F( v  A' n+ K5 a/ B   Win32_PointingDevice
6 d3 r1 N- u: u" B# f# ?   Win32_PortableBattery- W# x6 Q6 x( z  k
  Win32_PortConnector
4 s; z- H- ^* |9 f   Win32_PortResource3 ?/ m' `+ a6 B
  Win32_POTSModem/ s5 G+ H" j0 D# Z; t
  Win32_PowerManagementEvent
6 }3 ^! \$ f4 R, Q   Win32_Printer6 S4 X0 G4 U  k
  Win32_PrinterConfiguration: u# y6 [- J* }# [
  Win32_PrintJob  F) `* l4 w* L% n6 I
  Win32_Processor
* v) o: j/ f+ H. Z. i   Win32_Refrigeration+ B" Y. s  `- ]8 X* |* l, v5 A
  Win32_SerialPort+ I3 d2 s; ^+ H3 W, K  i
  Win32_SerialPortConfiguration
/ ~- V: c, g4 a2 E: C3 B) k   Win32_SMBIOSMemory
% K1 w5 \* q% m2 v% P; j" |   Win32_SoundDevice
- u6 {; x% ]1 L! O0 I  `5 W: t" A   Win32_SystemEnclosure; P9 V0 G1 l' h
  Win32_SystemMemoryResource
& d( E/ ?2 a8 u: F" C0 T   Win32_SystemSlot) s7 ]+ T% f) K* @" O/ v
  Win32_TapeDrive
0 w0 G) L9 ^) u/ H* a   Win32_TemperatureProbe8 T" S1 o5 X- A
  Win32_UninterruptiblePowerSupply* u7 Z: ^0 m  H
  Win32_USBController
) E$ u0 H& `7 o9 r   Win32_VideoConfiguration0 q2 c; t, U9 u2 Y! |; D7 I9 W
  Win32_VideoController6 g# y3 [+ t: v" I+ o  Z6 }; ^  h
  Win32_VoltageProbe
1 j6 s$ P. Z0 t0 {/ m+ ]2 d" r/ U3 W3 r- E1 C3 Y" j( I; Q
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-27 23:38 , Processed in 0.019989 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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