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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
7 ^$ C/ |  R! X0 v' }4 U& X
( f: ~# B; D# P1 ]+ k7 v9 W
" z4 L! M" Z0 |1 X( K6 m$ m5 E+ M--------------------------------------------------------------------------------
* u0 T  \% L; Z: P7 QWMI: Windows Management Instrumentation (Windows 管理工具)
2 `9 b/ U  N  o& I- x9 J5 o: [   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
- B1 R9 H$ }8 _6 z5 ?% t   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
7 p3 m* z/ n2 |+ O   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。   o& u; N3 T( ?8 z, [# Q, S& M$ l
% Z1 ~8 w( t1 W
--------------------------------------------------------------------------------4 D& K1 N, J+ m
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
9 Z9 w2 O' f" o, N& ~& u6 t( l" u0 R$ b
--------------------------------------------------------------------------------6 L4 k' Y( Z: B/ g6 g) r, W. f
① 初始化 COM 接口:* F' L2 n' \. Y% }* G% `; L: g" o
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。& Q* W9 `! g. R) O8 ]
  这两个函数在 #include <comdef.h> 里面定义。
9 v7 r; D! F! V. c$ s% K7 j2 b
& n4 L6 q( E+ u② 获取访问 WMI 权限:. b3 Z0 r* G2 F8 E% u
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);* U! o1 v+ `: v$ w% s  U* ~
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。4 a; V% @: D3 u* q: m( t; X7 Q$ G
) ^5 R- A/ _* |  {
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
: p5 D( L& d3 P: N0 o; ~   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
( J  E2 e4 j( w& i" A$ O9 y5 X
: E; ]0 [* p8 I# g2 Lvoid GetWmiInfo(TStrings *lpList, WideString wsClass)! B9 ]0 X% {1 Z$ O9 \6 q
{
) U3 j; x1 U# G8 e# z  M  IWbemLocator *pWbemLocator = NULL;
* g2 r: I3 e) ^1 W0 v# |, O9 |  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK): M8 `( E: f( P9 K+ D
  {
& b6 r9 w: T7 Z/ N' |     IWbemServices *pWbemServices = NULL;8 ~+ K9 G: \9 ]- ~+ g! C- t& D
    WideString wsNamespace = (L"root\\cimv2");! x) Q- p0 n1 \6 z' T
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
# y. k9 B: ^3 A7 V" }& S      {
  E$ l) Z" Y2 X( e6 T1 C+ H. A        IEnumWbemClassObject *pEnumClassObject = NULL;
6 K' `4 {- G* M9 @8 e        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;0 C! ~& a# t$ g
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK): I% R! h! t" M' J$ |! r5 m2 O
        {+ _/ b+ z" P2 f
          IWbemClassObject *pClassObject = NULL;( e& G* r: U/ _  W
          ULONG uCount = 1, uReturned;
. g/ O) d- C7 w* p           if(pEnumClassObject->Reset() == S_OK), H& ~1 U( b* X2 M5 s$ \
           {
3 R, ~! G- y/ ?4 _' P              int iEnumIdx = 0;. w! z  G: \. v8 j* R
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
, `0 K* G  B6 k               {2 |) Q/ C" r; b1 o: n
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
% n3 J: N9 c; @4 z) F2 T# Y1 d$ F' r! s9 a4 i) M2 K7 E  b
                SAFEARRAY *pvNames = NULL;4 w7 t0 l; x+ U# r1 W
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
- T  D: h% G$ T$ c# W- m1 j4 h                  {
" B+ y/ L9 S, [  R; Y1 j                    long vbl, vbu;6 x4 Y& a! z* s! J
                   SafeArrayGetLBound(pvNames, 1, &vbl);6 E% D1 T6 o; y) J) o4 B
                   SafeArrayGetUBound(pvNames, 1, &vbu);
* m- ]# f  x- K$ ]" A) K                    for(long idx=vbl; idx<=vbu; idx++)! t& h) M5 Y+ J
                    {
6 n( j/ i% G5 m2 |/ \                       long aidx = idx;$ E' b" @% A. @: ~
                      wchar_t *wsName = 0;
- \3 K& N9 e% Z7 z* T2 Z( m8 n                       VARIANT vValue;
, b* T" E, s3 ?6 K$ V/ o" a0 I                       VariantInit(&vValue);
7 z$ g/ L8 J: F  [+ X$ `                       SafeArrayGetElement(pvNames, &aidx, &wsName);6 Q6 T! E8 P* x. b4 E! T9 ^
' Q$ _# z- r4 n
                      BSTR bs = SysAllocString(wsName);
* y; e% h' Z5 k; G. L/ \                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);; V, U8 G6 v% }0 K, m; ~
                      SysFreeString(bs);  u9 h$ j. l  Y7 B) y

* G: i& i# K% @5 C- `0 {) M                       if(hRes == S_OK)
" }5 R8 B2 A7 X% z! ]2 j1 o% ^) V                        {
( C; S0 v- n9 K- Y6 v                          AnsiString s;
3 T" s* B# l2 Q+ Z1 m$ F# X                          Variant v = *(Variant*)&vValue;8 X3 x6 A8 }0 H- g3 F& ]
                         if(v.IsArray())- L; h/ [! Y" P) z/ @+ @
                          {
3 h1 B- |9 X7 d! a& x3 O                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
! j$ r1 t# a% a' @8 z                              {
+ \/ l1 }/ p% r/ [                                Variant a = v.GetElement(i);' X6 o1 S' e, P4 m
                               if(!s.IsEmpty())( A4 _$ j2 ]' R* \: |. I
                                 s+=", ";! G6 P: O3 [. X1 D
                               s+=VarToStr(a);" ~+ n, g* v0 T$ T
                             }
6 u0 D: R& P: H$ f. x# F3 o0 I5 E                           }
4 V4 b) A7 Q* C' S. I) S' P                          else
5 h" z6 f( F# Q7 _                           {
. o) V! p& W& s4 y/ x                             s = VarToStr(v);3 R( w* z$ K" q- |7 ^$ L5 _4 S
                          }
  H% j/ B& n7 V6 i  @                          lpList->Add(AnsiString(wsName)+"="+s);& E8 [; T1 |) V+ _5 G; i- n
                       }+ a" }! q# m  q& r; Z
4 ~& D9 D& e/ O) k& ~, n6 r8 [) Z
                      VariantClear(&vValue);
( H; u1 a' `: y7 M7 u9 F2 Z2 A8 E                       SysFreeString(wsName);
* o' v: Z% a, s7 H# J                     }. ~5 Q! T/ s# r# ~
                 }
& d3 s0 \! B+ Y' i: `1 k2 V                 if(pvNames)SafeArrayDestroy(pvNames);. A. M; C% A6 C
                iEnumIdx++;
! w! x) w7 j2 t7 H! C) a               }0 d/ G1 `. q  p0 r
           }- u9 w' ^) g5 G( |
          if(pClassObject)pClassObject->Release();
  y% g! v% s3 \5 ^% `* e         }+ I. K# |" c( S* U
       if(pEnumClassObject)pEnumClassObject->Release();
