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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
: {* d, G, [, c0 d; D# m. v
7 Q. X  c3 k2 U+ V4 C9 |9 _
/ o, C" Q" e9 T/ f6 h--------------------------------------------------------------------------------- v* Q3 \1 n9 i
WMI: Windows Management Instrumentation (Windows 管理工具)1 W) O$ Z! `6 ?+ s
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
/ _6 Y9 B+ Z& ^   利用这个工具可以管理本地或客户端系统中几乎所有的信息。" C7 I7 ~9 K: Y3 l. N
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
8 Z, u: B' ?1 U6 |; @( `2 r9 U: ?/ n) K* J
--------------------------------------------------------------------------------
5 s6 S: p" p: @, hBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
4 X8 `9 I* X- _& E2 ]* O& H
$ m7 R% Q  B: I* T% [8 ~--------------------------------------------------------------------------------+ g3 }( y8 D, T3 T) b1 b6 [
① 初始化 COM 接口:' a1 g9 `* \+ y; ~1 J! j
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
, O7 ]* m! F. i3 s/ h   这两个函数在 #include <comdef.h> 里面定义。% t2 |; z* {/ q
" G" s% {0 Y% C8 \9 i( U
② 获取访问 WMI 权限:
& g3 Y, Y# I. E% E' z7 {7 A   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
9 Z) J1 q1 g( [5 U# z1 u2 Q   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
0 H9 @" O( P6 v. ~" i0 o# S& @' x- C
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:6 q, `4 p! G: _! c: ~& \9 [
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
, b9 U1 G% _: _: c" r) L: E' b' C* R
void GetWmiInfo(TStrings *lpList, WideString wsClass)( }' K0 t/ K0 G: u* R/ Y; Z
{
4 D1 T; j$ H$ F3 x  IWbemLocator *pWbemLocator = NULL;
% U$ H2 {0 x) \! ~  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)1 G$ C# L! e2 a0 f
  {% V1 |% H/ u1 s* O( z/ D
    IWbemServices *pWbemServices = NULL;4 w) L% O% i  ~6 ^% L; A2 ^
    WideString wsNamespace = (L"root\\cimv2");
/ Q; }% D! U& G4 L8 m/ v! P! a! l     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)! k- n0 K6 o6 V# b% r( z$ C
     {
/ n6 R  m( n: k/ j+ w+ H$ S& g( w        IEnumWbemClassObject *pEnumClassObject = NULL;
, L: \: c7 ^$ F" f        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
0 k7 A! h* p5 c% G" Y) f4 L5 d) I        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)# V: f0 p% d, i6 Q, m( P
        {$ ]3 X( R; l! {
          IWbemClassObject *pClassObject = NULL;
0 d# }- l' L# c, ]- x0 d, h1 F           ULONG uCount = 1, uReturned;
! ^) t+ T4 ?1 Q) a           if(pEnumClassObject->Reset() == S_OK)/ W. i! _( ^$ {- \1 ]2 M
           {; q1 @  u$ [8 B3 g6 C$ G, _1 @/ n
             int iEnumIdx = 0;. A0 X* i4 e5 a' J& z2 J
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)2 h& D3 N1 f6 Q0 n1 T
              {) N  @2 T6 E9 ]0 {! U! p% o
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");2 A2 L$ o6 ?1 R7 d) Q$ Q

  u( J2 H1 c+ d% [4 w                 SAFEARRAY *pvNames = NULL;
3 t) i& f2 G8 K# I$ P( A                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
' Y7 ]; q6 u1 A5 o0 K8 K. l7 _+ q5 n$ g                  {* p  |6 O. r  @8 w" c7 k3 b
                   long vbl, vbu;$ Z: p7 {2 ~/ V( n% X, A' R: A! \1 o
                   SafeArrayGetLBound(pvNames, 1, &vbl);' D. @. V0 _9 ^' r
                   SafeArrayGetUBound(pvNames, 1, &vbu);
+ Q$ ~- ]1 k4 C0 ]7 w& B' r                    for(long idx=vbl; idx<=vbu; idx++)0 @. R1 |4 k- n- Y  ]& S0 ?
                    {
3 l# q" H: E1 |! z. Q                       long aidx = idx;1 r, E- W( U; W
                      wchar_t *wsName = 0;
. V1 M) Z+ R  R# D, \. C                       VARIANT vValue;" Q+ \/ f# t1 [# r
                      VariantInit(&vValue);" S+ o2 q5 @$ ]
                      SafeArrayGetElement(pvNames, &aidx, &wsName);& k9 c9 U8 U& ]& ]# A/ U
' o  K: X& }- \, K3 E/ g
                      BSTR bs = SysAllocString(wsName);
( V# N1 g; X3 e                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
8 f8 g' x& S% Y                       SysFreeString(bs);
7 b5 h% t0 j7 `0 _
0 w$ T$ n: u& s7 X  Z                       if(hRes == S_OK)9 k, e! ~/ |1 r& o( I. J* s
                       {
1 \6 B0 M6 X6 U. v& k                          AnsiString s;5 I; y" Z# |  N8 }5 ]
                         Variant v = *(Variant*)&vValue;) F9 Z/ g; y# x* d6 O; G7 N9 p
                         if(v.IsArray())
' t0 J, u* H  Q2 R7 [. G                           {) i/ c. w6 j" G9 v
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
- R# g% n& H7 j! J" ?  w  f$ D6 }/ c                              {: R+ I+ ^" W& U0 E1 l3 }
                               Variant a = v.GetElement(i);
9 F+ }3 H: r/ [2 H" R8 H( m                                if(!s.IsEmpty())8 ]. {4 u3 W4 L' p8 V4 `% R, I
                                 s+=", ";4 s5 K5 V0 m1 C: g1 h: Z( k
                               s+=VarToStr(a);
+ Z+ U! W* Y- E% D                              }5 Z+ ~6 L+ r4 Z5 |' w' g6 L5 ^
                          }
( G% l. L0 V6 \$ K7 @                          else% ?6 E) R6 C$ Z! h0 |$ R/ l% Z
                          {
% u( @3 F& b) `" ~5 Y# ]* F                             s = VarToStr(v);. L, e  T  y( n! d$ e: h
                          }8 P6 W2 o0 N+ E6 f5 Q! u
                         lpList->Add(AnsiString(wsName)+"="+s);
, {8 [# S8 {0 h  Q8 U5 i                        }, b" m3 ~: t6 W. Y# p: L8 H
3 W* R! O# |- u# }. P+ J) y% |
                      VariantClear(&vValue);* Z7 j/ K( r0 ]  w1 o* _
                      SysFreeString(wsName);% l$ d2 @( t& e. ]0 K+ p3 l% K
                    }
' n2 h2 o! i, X, x                  }" W. z0 F8 a$ |; A# T
                if(pvNames)SafeArrayDestroy(pvNames);
$ X4 k1 T% n3 e6 t" W                 iEnumIdx++;
- `/ b) H4 ]6 V. J! K- ?; \               }
6 E; ~, C7 q' r/ c" ]) J            }' K0 T5 N, t7 c; u, a8 L
          if(pClassObject)pClassObject->Release();
1 W2 N  R( W1 O% [  I8 V6 x         }0 l. c8 a) ]  n
       if(pEnumClassObject)pEnumClassObject->Release();8 o' C. h( T) D/ I
     }
