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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)! ~% s2 U0 E  e8 a; l! Y8 q- b

. r& g% C# |8 Y( @% M0 u# h! e& z* A9 b6 z' c/ n: _
--------------------------------------------------------------------------------
9 w" D; g; H* B, k7 m8 x' M% t# @WMI: Windows Management Instrumentation (Windows 管理工具)8 h% g, b! ?( X4 v! z
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 + D) a+ S2 Z/ D/ F2 A- c
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
. J& ~7 y! H/ w5 V1 Z. G, q   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
4 ?! O2 }9 G6 ~1 [# I: P7 b3 m% F! w  ~/ |0 O4 j
--------------------------------------------------------------------------------' K8 V; b$ p8 D7 a2 M
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
% L2 j8 ^, ^0 w- o4 G* H
4 u, G2 N1 v; ~% N  y/ L--------------------------------------------------------------------------------
' `9 k: c* m; W- o/ S① 初始化 COM 接口:
) I9 O# F- s& B2 C$ V! t9 F0 y! M6 ^   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。9 j. Q  @1 e& W8 h( `8 E' N
  这两个函数在 #include <comdef.h> 里面定义。
3 g  ]# |. R  z8 ?
) _6 i; V6 N$ D② 获取访问 WMI 权限:
$ ]+ R% Y( ^6 W/ l, z8 H" H   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
& S" P1 K# f3 H   如果这个函数返回 S_OK 获取权限成功, 否则为失败。. E# e0 e7 `8 d
+ Z4 U. u% j1 _) J
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:$ R5 h! b- N7 ]; j6 y
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
$ ^7 y/ Q) I9 D1 U9 z
4 S8 T+ h$ j) [5 Dvoid GetWmiInfo(TStrings *lpList, WideString wsClass)% H# i. }. q+ }3 a- c; {
{# ^5 U$ W  \" o9 J8 @, D( Y6 u8 l
  IWbemLocator *pWbemLocator = NULL;0 S2 O8 ?* G6 A! o, X) ?
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)0 I; Q7 a( m4 k: a8 b6 a! {, {
  {! M- r) I( T# R2 i8 U% n7 v
    IWbemServices *pWbemServices = NULL;6 q8 o3 ~% k% @3 O1 s& ~7 w
    WideString wsNamespace = (L"root\\cimv2");" t: @3 ]) y% d1 h
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
. t% C( ~' Y3 Y$ g      {
8 s, L* r5 Y+ g$ b6 C- S        IEnumWbemClassObject *pEnumClassObject = NULL;
: j- y% j. T2 K! _8 A        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
' J# J$ h! [/ A- P        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
: d! r0 }$ P0 ~9 S% m6 P         {; @  _3 K: J+ u
          IWbemClassObject *pClassObject = NULL;& x& Y9 `6 b; O' z2 i
          ULONG uCount = 1, uReturned;5 N5 _0 E- \, B. O) G3 _& M
          if(pEnumClassObject->Reset() == S_OK)7 C( s0 v3 P% y; o
           {
7 v- o- r7 N1 `8 j              int iEnumIdx = 0;
; w( q2 @4 o2 z; m% s2 X# V              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
) W" J& A; \; K3 ?# X               {$ w3 W+ x$ K9 }  `, i; H8 d# O! N- o& r
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");$ C! |% |1 l+ z4 y% U+ t
! m* c0 W" z/ b, _- }; ]
                SAFEARRAY *pvNames = NULL;) Z. I8 G: c5 X  v$ p2 U
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)+ @% Q% u3 e8 s2 x* \8 F
                 {
4 T" H$ u" K2 V8 _5 a                    long vbl, vbu;
: V! b1 }2 p, C1 o* K; G                    SafeArrayGetLBound(pvNames, 1, &vbl);
) \8 j' H: s9 }. C! g                    SafeArrayGetUBound(pvNames, 1, &vbu);
% `' p: \/ z0 x* ^" |                    for(long idx=vbl; idx<=vbu; idx++)  Y9 [3 q# I) d& ]2 G+ H
                    {1 h3 z9 g- x2 M3 H9 ]5 M
                      long aidx = idx;
( J5 }; t/ {4 x                       wchar_t *wsName = 0;
) u, r4 h# s3 {$ p( O                       VARIANT vValue;
: v! m; x3 x' w5 ^5 P                       VariantInit(&vValue);( O6 b0 E1 F& ]- h( B
                      SafeArrayGetElement(pvNames, &aidx, &wsName);3 s5 I; o+ O* h! w3 L' E
3 ^8 \" u( H) }* `3 q" Q8 k
                      BSTR bs = SysAllocString(wsName);
$ I* Q* T; ^2 D' m                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);- |9 t/ T3 Q* }- v
                      SysFreeString(bs);7 y0 C' h! x5 m5 \3 f) O

3 d6 S% M# j3 {' q: L) B                       if(hRes == S_OK)
3 W7 k& }3 _8 k4 e                        {
% J; r. g1 }$ q2 |& o                          AnsiString s;$ J* p; L% g- j3 v: S# Z
                         Variant v = *(Variant*)&vValue;
$ I' y; t% f- z: x; P* T                          if(v.IsArray())" T4 K$ z9 O/ r, ^# c# t2 `
                          {% m4 u5 Y/ E+ L/ h8 K# R
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)5 j" R4 v- _$ L0 s" s, m
                             {7 F2 L- {: s+ [/ }2 T1 s
                               Variant a = v.GetElement(i);& |- V- b2 z" y1 a/ T7 `6 c8 V  s
                               if(!s.IsEmpty())2 \3 C1 u4 Y1 ^! Z
                                 s+=", ";/ q0 c' n5 G/ T, {) f! x6 v* h
                               s+=VarToStr(a);. H6 q- I% v& }" l) |2 _
                             }/ M1 D$ U) e" o6 {* }3 t1 U0 j# I
                          }
