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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)5 x2 v: x( j. p' k; ?. z  j

2 |# ^) l- G( i! M3 b0 |) b4 G3 K/ L+ _
--------------------------------------------------------------------------------+ J/ ?$ i' C. n5 E/ Z, n: G8 J$ N3 i
WMI: Windows Management Instrumentation (Windows 管理工具)9 K% G: D5 L4 |
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 , ~- @" w: g; {
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。/ ~4 l! y9 @) T& v% Z
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 " s1 K5 _  s8 O* W0 P  B* A

. w$ j7 P/ I! J1 J) Q$ p--------------------------------------------------------------------------------
5 D; B2 u2 S/ {! t, [BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面0 P  Q( b3 G3 H+ Y
5 }' c, V2 ]5 z0 A. f
--------------------------------------------------------------------------------
0 l6 c/ _5 y0 Z# }7 }$ z$ H1 _① 初始化 COM 接口:5 l' h6 L. s$ p+ C
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
' b8 W' }) ^" M   这两个函数在 #include <comdef.h> 里面定义。+ M! {1 G) z* T
% R# e! S; O6 y! K* L& `
② 获取访问 WMI 权限:! D2 S9 A! Q0 E
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);) f! S$ h: V, x1 e" O% Q; ^+ v  S
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
8 y( @/ T& `$ l1 g  b3 }
+ R( U+ V# f0 ~* D3 z- M③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
) [% @( a6 ^. a   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
' T2 h( S, ]0 z- n, l; [1 z, U9 g4 R+ D1 S" f
void GetWmiInfo(TStrings *lpList, WideString wsClass)9 N6 U( J; K' k& i: z9 g
{
  D) z5 a9 S% x4 Z) l- C  IWbemLocator *pWbemLocator = NULL;
) t$ X4 Y& H8 k  a# t" }9 R  s$ l. @+ D  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
/ z+ c1 t, g- E, k% Q   {! ^/ _! ^& ~( W* w3 n
    IWbemServices *pWbemServices = NULL;
: z9 p& t) y# L- Y$ q6 F: E8 O# _# a. A     WideString wsNamespace = (L"root\\cimv2");& X- O1 S, M. _; H! l: H
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)- @/ O* ]. N  x6 i% v
     {
/ T. ~; L9 W# c3 y* B9 l- W5 M$ K        IEnumWbemClassObject *pEnumClassObject = NULL;" G7 L# f$ V4 }7 _9 m
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;: A; \" y2 E4 v. W' k
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK): ^* u( P+ @, w, @  ]+ f
        {
6 n* U& U/ f4 ^, j. O- g           IWbemClassObject *pClassObject = NULL;
* X/ x+ S6 o# ~& d: T           ULONG uCount = 1, uReturned;; y% t" h# c; Y2 w2 E
          if(pEnumClassObject->Reset() == S_OK)8 S6 d7 Z8 N# N- Y- `
           {4 q  f: |7 M; P4 H4 ]( P! T
             int iEnumIdx = 0;) g6 V8 [0 R: T" P+ Z
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)- L+ w. J2 \5 C6 p' b; c8 j
              {5 N5 E( z% q8 G' E3 W
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
8 ?2 P  C% |, `) z5 r5 B' t9 u' o1 a. m
2 |/ r" F: u$ A; P8 b                 SAFEARRAY *pvNames = NULL;, ?4 D8 Q7 S* B+ J" ?
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)0 V; m2 r7 y" l1 q
                 {! S* K4 C4 i  K! U" L
                   long vbl, vbu;
4 |# V/ R- z& z- `5 _% {                    SafeArrayGetLBound(pvNames, 1, &vbl);4 f7 Z/ Y. Y, q& \" U/ u" H
                   SafeArrayGetUBound(pvNames, 1, &vbu);
0 r- N2 p& ^9 I! ?0 X                    for(long idx=vbl; idx<=vbu; idx++)! u0 z3 F! Z, z$ O7 t7 E9 {4 W2 g
                    {- Y( L8 g. s- \: C% \% ?
                      long aidx = idx;7 z, |! W5 `+ R: {$ @% O
                      wchar_t *wsName = 0;
  [, l  i2 O4 b7 a$ e' ?8 G                       VARIANT vValue;" P3 G' P+ h1 d6 y! Y) J
                      VariantInit(&vValue);
) R5 Y1 J7 ?- ]) j0 T                       SafeArrayGetElement(pvNames, &aidx, &wsName);
1 v, \1 x5 d- i. l0 ^! j* U; d& W3 l3 d3 P
                      BSTR bs = SysAllocString(wsName);3 J6 \, f" m4 k; Z$ u1 @
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
3 U( ]6 D6 R' i6 x                       SysFreeString(bs);( y% o$ y9 _9 E. |6 P# v
, q; k6 r) j* E
                      if(hRes == S_OK)
) q4 K4 i, e. U# p' X1 V* N6 R/ c: Z                        {
3 s* }+ L* e) p2 Z- |                          AnsiString s;
0 T8 z7 ]6 G# z0 [                          Variant v = *(Variant*)&vValue;
, Q$ ], S5 ?% k) G5 `                          if(v.IsArray())
  [/ Z, V; ~1 n2 p% d3 b+ n) p                           {
0 `6 b1 E( Z) p/ Z% l                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
6 n7 x3 x7 p7 C8 i% k                              {: ~* t( z- ?- x8 a/ U" H& V7 Y
                               Variant a = v.GetElement(i);
. m1 c9 m- B( N# e8 A4 w# }                                if(!s.IsEmpty())8 D1 ?, S: s$ V/ n
                                 s+=", ";/ u0 v+ @0 G9 I& q
                               s+=VarToStr(a);) n& X; r9 j! @  k
                             }1 l& W7 G# g3 q
                          }* T: R  H1 d9 [! m* h
                         else0 K% S5 S* i. e; @: g  _3 ?  [
                          {
+ P1 e: M6 v/ \% q9 ~0 ?4 B                             s = VarToStr(v);! r; w7 p  h& {% G" S+ d
                          }& \+ P! W$ h+ W& q/ i' P
                         lpList->Add(AnsiString(wsName)+"="+s);5 p/ Z' m3 U& X$ H$ x6 S
                       }2 ]0 E% Q6 C( n3 r0 w+ i+ P
' R1 |% d+ a: Y* n
                      VariantClear(&vValue);
9 Y" E+ M/ `  W- e+ q7 ^" U                       SysFreeString(wsName);
9 J. D, r8 u6 q5 ^5 A7 k# P9 f                     }
8 t* A. V1 O+ a7 ]                  }) O- F* A2 @. T  v. s! @( h
                if(pvNames)SafeArrayDestroy(pvNames);
+ G) b$ h; ~6 Q8 |                 iEnumIdx++;7 p4 ~; O* C. w& m  d4 ^
              }" ^5 {: W& b+ c% L6 F, j
           }. G9 ^7 Q4 w6 [6 M
          if(pClassObject)pClassObject->Release();
8 ^% r) n* d$ D8 {$ ?" T) k         }+ v; E3 A! J/ t8 Y. s& `) b
       if(pEnumClassObject)pEnumClassObject->Release();  t4 ^4 U& R! D4 Y+ R6 n3 j
     }
1 P$ p' ~+ P, D; _' ^0 U     if(pWbemServices)pWbemServices->Release();
/ V' k. ^" ~' p9 ^0 Z) ]   }* ]* D: p. o, g* \- e; P
  if(pWbemLocator)pWbemLocator->Release();8 ?" v0 A+ m! [9 X; s
}
8 |. x' x/ s8 R//---------------------------------------------------------------------------) l; W2 U# B( d/ R( Q2 `/ S