$ j, K! [: _0 c     if(pWbemServices)pWbemServices->Release();/ i7 a7 C! d9 q9 ~( W! G; E( ^# a9 d
  }
. O1 ]# m- H: b( V: c* O  if(pWbemLocator)pWbemLocator->Release();( N1 S8 m  [8 z
}9 n! P& P* a+ G" W8 m) }
//---------------------------------------------------------------------------
0 L8 c( K$ N+ M9 \' I; ~/ D
# k0 {; |8 `3 K' d// 通过 WIN32_bios 获取 BIOS 信息:( M( A( U/ w  w: b! c! g% M. K
void __fastcall TForm1::Button1Click(TObject *Sender)4 f: s5 a4 V; ?8 D- k
{
% {6 K' V; y2 I    Memo1->Lines->Add("================== [WIN32_bios] =================");
' {1 ~( {( k/ C3 z1 T    GetWmiInfo(Memo1->Lines, "WIN32_bios");1 R; Y4 W6 v- q# f
   Memo1->Lines->Add("");1 N& V+ g$ u4 I6 p
}
8 S4 W, G/ m& M; `- P; F7 |5 J9 f7 y2 K5 N+ ]4 l1 j
--------------------------------------------------------------------------------5 v" n1 i5 H- ~/ l
1 c2 p' C) G7 L- v, h5 P" l8 _$ E3 @
WMI 可以访问的信息类型有:* P$ y( A: l$ j+ h7 w! @& k8 U
  Win32_1394Controller/ {4 |3 ^& S# X. h
  Win32_BaseBoard
' W) K3 n+ K) l   Win32_Battery
% p6 N( K1 h6 m& a0 H' Z   Win32_BIOS3 i; t5 G/ m& Q# q
  Win32_Bus# K8 K( R+ Q2 g1 n$ v  o2 }$ e' ]  Y
  Win32_CacheMemory4 r" T3 a, b5 ~! S! R% |  S7 w
  Win32_CDROMDrive2 H' @* u7 h& b+ s1 b; q2 I+ e7 D
  Win32_CurrentProbe
6 C  s! I- B2 z+ p0 g   Win32_DesktopMonitor- U* Z) k7 S& a  c' z8 Y8 Y6 ~
  Win32_DeviceMemoryAddress- g' i  a' |. n1 e# A$ T
  Win32_DiskDrive  d5 C8 _* P" C8 V/ W8 C
  Win32_DisplayConfiguration$ U( P; ]  o: f! X/ Z: d3 q! Q- b' \
  Win32_DisplayControllerConfiguration
+ t4 N7 K# B( G; o& X! p" \5 t   Win32_DMAChannel
* R7 M7 v4 @: H& a. S# _   Win32_Fan7 I- ]9 \# C# N  ?: P
  Win32_FloppyController
! |: i+ F$ s" @! p6 Y; d   Win32_FloppyDrive
0 E! x; f5 u! x+ B3 v$ R$ j   Win32_HeatPipe
' h( J9 |( Z, p# T   Win32_IDEController8 S+ g+ B$ y* W1 C6 F
  Win32_InfraredDevice
" j+ b5 n% Y# K- m& h9 @9 Z   Win32_IRQResource" w, `' j0 C. M  y0 w3 A
  Win32_Keyboard
* s2 T7 ]$ L1 p  |   Win32_MemoryArray! q8 ~* u- @+ _6 I) x* C1 T/ r
  Win32_MemoryDevice