/ O- X& e9 P7 O7 j) M& M8 e5 S                          else
8 K- |' c5 X* s+ ^  J# R                           {8 Q- Y' K1 d4 h% A8 P( k4 P  \
                            s = VarToStr(v);
3 ~1 |& D& h6 \) H; L& ]                           }7 q. K5 f( B5 _
                         lpList->Add(AnsiString(wsName)+"="+s);2 ], x- X% L8 k' o  T! F
                       }
' {" b+ ~& d. G1 y. w- W
  C5 G5 R3 b. _+ J' @, B, O                       VariantClear(&vValue);. {+ h' C5 i) r0 C/ k
                      SysFreeString(wsName);
# Q0 \! F3 w( z# ?5 a! W1 W% ~  }! Z                     }9 j6 n5 S; K! o% }7 W1 w  k
                 }
7 b7 k) F1 a; r' Z                 if(pvNames)SafeArrayDestroy(pvNames);
1 }: v6 G% `6 O8 o  _8 {9 b                 iEnumIdx++;4 v" [& j) d' c* d1 s( q
              }. _2 |& k+ q& L4 Y0 k. R
           }# x) c2 s: F* ~- _& z2 I- [
          if(pClassObject)pClassObject->Release();
( L" Q$ R$ B" S3 |8 [" d: g  k         }: E' ^$ d' N! R" E1 y
       if(pEnumClassObject)pEnumClassObject->Release();
" Z1 A' N5 W' y/ B9 m      }
( U% |0 f( @3 A1 Z$ b' t- i# x: G$ w     if(pWbemServices)pWbemServices->Release();
0 f5 C3 \, Q- A   }
: _7 i) i1 d4 p5 Z  if(pWbemLocator)pWbemLocator->Release();
# K5 W9 ?! _9 ?% Y7 {) Q}, S/ h3 N* Z- T+ Z* o
//---------------------------------------------------------------------------
) R' F5 l4 V6 T: j- {6 V' z5 f
3 x$ L% I! `; ^; e  J# l// 通过 WIN32_bios 获取 BIOS 信息:5 w5 {2 P8 [- r/ |" b
void __fastcall TForm1::Button1Click(TObject *Sender)
9 N9 ?7 @# O' T3 |- a{
, @; P6 J/ c3 c3 f    Memo1->Lines->Add("================== [WIN32_bios] =================");  g# ~0 @3 p3 S  ?
   GetWmiInfo(Memo1->Lines, "WIN32_bios");. f4 M. i/ N6 q& w+ \1 i
   Memo1->Lines->Add("");
