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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)/ m  z5 E3 H. z/ ]

3 f7 n; N! j6 i0 M. e
& H; O+ Q8 n! [- N5 p--------------------------------------------------------------------------------9 }$ z; m1 r% F& r! `* c
WMI: Windows Management Instrumentation (Windows 管理工具)
- P! E" d2 T: a   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ) u* i" }4 t, r) [
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。; }$ s! m; y0 z
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 2 n7 Z0 ]2 K' @7 I" F, {, n

% a9 Z6 p1 V! O. V' P1 }0 u1 F9 H--------------------------------------------------------------------------------0 E2 o' e4 J7 X# v: `
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面* C  o) Q# k* f4 D

. U6 ?# w( W9 s4 V! Y+ j' v--------------------------------------------------------------------------------' A- F) h; a: ^3 {5 ]' T
① 初始化 COM 接口:( E! _! g+ p6 w
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。& o' e& M2 C: x% s+ E5 \: h- g
  这两个函数在 #include <comdef.h> 里面定义。% r6 c1 U8 H7 C2 I) |0 r

! o7 u  s2 {: S② 获取访问 WMI 权限:5 m5 w$ N3 o- a/ Z% z# G! H
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);7 S0 T$ F; D: x  s4 X+ P9 Z( W/ D3 s
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
# \7 o8 `" ~1 e3 k9 ^" B6 V7 V- `1 b; v3 L
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
0 U4 b/ [. T7 B   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
1 N1 f9 r# k, o0 L& P5 b' K- H+ D" O
void GetWmiInfo(TStrings *lpList, WideString wsClass)
& d0 A' V% n+ L; t/ d0 i{& v5 }: g! V7 q0 Q0 f
  IWbemLocator *pWbemLocator = NULL;3 G9 G% |4 r, a: {1 H5 `! \* C
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)7 F1 ~8 x  k* ?! ]( _
  {
; S8 {& E( W) ^5 v: ^0 {% d' W     IWbemServices *pWbemServices = NULL;4 h9 N; h$ B2 m
    WideString wsNamespace = (L"root\\cimv2");* `( Y5 U  L4 y5 o5 `
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK): a7 l! q; w$ L8 @' \
     {. `& m) i  X4 A8 ]- t# R) W$ ~2 U
       IEnumWbemClassObject *pEnumClassObject = NULL;0 l% d* H! z5 f, p" Q* e% o
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;, N5 J/ K6 S) Y" L
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK), _9 H0 A$ ^. D& }  t6 o. C2 S4 ~
        {6 V) Z: f7 N" z# [8 h; i1 g
          IWbemClassObject *pClassObject = NULL;9 _9 z9 V$ ]! L& }: ^4 s) q+ w" C
          ULONG uCount = 1, uReturned;
