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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
  }$ [$ f4 ^% a' b' [$ p' [, A0 h

' B8 _+ g2 R' l# O& B--------------------------------------------------------------------------------
9 [. x, [. L+ K  aWMI: Windows Management Instrumentation (Windows 管理工具)0 M( n+ g* ^' x7 ^3 Q  H- Z
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 - L& u! b3 W% l
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。4 c$ n/ `- w. ]; q5 Z& w% J
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 2 H  a, y2 v( H* c' X. v3 ~* z

4 p" Z& m; s3 N% y. w0 t$ p--------------------------------------------------------------------------------
2 ^+ G; G7 x5 k  ~' qBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面. q2 i( B! c* P8 [. N5 j$ X8 F5 D

- t# n! N3 f/ e--------------------------------------------------------------------------------7 @6 j* C( y7 n! r$ ^* O9 W- o
① 初始化 COM 接口:- F9 J6 m( J) m- P& a1 ~: s
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。- D3 G" H# g6 M
  这两个函数在 #include <comdef.h> 里面定义。: ~4 a5 n, X5 P3 y( b, q+ C

# g+ H* ^, {+ b/ B9 y. P1 K② 获取访问 WMI 权限:
: [* O$ n  b9 E% C/ Z   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);2 p" Z3 S. x( c( J/ O9 V. s
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
, D1 Z( h% J( E# h) e% W! {. _3 n' h% R( C) C
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
% u% w! P4 m# q: n5 u& X- O( L   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。6 [& `! z) C+ q8 p, e1 j" ^
, }3 R+ d. V- }' ]5 p! D$ c/ ]
void GetWmiInfo(TStrings *lpList, WideString wsClass)$ R& X! S$ H# m4 C! r* u1 m; Q
{$ J; A( A; V6 U) T* X# l' b
  IWbemLocator *pWbemLocator = NULL;
2 E! n# v( ]8 S) S  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)4 ^) l8 k0 O2 K7 x8 \4 Z
  {
4 K4 o! }% ^' g- ?0 X     IWbemServices *pWbemServices = NULL;
9 j0 }6 v; G0 w/ \6 ^     WideString wsNamespace = (L"root\\cimv2");
: ^  K: P" O) J' ]     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
' P: F- {! F) p8 R- c; Z/ Q      {0 r# j( |$ \: i2 [/ L  E2 M
       IEnumWbemClassObject *pEnumClassObject = NULL;7 k% P  w. Y2 E" c! Z
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
1 v) N9 z1 X! N  f7 g2 S- N. i3 @        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
+ h# S  k) ^& t5 F( V         {7 H( E2 O- f+ i' [" w
          IWbemClassObject *pClassObject = NULL;& X1 G4 P& ^/ Y/ k- h
          ULONG uCount = 1, uReturned;, K- {, M: X; Q3 h$ Y
          if(pEnumClassObject->Reset() == S_OK)
: _# S0 n0 D  H( C3 C4 ?            {
! @" k# k1 }" {( p              int iEnumIdx = 0;, p# O, |: D% x7 D& b: g
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)& u( s; n$ L. q2 o8 N
              {1 k6 H9 m2 {2 P! v4 Q  f! k
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");' t$ A/ z1 Z2 b, g) B

) q2 C- Q: a% m5 Z8 Y+ U+ A                 SAFEARRAY *pvNames = NULL;
1 t1 r9 N$ u0 f( D                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
, ?2 U' M+ S0 a7 H! ?. f, x                  {. x0 j% M( ]9 f+ m
                   long vbl, vbu;
% Z4 }/ B5 S! n; J! t; n                    SafeArrayGetLBound(pvNames, 1, &vbl);
. E4 ?- n$ k% L( k' R                    SafeArrayGetUBound(pvNames, 1, &vbu);6 M2 }' Z6 ?" N- j8 N5 v; [9 C
                   for(long idx=vbl; idx<=vbu; idx++): ]# _$ t* r4 Q$ D# }" }3 W+ U
                    {5 m/ }* q7 h0 R, g- D  [: X" {
                      long aidx = idx;0 N* `1 a! o) q2 ?
                      wchar_t *wsName = 0;# p3 i  c4 y4 @' X$ ]; {1 S
                      VARIANT vValue;. d% l9 ]% I; J' N' A
                      VariantInit(&vValue);
9 H0 N! ~1 \( f& F( r9 Q                       SafeArrayGetElement(pvNames, &aidx, &wsName);
' p: J% Q: [0 G! [. T" d- d4 s5 q
4 `. T; ~- R4 L: u3 T' Q                       BSTR bs = SysAllocString(wsName);
4 n3 {  t/ |/ i2 j- ^( y2 Q( z                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);& p6 _* E$ u- Y& g, K; ^) Z8 E: {
                      SysFreeString(bs);
) \, e6 t! N, W  o, q' K& O- |# p! z3 A
                      if(hRes == S_OK)
2 b% D% y7 w0 w                        {1 d/ ]& u! m; c0 G. l) e
                         AnsiString s;
- I8 i' u% D+ d) A                          Variant v = *(Variant*)&vValue;
1 {  ^- @9 S' k! Y                          if(v.IsArray())
. E1 X, ?7 H9 y5 G$ f( z                           {8 w0 i4 n, H) q- Q3 M8 e- w0 ?* C, i8 g" b
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
, c  x: L9 g5 F0 I1 f! I                              {
- U0 z" J1 a. {. r" n                                Variant a = v.GetElement(i);) \! P1 @) K5 R5 z2 s( [
                               if(!s.IsEmpty()), a  b4 S3 C- X& s) H' h4 C
                                 s+=", ";- y. }. _; M3 k" H
                               s+=VarToStr(a);2 `6 o8 ^& J* {- I" x/ T' Y
                             }, H9 }. T( Z- g- s3 p' u+ j+ u
                          }
! G1 i* H/ G* m- B/ |                          else
( o! x" u! T' Y8 a+ ^- u# g                           {- Y' O( x9 g6 }0 R; U+ M" b
                            s = VarToStr(v);
, K4 N% a, R$ e8 n& N+ v/ S                           }
8 J: c1 u8 ^  j  G9 T6 W' G! u' a                          lpList->Add(AnsiString(wsName)+"="+s);9 z4 T6 p2 s% y; X: h
                       }/ t( e8 M& Y, b

0 |+ B( v1 a" C& h; _, o# _                       VariantClear(&vValue);6 k; U% m7 V7 D. J1 R; P; m
                      SysFreeString(wsName);% g* E4 g5 ^8 R5 B8 q# |' W
                    }- b: g6 i  p' e) K9 V. y
                 }8 g0 M7 K' i" x3 @& k2 M, K
                if(pvNames)SafeArrayDestroy(pvNames);
2 P; v% P6 m$ k: x2 s                 iEnumIdx++;% U+ E5 p' {6 E( U9 {2 h, c
              }& y1 _  X& I; p# N( n# H' R, M  X
           }
$ g- W  ~  q( C1 y: h4 y, A           if(pClassObject)pClassObject->Release();
/ H9 f+ b& ~+ n         }
, z& V9 V8 O( O. K/ {8 M1 N        if(pEnumClassObject)pEnumClassObject->Release();
4 n6 h+ J1 |- k4 @7 G- D      }
: ~  z" G. I( e" h: t     if(pWbemServices)pWbemServices->Release();
- _9 N% c( w) k( E9 `) t5 E# Z5 F, n   }
# I  F2 S/ @+ K9 i1 M! L  if(pWbemLocator)pWbemLocator->Release();1 M0 M) a  j- \) e. E) {
}
0 W9 k* h6 J4 y1 A# z$ [  ]# |//---------------------------------------------------------------------------
3 v- f2 p1 x, M2 f2 T
& W, E) F- U. J- y1 f// 通过 WIN32_bios 获取 BIOS 信息:2 |3 P1 _5 J! m- p
void __fastcall TForm1::Button1Click(TObject *Sender)
7 d4 R. S5 W3 w5 u) J6 }9 B8 Q+ Q{
) u1 h5 L+ B0 h% _# Y    Memo1->Lines->Add("================== [WIN32_bios] =================");8 K4 j* u0 c$ _  @3 b
   GetWmiInfo(Memo1->Lines, "WIN32_bios");& j( {7 B. ~, U; }# y9 X' ~  U+ W' n7 J
   Memo1->Lines->Add("");
1 K9 C' ~* r% d& k8 l1 n: H}
0 b2 {7 d8 m* e
3 y- j, v6 C1 d. k$ `: k--------------------------------------------------------------------------------
$ e9 j- v0 l) a) `% S
" O$ ]8 n& J0 sWMI 可以访问的信息类型有:, J! U/ W' G- ^
  Win32_1394Controller
- p3 ^" B0 |7 G7 u; W$ c$ Y8 m$ ^- B  Z   Win32_BaseBoard
& P8 I5 M+ ~6 e5 j9 e, Z   Win32_Battery" i7 ]% ~' v. H+ Y' m
  Win32_BIOS
+ K7 ~# i" f: j% }+ V   Win32_Bus9 p9 E: A  H+ y& @' _3 J
  Win32_CacheMemory4 _  k+ g: q  }1 V9 a7 m
  Win32_CDROMDrive
5 \5 `( D2 t9 b0 Z+ g   Win32_CurrentProbe
4 p, d4 d; f7 y" B  {6 _   Win32_DesktopMonitor
" @; v7 B& Y' h; A! I, X& y   Win32_DeviceMemoryAddress
3 B6 M  L7 Z! W, [   Win32_DiskDrive8 S6 i9 f9 Q6 ]; v; |1 |5 _5 O
  Win32_DisplayConfiguration! H) [( c& q, ~! t' y1 }$ W/ F
  Win32_DisplayControllerConfiguration) Q7 l2 G, b7 s+ n/ d
  Win32_DMAChannel% C, m0 ]0 r$ N5 t- V0 C
  Win32_Fan- \7 j. l5 M- }! V: ~8 a
  Win32_FloppyController! e5 t- o6 b6 v
  Win32_FloppyDrive0 ?/ w, j* u# Y# L+ T
  Win32_HeatPipe
: ~: \2 w% j8 u3 t   Win32_IDEController
2 Q5 s* r; ?: c+ q- F( Y   Win32_InfraredDevice# E/ K: q8 |8 |0 Y0 Q* H+ O- Q
  Win32_IRQResource2 |7 `7 P4 t  @7 F" d
  Win32_Keyboard8 F' S# p9 |+ C0 G4 _0 s% }
  Win32_MemoryArray
4 y/ J! w% [0 T; E   Win32_MemoryDevice
' W6 s1 \1 O% |+ E/ \6 F   Win32_MotherboardDevice; ]" }3 }" w7 ^- F& q6 Y/ ~) r
  Win32_NetworkAdapter6 K! g! f. s& k1 W% t; x
  Win32_NetworkAdapterConfiguration
0 T  F+ j: l9 M% P. N; a   Win32_OnBoardDevice) ~, n/ d' {5 U9 G4 a& v
  Win32_ParallelPort
* q1 `0 K; y$ _1 Q   Win32_PCMCIAController
7 Z: ]+ }* l1 T9 u2 s   Win32_PhysicalMemory( b% C7 f& e: N5 @6 X/ X& x
  Win32_PhysicalMemoryArray  |& S. Q$ X- G+ L# O
  Win32_PnPEntity2 ?( F, J) q/ }; Y+ `: }+ Y
  Win32_PointingDevice
; X! Q, @; ~. ]# q. h4 l   Win32_PortableBattery
- V" F/ }8 c; r0 [- p' M   Win32_PortConnector" B" d1 R; c2 S: {; Y5 d9 p. ~% b
  Win32_PortResource
, p7 j' a& j2 k   Win32_POTSModem
6 z  p: r! G- ?. a2 {   Win32_PowerManagementEvent
! z: ]& _0 b  }! N$ W/ l   Win32_Printer( C" e, |4 b  R9 W2 [9 o) R8 E* N
  Win32_PrinterConfiguration
" a$ r8 @9 a' Y1 @   Win32_PrintJob5 Q: F7 H3 }& t
  Win32_Processor- N$ c  a  m2 B" O
  Win32_Refrigeration1 l* _, n; a/ Q% Z) t2 J  G' k; A: J
  Win32_SerialPort
