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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
/ f: R1 v9 ?% b* V) V$ P2 t- x
1 x, F9 X' l) O0 j+ e4 s5 ^. K$ ^1 ~; ~$ ?! \& {
--------------------------------------------------------------------------------& U* y8 R4 q" V' L: V! v
WMI: Windows Management Instrumentation (Windows 管理工具)* b' H% S4 x+ u- `
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 , ^9 y: F' }  ]. w# i6 W! W* X
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
; \2 C0 X" B& A% w6 D   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
) ]# W; A) j0 q" f+ w/ X9 z+ n3 N/ o
. S& e: w8 O& F' u, O* f: p; W  a--------------------------------------------------------------------------------* \' b4 S8 a7 k- {1 f/ _, D
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面8 p! Y" e3 S7 F+ |/ Y  D
! [0 o8 Q! `* ]: d! R9 I
--------------------------------------------------------------------------------
6 R' d2 F- N/ _# {! [① 初始化 COM 接口:
' v, W: t% e' T5 Q6 H   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。6 e  r: k' `* E5 q' b
  这两个函数在 #include <comdef.h> 里面定义。4 ]5 e- _4 c& c# }7 S, }

/ V! K4 a" b, U' i② 获取访问 WMI 权限:% N- ]$ D0 R2 a* v( }" q! w% J: I
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
0 r+ s. ~# p6 A# {& I/ Y: ~   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
. l; O& ^# G  G0 a8 k# w# p  T, d3 x+ C) X" M
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
  o  @6 a8 d, S, q6 E   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。& e% ]! L' t+ q- s
9 \* G, O: l; z
void GetWmiInfo(TStrings *lpList, WideString wsClass)5 @8 e' N) y3 A. O+ J3 b
{  R' K( j$ K' V; J7 p
  IWbemLocator *pWbemLocator = NULL;1 C! f( m0 }2 F# W! b0 q
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)' ~' x: N  P( X9 f/ V
  {
+ J5 S4 R+ T- p/ p     IWbemServices *pWbemServices = NULL;
" n& ]& _! ~; t     WideString wsNamespace = (L"root\\cimv2");) e: H, }7 i. g  ~
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
9 b* D6 g' ^- n. ~; d4 U      {  B* v# H7 j' g9 s5 q, ]
       IEnumWbemClassObject *pEnumClassObject = NULL;
- L' c$ Q* H- }& ?, Y        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
7 i/ o0 Z  E* i% D) B5 E1 W  g: a        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
$ J& |# Y: R$ n' m         {
$ @& h, b4 n) l- S$ d0 G5 h           IWbemClassObject *pClassObject = NULL;' x* ]) j- `0 g( r9 C0 `7 q
          ULONG uCount = 1, uReturned;
3 L  q7 V8 C0 r3 U, ^8 G+ ^% h           if(pEnumClassObject->Reset() == S_OK)
5 S  s/ B8 {; e3 i% C# }            {
: H! C& h$ n0 q4 [. e              int iEnumIdx = 0;# n& S: K" \- L/ N7 g1 g
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
; o! S9 S4 @5 _  i               {( S) B  R! v, x& t2 v5 N7 K- V
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
) ]0 B' t3 @- G: \# I
, A1 A0 j- R- |$ K- t1 {1 ?: s: |                 SAFEARRAY *pvNames = NULL;) Z+ g. S# T1 v/ m0 |) }6 `# h
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
8 z# i6 J2 P4 {) w                  {0 d1 J9 j2 A5 G2 i' X
                   long vbl, vbu;
/ b) A+ l" b+ Q: z9 O( m% S                    SafeArrayGetLBound(pvNames, 1, &vbl);# `! K) T4 X! h- y" p
                   SafeArrayGetUBound(pvNames, 1, &vbu);! [7 n4 w7 L/ ?6 O. y. X
                   for(long idx=vbl; idx<=vbu; idx++)7 E' i" @: }" p3 @1 H! t7 Z) t
                    {
' u$ _3 ]8 ]$ i( b                       long aidx = idx;+ w( O  v+ B4 w+ x* W
                      wchar_t *wsName = 0;
. R8 G1 Q+ I8 ]3 w8 W9 n                       VARIANT vValue;
0 L6 O9 D2 o, r: o! A  }0 ]! d                       VariantInit(&vValue);* P2 K7 @3 H+ e8 Q6 J
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
& z5 b: G% n/ B1 R" i! f+ j) r6 P) k4 v+ j
                      BSTR bs = SysAllocString(wsName);5 w( w8 A* t% Z# o- g
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);1 {% V( m4 M5 w; u9 c+ Y" G
                      SysFreeString(bs);2 `. m. Q& N" E; `
) H" T" W$ z1 Y, m" k
                      if(hRes == S_OK)
+ z# c" T) |0 B0 N- j( `  h2 S3 y$ q' |                        {$ ]3 X2 V& h- g: T
                         AnsiString s;# c' ]0 m. [6 R* v6 B3 g0 ^
                         Variant v = *(Variant*)&vValue;% L- k. r, T: Q
                         if(v.IsArray())9 ]" ]6 ]; F7 e: h: t) Q
                          {5 ~* ~5 Q* u2 U+ R  U
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
6 E/ [2 @, M: [  z4 V                              {4 u% h" E' ]$ |. |$ y! H9 n: D
                               Variant a = v.GetElement(i);) u/ @: m# d7 A1 u' y4 {
                               if(!s.IsEmpty())
' B9 y1 n) B5 }6 a                                  s+=", ";% ^! Z* H$ o+ j# f( {8 N5 Q* A3 g( \- T
                               s+=VarToStr(a);8 k2 _$ d  O0 U/ k4 ^
                             }- ^$ Y* H8 q; `. n
                          }
; m5 J9 [" _# R- o                          else' a( l: V- V6 q7 g: E! X8 {
                          {0 {' ~- R4 X. C# S8 o
                            s = VarToStr(v);
' _- V' G  _6 B" U                           }
: i. S$ X7 [  w* L  A9 A* y                          lpList->Add(AnsiString(wsName)+"="+s);
; `$ b$ E+ q3 N! t; M% M                        }. y: c8 f! P0 }
* W5 @' C9 u0 w. q- @" v3 ]
                      VariantClear(&vValue);