3 M: G" D$ |! f   Win32_MotherboardDevice
5 {6 Q3 c7 t# c+ W   Win32_NetworkAdapter3 g, q$ P, g) Y
  Win32_NetworkAdapterConfiguration
+ `% _2 f& Q5 e+ G7 w8 R   Win32_OnBoardDevice3 Y' ?( ^$ c& Q/ @
  Win32_ParallelPort( K0 q" t. ^) H4 J1 J1 @' K
  Win32_PCMCIAController- Z$ r5 ^0 Z0 b" y; a0 v. J8 e
  Win32_PhysicalMemory
+ ^/ C7 H# N/ j) p. L: ^- L" q$ e   Win32_PhysicalMemoryArray7 S$ r$ \( E4 Y+ C/ Z; F, M) f0 `
  Win32_PnPEntity  h6 F( t7 `  T/ }8 _, }
  Win32_PointingDevice" E; _: L; [% z  K, E$ }6 g1 a- H) W
  Win32_PortableBattery
# d( Y, G/ I/ f- c5 z  K' n6 K   Win32_PortConnector2 ]+ K$ C# u0 ^. n0 W8 K
  Win32_PortResource
. s1 Q" B. ]" [   Win32_POTSModem
7 e, O+ V* ~. n/ M3 R   Win32_PowerManagementEvent) B' o1 g* u! Y
  Win32_Printer" J) m+ E& a) Z
  Win32_PrinterConfiguration- t, A& R4 z/ ?/ S) ], D7 z
  Win32_PrintJob. A) P2 s2 q8 ^; S; u
  Win32_Processor
9 ]+ i( _9 L8 R: J& C9 J% O   Win32_Refrigeration
8 {% |( p, a4 E5 X   Win32_SerialPort& F! E+ s. B( K( o3 {& u
  Win32_SerialPortConfiguration/ e% O0 Q. \3 ^9 Y+ V
  Win32_SMBIOSMemory
* _* s0 s2 m  u3 a- E   Win32_SoundDevice; u6 i9 H6 F4 b  y
  Win32_SystemEnclosure' }0 i  b5 \/ I3 z
  Win32_SystemMemoryResource- F9 H" H/ K/ p: ]
  Win32_SystemSlot) N- ~+ x6 F4 X3 d; _2 X$ t' E
  Win32_TapeDrive
% q, ~: \' }" ], `: [7 P   Win32_TemperatureProbe9 g) o7 G& b8 t
  Win32_UninterruptiblePowerSupply
# l6 ]- \, ^6 H2 _2 ]   Win32_USBController5 [3 Q6 A$ i7 j0 A
  Win32_VideoConfiguration, Q& h/ q  k1 y% A/ @. U
  Win32_VideoController
/ s' @6 p' L- h8 Y. S" L   Win32_VoltageProbe  t; P5 |' ]% d9 Y$ n6 d

5 B: c" C, a. R! N* D# e5 [+ i以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-17 04:19 , Processed in 0.021109 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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