2 p) Q! |, o$ g3 Q* v/ [1 e3 {}
8 M1 F9 A* _: m( Y  _: S# f( E$ d6 l6 [! e( L  ]
--------------------------------------------------------------------------------- @* A4 P+ j: A5 T  x: d( I9 _$ k

; i' d' e- E( b; i3 r8 Q+ IWMI 可以访问的信息类型有:
9 d. u- c+ v& R: b8 u$ P+ g   Win32_1394Controller
9 B3 |$ s. J+ V5 [! |# P& Q   Win32_BaseBoard
+ r( Q& N0 x2 q9 V   Win32_Battery
& R& S8 d: i0 @, t+ C   Win32_BIOS
5 R. w. {* R) u   Win32_Bus
* G/ g- A) |( z1 A( B   Win32_CacheMemory7 B# @2 k5 o7 b( ]  a
  Win32_CDROMDrive1 y% D. u- `6 \# N& J3 E$ E
  Win32_CurrentProbe
( d4 Q- h3 r( h3 |" ]; U( y   Win32_DesktopMonitor9 S' m+ A9 g* h$ j
  Win32_DeviceMemoryAddress& m0 b/ a; W* U$ p& [+ k: W
  Win32_DiskDrive, R( p  I* a  U! p1 Q; W' S  A
  Win32_DisplayConfiguration
1 E5 k, {& Z4 j  s8 u9 L  s   Win32_DisplayControllerConfiguration9 B) ?# G1 M8 ~1 F& Z- c8 L
  Win32_DMAChannel
" l5 J6 W: a, [2 n3 g   Win32_Fan  K- U9 X' C# I8 g9 T
  Win32_FloppyController
/ Q# |7 V: }( I& C" L2 w   Win32_FloppyDrive. d" \; o1 {4 ]
  Win32_HeatPipe4 V% t1 [, p; x) @, j# O2 J7 G
  Win32_IDEController
2 g% {5 b9 a3 d; w, @   Win32_InfraredDevice* X) C& r- B3 _9 f8 u8 F, w
  Win32_IRQResource
0 X- ~$ {7 z/ }, {% t: P   Win32_Keyboard' \# i3 ~0 h6 H' R! Y. W: v4 B2 M
  Win32_MemoryArray. @5 c. d% u' f+ V
  Win32_MemoryDevice
$ B2 r/ }+ P2 K3 q   Win32_MotherboardDevice# Y2 s! ^& P$ N6 L/ t& r
  Win32_NetworkAdapter
9 }$ }. @9 s# b2 l& i3 w   Win32_NetworkAdapterConfiguration
& A% Q! _9 t% }   Win32_OnBoardDevice5 T. P2 f( S- k
  Win32_ParallelPort8 j. O: X" Z9 n
  Win32_PCMCIAController
8 A& a* V- T* r6 q   Win32_PhysicalMemory# i6 `1 A3 [, i! U6 c
  Win32_PhysicalMemoryArray& a5 R9 ?) ], w9 P( U
  Win32_PnPEntity
0 o" m# ?- c  m9 P   Win32_PointingDevice
. o/ C& k8 [: `   Win32_PortableBattery
( Q3 B1 q9 o8 I) K! `/ o! C1 N3 E/ }   Win32_PortConnector. r8 ?' k- A) {0 n3 b  V
  Win32_PortResource! ]/ R9 V1 E: o6 V7 l+ C
  Win32_POTSModem
0 [+ r( ~3 N" `, x. r   Win32_PowerManagementEvent
+ @* C- `7 N5 s, v* }   Win32_Printer
, o3 T- G8 ~  l- X7 d5 f9 ?   Win32_PrinterConfiguration
0 {- r1 W' s( B  |+ v8 j( T   Win32_PrintJob
1 c+ g! o; [9 w   Win32_Processor6 Q' o/ N/ X! s2 x# Q9 Y
  Win32_Refrigeration) T) v/ }* n' S) R+ i
  Win32_SerialPort
. V6 t+ N) j4 v4 _7 v( O   Win32_SerialPortConfiguration6 K4 b/ W% b6 k, s. I* L9 \
  Win32_SMBIOSMemory0 n3 c0 I- k% l2 g, U" v. D0 m
  Win32_SoundDevice' C) a; S5 Q7 d# I
  Win32_SystemEnclosure8 C# }4 O6 L2 T) k
  Win32_SystemMemoryResource
6 \# \$ y3 Q$ V; z7 Z4 t: a   Win32_SystemSlot( X& Y' T3 z/ x/ e! Q* O1 I. t
  Win32_TapeDrive
' k# S3 g9 [  M2 a, p* Y  R; ~   Win32_TemperatureProbe5 z4 M+ {* K; ^
  Win32_UninterruptiblePowerSupply3 u, y: H7 W/ h' q% G
  Win32_USBController
+ R9 f3 v, M9 V3 e# X  B   Win32_VideoConfiguration
; n9 M! b1 _- W8 A. e' A   Win32_VideoController
0 D5 s4 e4 {1 }   Win32_VoltageProbe5 \7 j* W8 t- f/ u# E9 I' }# z

5 f  c3 E: o! {+ t; }. r3 Y以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-19 01:00 , Processed in 0.018658 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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