0 i5 h* s' Q0 e: G                       SysFreeString(wsName);8 ?# [( O( @$ p& I" u. |5 T( P1 L
                    }
  a# y/ c' ?% J. w, V) @) d                  }* i& O( e( ^3 D5 \8 V" Q  M# @
                if(pvNames)SafeArrayDestroy(pvNames);; B; e( C2 U( o
                iEnumIdx++;
! {+ G' @1 w: e! j               }. y  P( t; o( d; v
           }, f5 {" J4 a6 p: |- I8 T" i! v
          if(pClassObject)pClassObject->Release();
) j0 ~( \2 l$ v4 J  c  ]         }; e0 o( ]" J7 t, M" ^. T
       if(pEnumClassObject)pEnumClassObject->Release();! o8 z* ]% n* @4 O; x+ a
     }
2 h: C$ j! p1 T' r3 r: C, [     if(pWbemServices)pWbemServices->Release();
6 |- _  p: ~+ E( i- ~   }8 U& u$ e0 x' ~. [
  if(pWbemLocator)pWbemLocator->Release();
! o. Z6 B, h& `, x}: \4 U( u9 M3 E; w' p
//---------------------------------------------------------------------------0 x7 }* l/ d1 v% ?) \" m; Z
# Y8 V5 N4 b. Z( S) j
// 通过 WIN32_bios 获取 BIOS 信息:$ g6 j- h! }5 S$ z4 B
void __fastcall TForm1::Button1Click(TObject *Sender)7 N* |0 P% P9 U% r# N7 o* O
{2 ^, S, F4 o0 a* n% m' g2 C  c# f. a, D
   Memo1->Lines->Add("================== [WIN32_bios] =================");
" t2 V9 ], _' C6 K" N% b% U' {' a    GetWmiInfo(Memo1->Lines, "WIN32_bios");
9 {+ A# y$ M- O    Memo1->Lines->Add("");0 p7 N6 `# w  E( H- I$ G1 Z3 i
}1 s/ z0 x; h9 s  c# F; a
$ l6 l) n2 I: j. a
--------------------------------------------------------------------------------
( U, {0 w1 [' v0 \& J* L7 }. p' T0 B- d/ n1 |* M! T; l
WMI 可以访问的信息类型有:
' S8 ]: W1 ?& m( u/ k! p6 ~   Win32_1394Controller
' @6 Q! q+ y! |   Win32_BaseBoard
" _* B3 e$ @) b' Z   Win32_Battery3 x1 H3 \1 o* j! @0 [' T
  Win32_BIOS: w( |: f% v5 h/ Y+ i  V
  Win32_Bus
* f" Z% |, T/ c4 V+ T5 O- z  _# Y   Win32_CacheMemory
. Y7 k$ |) ]( }) z   Win32_CDROMDrive
4 c  i( ^6 D- c# ^# F0 s7 _3 J   Win32_CurrentProbe' P, {/ ]5 i& N7 M+ k, C3 P
  Win32_DesktopMonitor+ z, S  t3 h  x+ }' O( g5 p: M/ C
  Win32_DeviceMemoryAddress* W, \4 C- z+ u5 K0 X% [
  Win32_DiskDrive0 P+ ~. d! ?5 t7 V  a# A8 S
  Win32_DisplayConfiguration
6 p5 j. A7 e, z* b2 s( M$ T   Win32_DisplayControllerConfiguration: O) {. r; ~6 A2 s! S
  Win32_DMAChannel
4 N' h1 M7 c8 B& p$ L$ d   Win32_Fan
" b- t2 T) Q8 T0 G) g   Win32_FloppyController
5 a8 |0 ^- f$ [6 W$ P   Win32_FloppyDrive2 i9 O+ d) B8 L, q* e2 h$ k  I
  Win32_HeatPipe/ ^8 \- h2 _& V5 Z8 J
  Win32_IDEController) G( V# W8 H: z2 y& V) Q, U
  Win32_InfraredDevice0 ^- ]4 t7 l$ n. O
  Win32_IRQResource0 _/ m, c# I; r$ R* ~% f/ G
  Win32_Keyboard, ]. i6 U8 S: a+ E% D
  Win32_MemoryArray
' z2 [. G1 ]/ ^; \' m   Win32_MemoryDevice
9 P2 F; R+ H2 ~# {3 \. N9 m8 h   Win32_MotherboardDevice
9 ^' v8 F- c" Q+ t( I   Win32_NetworkAdapter4 T; R7 U: W7 _. x, w: Q! ~8 ~
  Win32_NetworkAdapterConfiguration8 b, P: s1 N9 d" ]+ j
  Win32_OnBoardDevice5 U* w9 a6 L# Z* i8 f
  Win32_ParallelPort3 R+ t$ ?$ F0 J( l% t; c; W" j
  Win32_PCMCIAController& x* n. w4 B3 s6 k
  Win32_PhysicalMemory- N1 T2 I. K* J
  Win32_PhysicalMemoryArray# d4 h9 [3 Y: w+ n3 A9 J
  Win32_PnPEntity8 t& R! p9 V8 X8 L4 N) c
  Win32_PointingDevice% F) P, e" Z! M) Y$ e
  Win32_PortableBattery5 Z/ @+ p: Y* m. D
  Win32_PortConnector
