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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)- g3 D& v1 j. E$ M/ j8 B
- T+ u& n+ S8 s: c* [9 u- ^1 c
& X; W- d1 I) |: O1 i
--------------------------------------------------------------------------------
% G- m7 ]) V1 C$ p5 N$ r% `; eWMI: Windows Management Instrumentation (Windows 管理工具)
# J) j* s( T/ O6 H   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
6 j2 y6 \. X  I2 T2 G   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
! q% z  r4 I9 U& j  a& r: F5 M   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
& H% E+ c7 ?6 y6 ]& X
* x, }# `$ i9 O+ H- @--------------------------------------------------------------------------------
* n: Z: ~5 ?& n7 r: iBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面$ ^& D1 I9 z. i# q% E1 [
* l/ e, {$ d& |5 r2 h3 {
--------------------------------------------------------------------------------
  ~$ N+ i8 g, _* W4 i① 初始化 COM 接口:
+ n3 n  W5 ^/ w6 ?6 V5 o! O; A   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。- d' R) c- Q0 `3 v$ [& o4 o* Z2 I( ^
  这两个函数在 #include <comdef.h> 里面定义。* ?9 |8 `. ~/ N9 e( @
, c( D; K+ U' @8 L: Z8 y7 j2 u. c! G( I
② 获取访问 WMI 权限:! |# d! O0 T2 u" O
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);" x% k! |$ p, s, Z; X3 B
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
( ~+ g% r1 L5 k/ m1 T6 @$ v# c* Q! c* W  Q' B
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
$ N( x6 o9 V1 z* B   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。) i; e2 K7 I9 g4 {2 @

) z0 f2 n8 J4 I9 M7 }void GetWmiInfo(TStrings *lpList, WideString wsClass)8 w4 J+ k# \! s4 p4 s
{
9 _3 _4 I: K% \6 }/ u( r: g/ X  IWbemLocator *pWbemLocator = NULL;
+ M9 J/ }$ q! L' r6 c  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
) R! C) s4 M3 }   {# |- ~# E1 \0 I. V' a4 C; c5 r+ Y% j
    IWbemServices *pWbemServices = NULL;! t, h( Q4 G( T4 j) }
    WideString wsNamespace = (L"root\\cimv2");  M! V5 Z# E' [. Y3 r, J, P
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
( q0 o1 D: n# e& B# [( V4 e& C* j      {
; J' k7 o. q$ Z        IEnumWbemClassObject *pEnumClassObject = NULL;
% B" F) c( \+ e8 ?        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;& e# d: Y( ^6 K% P
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)4 W4 X7 ^! W. d! c: {
        {
0 P2 ~$ W/ h+ }           IWbemClassObject *pClassObject = NULL;
8 t& [: D6 p3 b: X           ULONG uCount = 1, uReturned;
7 i% S3 d" x- v1 C" ~           if(pEnumClassObject->Reset() == S_OK)' O3 W0 L: c2 j4 Y1 V3 _
           {! a( s! W! H3 r
             int iEnumIdx = 0;, q1 {1 [7 x9 Z: z
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)% d! N4 {2 P3 a$ j! g, H
              {4 g; u0 k0 _; o8 g, m1 q$ o
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");7 t2 V( L; m: D$ \+ \% J, `) U. u
- D& B4 T1 D( E
                SAFEARRAY *pvNames = NULL;3 J' W1 a7 s" n4 n( e: f: J
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)1 U0 e) @* d: i8 {- `
                 {; ~: h* l4 U# }% Q+ v7 S; g$ ]4 m! e
                   long vbl, vbu;# f# {; V8 y" v) E  d& a
                   SafeArrayGetLBound(pvNames, 1, &vbl);
, {4 t; Q; b% d- z                    SafeArrayGetUBound(pvNames, 1, &vbu);
  y. e+ H6 h# P* |8 l2 n                    for(long idx=vbl; idx<=vbu; idx++)( ^2 c. b+ E- K4 P  b0 a( l
                    {
5 u0 }! P+ C  f2 S  |                       long aidx = idx;
) r$ Y5 [( ^/ s) I& S  ?                       wchar_t *wsName = 0;, G7 z0 O( C2 X6 d
                      VARIANT vValue;5 c& U/ ~7 z; p8 \5 ]& Y
                      VariantInit(&vValue);/ M* v  ?  S2 T( L1 {3 ]3 O
                      SafeArrayGetElement(pvNames, &aidx, &wsName);) a- C; Z. O- X

  _- c9 I: F6 t! W                       BSTR bs = SysAllocString(wsName);3 O9 b4 `4 F* b2 {" [
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);& k2 x9 O$ o2 I: p
                      SysFreeString(bs);
+ x4 u/ ^, m+ j7 y: S
  w- u  A3 S, k+ [/ e# q* r) H                       if(hRes == S_OK)4 ?- F8 B  T+ \. F/ `
                       {$ o5 |& m4 W- @9 y
                         AnsiString s;
% I& ?" j0 d8 ~# r( N1 J% w, i                          Variant v = *(Variant*)&vValue;
$ ]0 [2 j; E- O+ V/ x+ |, p                          if(v.IsArray())% v" M9 p9 j  |/ H
                          {3 I4 f) Q% B7 H# D0 L
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++), b+ a! v, C. c
                             {5 M9 I; T, |2 d; [: _. f+ \9 L
                               Variant a = v.GetElement(i);3 z( f, E7 ?( }. k; E, g  z# E
                               if(!s.IsEmpty())
0 ?: a3 Y; j, j3 I$ J                                  s+=", ";
  R/ m$ A- r3 R/ X; x/ s" O                                s+=VarToStr(a);
" Z1 _" v2 ?; A3 ?& S7 J                              }* m* H+ V5 l4 v2 C/ l
                          }
& f0 H/ f9 p& w3 M                          else! @% B0 Y7 k+ J: x% }% F! z
                          {
6 q' q6 b9 I+ Y( I9 V9 Q7 X) C! g                             s = VarToStr(v);
: L( Q0 _+ Q2 M/ z# N1 o                           }
9 H7 a& a! N) G1 G& h6 q                          lpList->Add(AnsiString(wsName)+"="+s);
& b; W- X+ X; D! o* }5 n3 o                        }% J2 }, D, W! d% Y& x& C2 ^5 w; U

% Z2 N1 l( f$ F  ^* m                       VariantClear(&vValue);
: x% \; G. f) u                       SysFreeString(wsName);
& m# u" G$ o2 ^9 H) `% k5 n3 Z                     }
; d/ _2 r# Z+ U+ V* g                  }
! R0 P& X0 x: B1 a9 _" k                 if(pvNames)SafeArrayDestroy(pvNames);, @' a3 s/ k  q* s* T
                iEnumIdx++;+ k* t) g0 Y' o! v$ y; [1 J
              }/ j! r/ q$ X! _1 X, q7 ?7 W8 y
           }) Z5 q6 R( X, ^% q1 _  W
          if(pClassObject)pClassObject->Release();
1 [' d" ~$ {+ B+ k2 k; N4 D         }9 ~& B+ \& [% ~! l1 N( j
       if(pEnumClassObject)pEnumClassObject->Release();7 H9 v! D1 _, b8 `# g- h. Q7 z
     }
- U7 c# q' R3 C# D  y1 ]4 V     if(pWbemServices)pWbemServices->Release();
1 l$ D( P  D( ?6 L" y  `  o6 S   }
8 u3 M# \& U1 ^6 T; s  if(pWbemLocator)pWbemLocator->Release();
" D2 l9 g6 S/ y# `9 |}
& J( [7 F- H4 J//---------------------------------------------------------------------------
, |2 D3 j6 h# F5 U' p3 T# H7 D  y2 L! `
// 通过 WIN32_bios 获取 BIOS 信息:
9 P% K5 t1 h" zvoid __fastcall TForm1::Button1Click(TObject *Sender)
5 W6 @1 j( P6 U3 j* l# i{' O, N+ s; Y' i, y6 R3 r$ W
   Memo1->Lines->Add("================== [WIN32_bios] =================");, d* r" [) Q' T" n5 d. w; P. W
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
& D0 o9 B/ F: a5 G8 G- `; B7 b0 x/ `    Memo1->Lines->Add("");6 \: |& M) Y- G: s1 h# e# E/ G( R
}$ A0 K, n' i2 k  ]% ^; G

& S, J( h. e+ |) K7 c--------------------------------------------------------------------------------
: c9 H5 J( J5 w. p) `
0 R: N6 N2 T, s' r' X2 W- ZWMI 可以访问的信息类型有:$ U* J9 H3 [# W/ F. R
  Win32_1394Controller
: ^0 e5 w, I2 ]$ ?3 \$ Z' N* z   Win32_BaseBoard
0 M$ K. J' |8 G, @9 h8 C   Win32_Battery
0 d5 t0 {5 r6 z7 g+ A5 D/ ^+ N   Win32_BIOS
7 h5 Z5 L1 V0 X  B   Win32_Bus8 A' }& A* \8 q# [+ ]3 u
  Win32_CacheMemory
3 Q  Q) e. Z8 _   Win32_CDROMDrive& i+ M/ w- d% F1 T2 Y& C
  Win32_CurrentProbe" f9 J! g9 S# t8 o
  Win32_DesktopMonitor
& m% w4 N' q0 u! A8 u2 M( t   Win32_DeviceMemoryAddress
3 o* E. I8 N4 C2 ]" ]$ @/ m   Win32_DiskDrive" b9 z' e8 w8 b6 b1 ], j4 L
  Win32_DisplayConfiguration
9 G/ h! a! y$ e. D; ?' F$ D- D, _; `- f+ M   Win32_DisplayControllerConfiguration
7 F# d/ C5 i# D. H1 u   Win32_DMAChannel& d8 x  e3 y: R# ?6 ?4 ?! {  z) l
  Win32_Fan
1 h$ U5 R: d/ ~+ ~   Win32_FloppyController3 N5 d% \) I5 F9 _
  Win32_FloppyDrive( i! m0 M3 `9 j
  Win32_HeatPipe1 @+ X% w0 z1 c0 u4 ^7 N
  Win32_IDEController
' g9 P% E" o3 [$ h; [+ F   Win32_InfraredDevice
2 s" v  Z3 R  x! q   Win32_IRQResource2 V8 b) O% D# Z/ T* S" V# J
  Win32_Keyboard' f4 H- {7 p, [# F
  Win32_MemoryArray
& y1 y; n$ H3 }: o  D2 p   Win32_MemoryDevice' a( C$ p# G% M1 E- {$ ~+ v
  Win32_MotherboardDevice1 d- b2 V, q# u: b- F1 ]! t+ ~
  Win32_NetworkAdapter. S& q) N% ]3 j& v, U
  Win32_NetworkAdapterConfiguration) e4 Q8 m9 A! U; k% }
  Win32_OnBoardDevice
3 c% |  R& E7 i% k   Win32_ParallelPort/ I/ }: i; N# Q
  Win32_PCMCIAController
: S( }! b9 h# T# p* `& r   Win32_PhysicalMemory  l5 ?3 i2 @8 Q% P" {2 K
  Win32_PhysicalMemoryArray, ~7 ^( `) T: M! {& ~) v7 h
  Win32_PnPEntity0 s3 ]! H* C: G" R0 @5 Z3 l/ o$ R! _
  Win32_PointingDevice) L* i1 ]  h1 M1 k0 a1 v
  Win32_PortableBattery+ H1 @/ F+ U$ S6 U3 a
  Win32_PortConnector
& w% T6 P7 T( B+ `$ C2 t/ @7 h$ B   Win32_PortResource: g# U2 b! T7 f4 W
  Win32_POTSModem
5 g6 l5 P, \/ W, H9 n   Win32_PowerManagementEvent, o# A5 R' k/ B  ], Z+ l& z8 b$ U
  Win32_Printer
# G8 l3 d1 M( w$ s   Win32_PrinterConfiguration: T( D/ L0 k' A( y
  Win32_PrintJob
5 k) K5 P& ~5 K   Win32_Processor
% y- C6 b6 S2 v   Win32_Refrigeration
. I* b/ x! ~- v   Win32_SerialPort
4 s7 h6 C8 N6 i5 n$ {7 ?   Win32_SerialPortConfiguration
! e7 T# B4 h1 E/ p   Win32_SMBIOSMemory
  Q# c6 r+ @$ ]   Win32_SoundDevice* V2 B. P# H  f+ l
  Win32_SystemEnclosure
+ q3 ]- K4 a% ~   Win32_SystemMemoryResource3 L/ D' }. r/ I( u
  Win32_SystemSlot! j$ ~" T% H" }2 u. k/ [
  Win32_TapeDrive, A% `) b" O. x9 G! ~; t9 ?7 `. T3 L
  Win32_TemperatureProbe
1 J5 N3 u& u% ~  J# q. e5 `   Win32_UninterruptiblePowerSupply
2 s$ G7 \' b  @- ?   Win32_USBController
* J! f; D# @: j/ X4 [0 Q   Win32_VideoConfiguration! W" M* c/ S* _$ r% ], `3 ~
  Win32_VideoController) m0 M/ h3 k' U
  Win32_VoltageProbe% V# e" R+ L0 z- E% G1 Q

# L* h; J1 N$ F( q% b以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:46 , Processed in 0.018253 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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