( E9 i, j9 k+ U3 q; K8 g. b; h% `5 A      }! F0 @% Q0 ]5 D
    if(pWbemServices)pWbemServices->Release();( t4 ?2 W" S. N, @5 i, f. Z3 a& d
  }, b8 m$ L) q; M
  if(pWbemLocator)pWbemLocator->Release();
: B) n  B. @" i}1 R" t, H7 _" A+ ]' s
//---------------------------------------------------------------------------5 G4 p* w% d9 R4 S( v) B. T
& s7 z, k& p9 h+ }) z& [
// 通过 WIN32_bios 获取 BIOS 信息:4 H7 x) l1 Q! @  }1 A* p3 w
void __fastcall TForm1::Button1Click(TObject *Sender)
9 R. V% z, E% E8 X{
( ^+ U5 a5 q% ]% u' ~8 T    Memo1->Lines->Add("================== [WIN32_bios] =================");8 Q0 g9 g+ u) O& a
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
9 H3 o' B4 M" S" y" L' x    Memo1->Lines->Add("");
6 v* C. _2 `2 j" }. _}" b/ ?! [% U# l" J
; ^& p& u+ v* L$ c
--------------------------------------------------------------------------------
1 w' y9 U6 j; |) J
4 ^1 }( B* O' f. rWMI 可以访问的信息类型有:
" M$ m: M1 o/ n   Win32_1394Controller( Q. k+ ~4 p5 y
  Win32_BaseBoard! N3 H, S9 s. n# n
  Win32_Battery
8 M- }$ @" L: k   Win32_BIOS3 O; }) T; q$ {' d. k
  Win32_Bus
5 l3 d5 n! m; H0 [! @; M; V   Win32_CacheMemory- O2 s; Q' F! P) g- p$ q
  Win32_CDROMDrive
' ?* v7 U9 V5 j; i7 J5 A' Z   Win32_CurrentProbe( Z0 ?9 Y. _5 l
  Win32_DesktopMonitor
9 }: K2 T! b, w, W3 E7 {   Win32_DeviceMemoryAddress
9 B. i. f) z6 u. R, z   Win32_DiskDrive, f/ ?8 Z6 a- U5 X; o
  Win32_DisplayConfiguration* ~2 e' z+ i; o2 z3 s
  Win32_DisplayControllerConfiguration
6 o6 {8 E5 j" C2 ^$ s/ E1 Z' O   Win32_DMAChannel
4 G/ o# H) t& @$ L   Win32_Fan
6 i( J' C0 P: @1 F   Win32_FloppyController& Y' o4 e  }- n& f
  Win32_FloppyDrive7 f; w2 M+ ^, K8 N8 A! {9 U6 k
  Win32_HeatPipe
- f* S. ?; U% P   Win32_IDEController
/ `) ]3 R* S( p& |4 I7 p   Win32_InfraredDevice
) J7 f! E( {; f2 P   Win32_IRQResource2 |" x6 {$ e8 _  P
  Win32_Keyboard
8 S2 M, `; ^( X6 l( f1 v$ d   Win32_MemoryArray
  J+ E- d4 g" h   Win32_MemoryDevice
4 {' @9 q; y# s8 u1 S; |7 _  V   Win32_MotherboardDevice
+ f& J( b/ C: p   Win32_NetworkAdapter
* o8 A0 h. y2 }; r   Win32_NetworkAdapterConfiguration" p) L; E/ U0 G( z0 {5 P* @8 A- C" K- e
  Win32_OnBoardDevice7 @6 E9 n; ]# S, G/ d
  Win32_ParallelPort
& ?' ?3 ~) ~9 ^+ M   Win32_PCMCIAController
' j2 p( X. E2 R3 R2 I6 G   Win32_PhysicalMemory7 }) x  N$ P, j; E$ h0 `; K
  Win32_PhysicalMemoryArray' z$ z# p9 w- \7 ?0 H  a0 `" Z
  Win32_PnPEntity4 r# S6 V  s, Z! _
  Win32_PointingDevice  a, X/ \3 m$ P9 s1 z3 u1 @
  Win32_PortableBattery" e: J9 Y" t/ m( B
  Win32_PortConnector
  O  I$ `, h4 v' E   Win32_PortResource& J% `' t) B6 u' J& |$ B! c
  Win32_POTSModem
( I' Q2 o; c! w- l   Win32_PowerManagementEvent+ h1 q: g/ m6 A2 }' a
  Win32_Printer
( P+ v. Z: m6 m% _# m3 K   Win32_PrinterConfiguration* n: Y$ l+ t9 \( [5 d- W
  Win32_PrintJob
3 B3 q' y" b) h, O  K/ Q) M. t( Q" d   Win32_Processor
' {, {% b0 d3 H" }   Win32_Refrigeration
& }7 s9 a: H8 Y7 d: q   Win32_SerialPort
; b' z: f1 P- a, S- _- l   Win32_SerialPortConfiguration
) u! h7 T- ]. }6 m& H; W. O8 P) r   Win32_SMBIOSMemory
  E; d! Q" e4 d/ ?! t$ w7 s7 x- h   Win32_SoundDevice
9 [/ j4 I6 l: r8 G, l   Win32_SystemEnclosure
5 U- S' G' Q! |5 G0 y8 a   Win32_SystemMemoryResource+ A5 ]6 e2 d) B5 Y8 b- _
  Win32_SystemSlot+ s# [0 v+ o6 e. t0 `: X
  Win32_TapeDrive" Y* c7 f/ }: g+ T  \
  Win32_TemperatureProbe
7 J# c( }$ h* }# \9 e/ j# X8 t6 B7 f   Win32_UninterruptiblePowerSupply
# u4 M- D( ]9 b! d/ K2 g/ @; [   Win32_USBController) w2 T+ x6 k5 D+ M
  Win32_VideoConfiguration
0 w: ~1 O" Y- R7 @   Win32_VideoController
+ z: z) m. ?3 D. G) L/ c; Q+ V   Win32_VoltageProbe4 I! v8 e% `. w

2 a7 q# @& [. u! k4 l% A以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 01:04 , Processed in 0.020339 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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