5 d; j4 J  Z& R6 n   Win32_PortResource
1 W8 s2 d: _; t6 }  _2 q/ V5 ~   Win32_POTSModem3 |! h. f/ g9 ~$ ]7 ?& r4 z, v9 q
  Win32_PowerManagementEvent$ M0 d6 t* ]5 z6 b0 q* v  ^% c& W
  Win32_Printer
' q) Q3 h0 |2 R! f$ h2 @   Win32_PrinterConfiguration
4 z( L8 R0 i0 R   Win32_PrintJob. N/ e' x9 f* u' h
  Win32_Processor
% [) q: A) H- B6 }# j1 C   Win32_Refrigeration- q9 y% U; A; k; T6 S2 |
  Win32_SerialPort! y" a% w* E! l: ]. f- E1 @
  Win32_SerialPortConfiguration0 u  P$ \/ w# y
  Win32_SMBIOSMemory1 z, @, v- d% |
  Win32_SoundDevice0 P5 v2 ]$ }- G8 c& L3 z  n
  Win32_SystemEnclosure
6 v! @8 V: ~) `1 M2 ^  Q* g   Win32_SystemMemoryResource" @) d# o$ t8 ^: o- {( T
  Win32_SystemSlot7 M3 g6 c/ k3 }$ N
  Win32_TapeDrive
; u: L  t: o! ?& u% c- z: }   Win32_TemperatureProbe! \* _  q+ {8 H8 F: `! i2 v
  Win32_UninterruptiblePowerSupply
7 r- V9 J5 T7 N/ A   Win32_USBController
) Z* C3 Y$ W% h, p2 @/ |  ]   Win32_VideoConfiguration& n) E1 w0 G( M
  Win32_VideoController
6 E5 N; K5 e  J% d, u) }9 r2 \   Win32_VoltageProbe& N" W1 X9 T8 z0 |5 K+ O. Z) x* L$ S5 x

! V' F$ x; y/ A2 V以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-29 03:36 , Processed in 0.021491 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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