+ s* _7 Z7 n7 }+ m6 e   Win32_SerialPortConfiguration
6 K0 P( h. m3 b+ |8 \   Win32_SMBIOSMemory: w( x$ R% i$ D3 X5 X" f; ?
  Win32_SoundDevice
7 M3 ~$ j. Q) [   Win32_SystemEnclosure
  x- I* Z4 H/ C' }- h   Win32_SystemMemoryResource
9 g1 k6 ^9 v$ p8 [2 Y9 P   Win32_SystemSlot1 K" V5 N3 ?) z0 Q; y1 k/ h# t# g
  Win32_TapeDrive- u9 V1 [- K0 D# M0 T
  Win32_TemperatureProbe
- ~- A2 @2 ?" T$ g& m   Win32_UninterruptiblePowerSupply
9 O! V  s* Z& T# N, i# U   Win32_USBController
) X# _& r. j5 J& \- |7 s' r1 l% F8 f   Win32_VideoConfiguration3 e' F5 V) a; C9 Z( T# t
  Win32_VideoController
- {7 {3 V- Q4 I9 g7 v' p6 W, o   Win32_VoltageProbe
9 E# @: X2 I2 q
- C# ~7 z# J0 S6 Z7 m以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-29 23:11 , Processed in 0.018028 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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