- q* d: V: H* B           if(pEnumClassObject->Reset() == S_OK)
& b7 o. o/ ^" h: a3 M6 W            {
- r/ o; Y& R7 `4 P$ z& q              int iEnumIdx = 0;
; Y' F2 }& j+ D+ w              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)$ J# h  T5 K, a2 ?
              {
4 @# I" v# z) X7 P                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
2 U( D+ ~& m: _, _
, @! b: F7 o( N                 SAFEARRAY *pvNames = NULL;) Y* h& @2 _  b( b2 G* y
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK); g7 u# G/ t1 C# N/ I& p
                 {
( `+ B7 a& H  E; H% G& t- n- H                    long vbl, vbu;
- J5 I. ^4 g, N/ v                    SafeArrayGetLBound(pvNames, 1, &vbl);& Z, e  i6 H' }- o: |
                   SafeArrayGetUBound(pvNames, 1, &vbu);) O5 }( X% K! i/ A8 I% H
                   for(long idx=vbl; idx<=vbu; idx++)
- Q: i. B5 q- p$ @$ b, n6 m                     {& K% {( q5 o' q7 H- t8 \
                      long aidx = idx;
& [( ?4 X4 u/ [+ Y# L6 W                       wchar_t *wsName = 0;9 ~; o0 G3 P% s9 S" u/ e8 ~
                      VARIANT vValue;. h! p1 u8 Z: i! `! ^$ H" Y
                      VariantInit(&vValue);
( [9 w  R0 H+ r! p, ?$ ~# g; g' Y                       SafeArrayGetElement(pvNames, &aidx, &wsName);
' G; ~  f* O- @: Y5 _) {$ ]/ Z- T: k2 s0 D5 o
                      BSTR bs = SysAllocString(wsName);# E! K: Q; y. `# D; z7 x1 K* h
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);1 J- X6 z8 h0 q4 [
                      SysFreeString(bs);
: q; ~/ N6 S, H1 A$ n* b3 r% K( S  f  [( f. f
                      if(hRes == S_OK), ^& T' n. c* Q) [% b
                       {/ E( d! {$ r, K# J* s
                         AnsiString s;$ x2 k& L: ~2 s: W; q" K( P& V
                         Variant v = *(Variant*)&vValue;
1 D' l9 ^+ s! T6 f                          if(v.IsArray())
3 T2 S. @# n. I0 R: F6 x. Q                           {
# r2 W9 o9 f2 k1 `' d- F) d" R                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
# o7 g4 d  R1 F! P' u                              {8 o+ x) O7 g8 `. A+ j5 ^# c
                               Variant a = v.GetElement(i);
" E; C( l: u1 q! k3 _: b* G                                if(!s.IsEmpty())' J  Q( ?5 N+ W. S/ [6 F- n
                                 s+=", ";
. z5 R' \) C/ {! @4 ^                                s+=VarToStr(a);
. i2 n8 l' Q2 N7 j' j                              }
& y$ ~# [7 I$ I/ C                           }! }7 t2 \. m) F/ D$ R
                         else+ x2 y" F, n3 C% m2 E7 I
                          {
) y; E6 l. s1 X+ u                             s = VarToStr(v);
7 Z. ?* h$ j$ k: B                           }
5 b% [4 [6 H2 h; \                          lpList->Add(AnsiString(wsName)+"="+s);
. v1 [1 M9 Z5 s) d                        }
- _0 K$ Z  M" M2 T; B+ {1 G& ?
: X& M; A. w# q% _                       VariantClear(&vValue);
8 F, [3 I, z* L) j3 l) n- Y5 `                       SysFreeString(wsName);
4 h. y4 G' B7 S0 R' r& _- F. h$ `                     }
  w+ v0 b6 {; Y                  }
  a: |* {8 e$ @                 if(pvNames)SafeArrayDestroy(pvNames);' g4 n$ a- j1 t
                iEnumIdx++;
- g2 ^( z( U! j               }, ]9 z- y2 Z. k- f4 w
           }
( a3 u3 @' t% {4 s' I           if(pClassObject)pClassObject->Release();1 u7 g; u& R% W- ^2 S
        }
4 Y1 E7 O) m: t- l! d        if(pEnumClassObject)pEnumClassObject->Release();, n- t: R: |. X  {7 N
     }+ Q( T% h  _: C# S* `, I) F' e. [" g
    if(pWbemServices)pWbemServices->Release();
! _3 \2 g% u; i* K. D   }
( `! u- g8 U; S  if(pWbemLocator)pWbemLocator->Release();: `9 i6 R5 N# P6 k1 M$ I7 X* I
}% n# x$ Y) G8 n% y# u
//---------------------------------------------------------------------------  g+ m5 p9 @& m+ n7 D$ h) H% C8 w

0 [- d5 {" R2 W// 通过 WIN32_bios 获取 BIOS 信息:
+ V! o  ^: e. A6 J9 vvoid __fastcall TForm1::Button1Click(TObject *Sender)4 _! d& ]1 N4 `9 Z( v; z8 p: q9 Y
{
$ a7 \' O, b6 t0 v7 z* V2 h    Memo1->Lines->Add("================== [WIN32_bios] =================");
9 y% p: q: A2 M$ P    GetWmiInfo(Memo1->Lines, "WIN32_bios");
( X) O$ |8 S* M( p; C+ A4 g    Memo1->Lines->Add("");1 K7 n8 j: o; r4 w- `
}
% o0 |8 q) l) O8 F
- D! r, E2 h: L0 G& P5 ^--------------------------------------------------------------------------------
) s0 o4 Y( h+ l7 R$ {  D" T! D
' o' J: i2 b5 @% m  Y: Q7 ^! kWMI 可以访问的信息类型有:
* W8 f5 |/ n2 O! a% _   Win32_1394Controller
4 C, g$ o. {& T4 h+ K. h   Win32_BaseBoard6 {& H: u$ A& f" y6 |
  Win32_Battery
0 k) ]: H- v' N7 n; V) S   Win32_BIOS
1 k  f+ k/ U3 h' x, \   Win32_Bus
$ O, r* n5 [# V! L  G; {   Win32_CacheMemory5 [( D- Q; d8 L1 L
  Win32_CDROMDrive
3 _- h) D* D! u$ e9 Q   Win32_CurrentProbe( E9 ?, Y  X, {* e! \4 X. N. i
  Win32_DesktopMonitor$ Q: m% R( Z9 A& X
  Win32_DeviceMemoryAddress8 W& s* k% u0 @! K
  Win32_DiskDrive
2 P8 ~+ N5 z; j  A6 I   Win32_DisplayConfiguration
. l) _1 l( H& k; p( }   Win32_DisplayControllerConfiguration4 Y- R, J/ I+ b. D- Y# p+ Z7 v6 K
  Win32_DMAChannel
9 x1 x+ U) J6 L) [3 D  p5 J   Win32_Fan9 W  ]" S: M& }& |7 ]
  Win32_FloppyController
. S: \% B- L5 d8 G" q   Win32_FloppyDrive) h. w9 I9 M  z8 t  b; v) |
  Win32_HeatPipe
+ A) Q& S5 c* m$ C! s- c   Win32_IDEController1 t1 R/ X$ l& s. y- p( k/ [  I  L
  Win32_InfraredDevice, ]* Q8 l# m7 h
  Win32_IRQResource
/ E  C0 X0 v6 G2 q   Win32_Keyboard7 p- G0 W' L" R
  Win32_MemoryArray# O- o, ~0 ~7 z3 G3 J7 @) z# L: S
  Win32_MemoryDevice
6 H% P8 v  d, N% h& @: n/ K   Win32_MotherboardDevice: t' \, G$ }2 v" [: I* U) Y8 t4 n
  Win32_NetworkAdapter
+ J( ^2 G4 L1 v  e. P! J' g1 z   Win32_NetworkAdapterConfiguration
- I6 H' _+ ?1 t) n, b   Win32_OnBoardDevice
5 c# `: ~( L' c/ @   Win32_ParallelPort
, j/ J7 U* R" C7 [! V& y) c0 H- i   Win32_PCMCIAController1 I  q4 k- ~& }. H
  Win32_PhysicalMemory
' D) u' h! L5 f7 G1 x+ i# c0 Q7 \   Win32_PhysicalMemoryArray
" s. O& a% t  v4 v5 n+ N   Win32_PnPEntity
0 X( |2 s: G" W" N' {+ S, W% h   Win32_PointingDevice
8 N! m" m% b0 ^4 c7 {% Z   Win32_PortableBattery# J) D% G4 p4 S7 o
  Win32_PortConnector
* L: I( @% k% p' P4 }  O   Win32_PortResource7 g# s: _$ k# n% e& F; u6 ]7 J2 P+ D
  Win32_POTSModem+ u2 F2 O7 A. Z7 {% R8 Y/ l
  Win32_PowerManagementEvent
* _, ~( b/ r4 j" m& |) k   Win32_Printer1 X. a! {2 f1 V1 _
  Win32_PrinterConfiguration( y  o. g$ u1 K8 J
  Win32_PrintJob9 Y/ ?5 d2 v  j, C8 @
  Win32_Processor
4 @4 Y0 H5 ^/ b. A/ \9 z   Win32_Refrigeration
  y) {- L6 _' n- a" ], W8 w) G+ a   Win32_SerialPort: C' l5 R# j5 c8 e- z* f$ m
  Win32_SerialPortConfiguration
4 I4 u) o5 J, f. C- i8 ^6 i   Win32_SMBIOSMemory
3 R0 p0 z  a' }- I! u   Win32_SoundDevice6 o/ f6 x$ ]4 m: Z9 T8 U
  Win32_SystemEnclosure
# X* ^* F6 u0 z) L* f2 {$ l& u1 Q   Win32_SystemMemoryResource
- h, r: _4 n9 ]% n" z   Win32_SystemSlot; y" l0 u# q: t3 s( `( i
  Win32_TapeDrive5 i- M8 ?0 y" R
  Win32_TemperatureProbe
5 g- _6 K2 u4 u" H: z   Win32_UninterruptiblePowerSupply/ }4 o0 Y# s  m. k; ~. l& A
  Win32_USBController
1 b& b$ {+ {. \6 g$ z3 V( R. _4 p   Win32_VideoConfiguration  {9 P$ h& ?! A8 O, f
  Win32_VideoController$ n/ \) g  \: Y7 S) p
  Win32_VoltageProbe
  p" s) X+ E# X1 C" V; R7 s1 b6 A( T1 g
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-28 00:12 , Processed in 0.021883 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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