/ y% }7 v- q5 N& T9 {// 通过 WIN32_bios 获取 BIOS 信息:4 b5 L% E" J6 w: P% l  @% y  `$ I
void __fastcall TForm1::Button1Click(TObject *Sender)
% N7 s6 L! r3 k1 \" i! D{& h$ v7 X: m! e% M1 i& j
   Memo1->Lines->Add("================== [WIN32_bios] =================");# j5 s9 `9 D8 J7 J
   GetWmiInfo(Memo1->Lines, "WIN32_bios");' P9 \4 U( Q3 B
   Memo1->Lines->Add("");
9 s; b3 x9 j% W}
7 K- B7 ~7 _  s/ r) }2 x' O9 C, f2 U8 c  R) D" Y
--------------------------------------------------------------------------------
; c* M& C7 @3 A$ ^3 d0 s4 B" T4 C$ M) r
WMI 可以访问的信息类型有:
+ a" i5 X- D4 a: a9 N8 n3 t6 [   Win32_1394Controller
& s3 M; Y8 B  d. K- r   Win32_BaseBoard
3 ?) j  H4 }1 C' U6 X$ n5 z   Win32_Battery8 l% I% j  p% d( l7 o7 W8 m0 H
  Win32_BIOS/ N( d" q2 M/ I# t+ l# D; C
  Win32_Bus
& e. D: k& v4 V   Win32_CacheMemory+ [- v; L0 g5 ]6 T) H. y4 V: Z
  Win32_CDROMDrive
- l5 J9 y5 `, }+ L2 E$ T: [+ X. m   Win32_CurrentProbe$ ?5 l! q: P; l2 P8 a
  Win32_DesktopMonitor
" S" W4 d' F0 A; @. U   Win32_DeviceMemoryAddress/ m8 T: R1 p/ D( K/ z& S
  Win32_DiskDrive
& n; q$ K6 i9 k/ G4 \5 f# }   Win32_DisplayConfiguration9 l! [5 R% Y4 ^: w, R
  Win32_DisplayControllerConfiguration+ R; N- }9 N" ?7 l- U5 t# k+ y9 X
  Win32_DMAChannel& _5 t0 t$ @1 Z5 p
  Win32_Fan" }, W( g8 L: B" T; @/ \* q8 u
  Win32_FloppyController
6 d, T+ E" I$ [( h9 D- u0 h$ F: k2 C   Win32_FloppyDrive
4 \7 n0 m3 P3 l   Win32_HeatPipe
/ d, ~* V  h. k& C   Win32_IDEController  y: G# {" T* p
  Win32_InfraredDevice/ m2 Y8 P* `- U/ A' }
  Win32_IRQResource  B3 i3 q+ e1 V! F$ N: O
  Win32_Keyboard
' B" A  q6 B( n/ j1 x   Win32_MemoryArray5 B% ?" H9 }1 Y
  Win32_MemoryDevice
# ~) `* {/ |) Y: F0 B  @7 ^% d   Win32_MotherboardDevice1 e+ E0 V& ?& K1 J5 ?: x( X$ [
  Win32_NetworkAdapter
) G4 [) }/ O6 W# y7 Q   Win32_NetworkAdapterConfiguration" }( T: l# C* P7 K/ {
  Win32_OnBoardDevice2 `. P6 d* ~2 r4 Q+ x% N' Z2 `+ C
  Win32_ParallelPort1 j. O/ V8 m* Y% p. l8 M
  Win32_PCMCIAController
! ?5 B" c+ C4 Q, i   Win32_PhysicalMemory' \: U, T$ R; u$ @( x, o8 I$ U
  Win32_PhysicalMemoryArray
7 L4 Z: a5 s3 @# \7 D3 c   Win32_PnPEntity( @7 u, u, `4 V* C- m6 T: v) W
  Win32_PointingDevice
0 D" N  m& ]2 }. i. ?; f( X. P   Win32_PortableBattery
3 Y+ \  ?% z5 ^$ F- J   Win32_PortConnector
/ z- N, ]! k0 x* D( p' n   Win32_PortResource
# W* a9 `1 ~4 ]9 w" o$ Q) w   Win32_POTSModem
  g' o3 w6 W! e/ m$ v7 M   Win32_PowerManagementEvent
6 c4 c" |+ J4 K, s8 h1 }8 k   Win32_Printer6 \' C% d# q8 X7 h& i
  Win32_PrinterConfiguration
" Z% M* w0 B! @* X, X, ~& X   Win32_PrintJob, F2 x& Q6 m3 R9 ]9 A/ R$ O" E
  Win32_Processor& F3 l5 u" q" T6 ~1 I
  Win32_Refrigeration
) x  ~+ s5 i# M' K3 t" s* B' x   Win32_SerialPort
0 `- W4 Q3 P) M+ ~+ Z, \. m9 M   Win32_SerialPortConfiguration
! y- N3 H* J% f   Win32_SMBIOSMemory
& s! F3 Q. D: N! P   Win32_SoundDevice, c* m1 |( B5 T- W8 |+ c
  Win32_SystemEnclosure4 a2 r& `( @) Z! E5 s
  Win32_SystemMemoryResource
8 c" `6 ^. i! f   Win32_SystemSlot
2 F2 n- S7 x- B) Z( Y/ |3 v   Win32_TapeDrive% |) B$ r% G, j2 r) v5 b5 e
  Win32_TemperatureProbe
5 d( Z' t$ H* F" T9 e3 X! _3 X   Win32_UninterruptiblePowerSupply: ^8 x+ R6 N6 I# o
  Win32_USBController
" W5 _- C$ m2 _   Win32_VideoConfiguration
0 ~8 d+ T/ G' S   Win32_VideoController
& F, |6 E! {) g9 ]6 f   Win32_VoltageProbe8 z. x# W5 T0 \' z
9 x; G- J& ]0 C% w2 t2 m
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-27 02:46 , Processed in 0.017229 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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