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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
7 k8 R/ p, x5 U9 ]0 T, D6 g! q1 @
1 ?) c! J9 q* W; b
--------------------------------------------------------------------------------0 d  |: \* c( E8 b4 G4 F7 U1 R
WMI: Windows Management Instrumentation (Windows 管理工具)
% @' X; y% `" q) d( R0 }( Q   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 & h" d& u) l# n! Q5 N% ^
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
. {( F2 h; g" [7 X) {   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
% \5 b2 i, T* M7 W- ^) _
- n8 O% A+ e. g& c/ ~6 r--------------------------------------------------------------------------------5 P9 _6 t' t. B6 _- D
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面5 M4 e8 K( K; F$ _- Y6 h

! S8 f& _  a8 r1 Q" y$ M--------------------------------------------------------------------------------1 n" x5 q( ~: m
① 初始化 COM 接口:! O0 k4 c, H" L
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
  w; x7 X; |2 o) \   这两个函数在 #include <comdef.h> 里面定义。
; G6 k4 L2 l. Y3 x8 q( A! J- t, B
/ [( }4 g/ `) {* @+ a8 V" c7 t2 h; l' L② 获取访问 WMI 权限:
6 p: S  z  \7 y. L7 W) D5 }2 x3 d   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);: v5 ^  p2 ?5 H& ^( f3 w
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。* l1 R) d; J# W# Q5 ?. W/ z' J

. z* y* D6 q2 t' ?. H8 n% `6 r8 p③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:: Z% n  E! z6 R( O1 v* x
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
8 l5 |1 m8 G. C3 T
& [$ |$ u4 ^8 t% C4 M/ j; hvoid GetWmiInfo(TStrings *lpList, WideString wsClass)2 B- z6 M# `2 k1 O1 `
{  t( Q. f4 J$ j' R+ ^: S! {
  IWbemLocator *pWbemLocator = NULL;0 Z8 X1 ?3 g; c) M( l1 w
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)( v) [6 v$ U2 n4 U( `  u# n
  {6 g/ M6 K. W0 {) `9 R
    IWbemServices *pWbemServices = NULL;+ B7 e% m( M* O$ A6 E, n* X
    WideString wsNamespace = (L"root\\cimv2");- j& s. l5 l  L& ~! K: b
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)8 v# \/ u6 d; i  q
     {
- X' O0 i( t1 X9 e, Z        IEnumWbemClassObject *pEnumClassObject = NULL;2 ?, W9 R, v+ N
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
- U2 s9 q% ]1 D! ?( I$ k        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK); j% y1 |' c: ~
        {" g# N  P' D9 y9 o. v# r
          IWbemClassObject *pClassObject = NULL;! r! `  U$ \' [( y, J1 c) Z
          ULONG uCount = 1, uReturned;
9 W- J9 v% y/ B4 J3 N# E0 W# G           if(pEnumClassObject->Reset() == S_OK), r6 c! Q5 @1 P  i' c5 O9 q6 Z
           {4 @, @6 s$ ]1 F. E7 U# G
             int iEnumIdx = 0;3 S' |* e: {# @4 {5 a8 C4 \$ d
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)" l6 q# h( P' k2 R
              {
3 t8 V0 ~  P& j% F5 A                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
+ M. i: k  p4 s/ C1 y. S: z$ J4 b# `) [9 t
                SAFEARRAY *pvNames = NULL;6 M9 y8 Z% l6 S
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)( ^) z( R! S, N3 S! D$ t* T6 p7 y- w
                 {
" a, x+ T8 \$ O$ u9 A" a                    long vbl, vbu;8 }6 o( V' p) w  T
                   SafeArrayGetLBound(pvNames, 1, &vbl);. b+ K$ f4 j' j' @
                   SafeArrayGetUBound(pvNames, 1, &vbu);
* }3 M$ q: H# g- K                    for(long idx=vbl; idx<=vbu; idx++)6 Y# y) P' E$ \: v& i) l" c
                    {7 B3 {" D, H1 v) w" n% H9 N
                      long aidx = idx;
. q$ S- E! b8 T' f: Y                       wchar_t *wsName = 0;
0 r( [3 f* W3 B* o- L                       VARIANT vValue;+ N4 x& C8 M+ Z1 @$ G) R- v
                      VariantInit(&vValue);2 K: z3 ^2 ?% K) h0 B" `
                      SafeArrayGetElement(pvNames, &aidx, &wsName);" ~1 B1 v+ Q; B! r) w, M

7 m, O$ Y  \- p, g                       BSTR bs = SysAllocString(wsName);2 U  ^1 v) m. C* x+ b/ B6 [
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);) M! B9 @: E9 ^. U
                      SysFreeString(bs);
( Q+ @. N0 i6 |2 x& d9 x. H
% n. Q6 I- I# C& n/ ^                       if(hRes == S_OK)
. ?1 p- S/ r/ O* K                        {! e: {9 a+ p, |6 [& l: C9 l8 ^
                         AnsiString s;
0 q" \2 t" p- s' ^) z& f                          Variant v = *(Variant*)&vValue;% Q" h) N; R0 H- R8 h
                         if(v.IsArray())
6 u7 g: F) n2 i4 c* _. J, ?2 b                           {* K6 S4 K; ^: s0 a
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
# Y0 X! `! v  D2 t+ |                              {
( F) x4 S- w2 }) H: u* Z/ B5 {; `                                Variant a = v.GetElement(i);7 L; W+ [/ c' {. D# A0 ?2 D
                               if(!s.IsEmpty())- L7 o. F. S4 n) G
                                 s+=", ";
! f. _0 ^8 k9 Q+ ~! P5 c( w                                s+=VarToStr(a);
1 [6 h; x& x5 @+ s                              }9 S4 q8 \% N: [2 ^7 i
                          }* h( r, i1 X( C) j! T: `2 ^1 n
                         else
5 F+ }6 L) t1 G5 g3 t% V                           {
8 \/ V6 \; c, [% ^0 r                             s = VarToStr(v);, s: G, X4 A8 q
                          }+ Q/ H! t: _5 w7 w, b
                         lpList->Add(AnsiString(wsName)+"="+s);& H/ K7 H1 g( p
                       }
- _' I) \  V2 P" W# B" G0 {9 D1 Y
' m  q% d, H7 u  I/ S# M                       VariantClear(&vValue);
) B4 G( U# m- _; W; [6 u                       SysFreeString(wsName);
  Q$ }* U% |  i. N1 l                     }4 S. p% i7 |& r/ W2 ]* T7 R6 S' o
                 }, D( Z! ^* E$ L4 O$ X
                if(pvNames)SafeArrayDestroy(pvNames);0 F/ e- W6 Z0 P. D" k/ s5 P0 H
                iEnumIdx++;) Y, o5 R. E" A' W/ n' G0 Y
              }
# V, w0 l$ @8 r* C1 |  e- L& q            }* a  j; n- |. W! g$ ~2 P9 v
          if(pClassObject)pClassObject->Release();
6 T4 _, j! F3 x7 {  x# G% i2 Q         }: m$ Z- i% w7 ^
       if(pEnumClassObject)pEnumClassObject->Release();
9 J1 Y1 r0 ?1 U. y+ u8 C" j4 ]! U      }* W; b! g8 W& v, x& P
    if(pWbemServices)pWbemServices->Release();6 r+ b. G1 x3 u5 a8 h. R# Z
  }5 i' _. U/ P6 K% F$ c) h
  if(pWbemLocator)pWbemLocator->Release();( l# Z# c; S2 J: S/ v; J
}- {9 ~3 Z# ?+ j: I; a7 W
//---------------------------------------------------------------------------
- i7 T! J9 t  j4 l: H( [) _7 Y. S0 k" E% k3 d5 {9 I1 D/ O
// 通过 WIN32_bios 获取 BIOS 信息:
! B/ i4 h8 {. i: P5 zvoid __fastcall TForm1::Button1Click(TObject *Sender)* `. j5 U9 C# ]* {7 c
{$ U7 ~' w6 ]3 P* E6 h
   Memo1->Lines->Add("================== [WIN32_bios] =================");9 W# u) f0 b8 B; u7 R
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
  O3 d2 c" |, M! b, M4 S    Memo1->Lines->Add("");; a9 j- f. f( S, K+ E
}: L, K$ W" I# h% f
3 R; \* W5 R6 r. f
--------------------------------------------------------------------------------
" w' r$ i  V0 x" J+ Y
2 t9 I5 D+ P; y$ x0 }7 P2 c; zWMI 可以访问的信息类型有:
5 f0 R- l* k: i5 z% \0 u' o   Win32_1394Controller
$ W. G# u' W4 I" u/ g   Win32_BaseBoard& I: G* l4 [! K+ t) F
  Win32_Battery
+ J2 m. x) d& E4 q: p' T1 V   Win32_BIOS
! I1 M% [5 g# m9 K6 \! @7 r$ i   Win32_Bus% e$ `1 h- E" ~/ }
  Win32_CacheMemory
" M+ h8 p, `. X* n. ?   Win32_CDROMDrive8 U2 w# g6 L) I! f
  Win32_CurrentProbe8 a# U- Y/ ]) J3 V: T
  Win32_DesktopMonitor
. N: I+ n6 w& Z& D, o$ x   Win32_DeviceMemoryAddress
2 o/ N& m0 G! k7 R6 z   Win32_DiskDrive% r) M4 `% S+ b5 z
  Win32_DisplayConfiguration
+ L8 W' n; z4 o: b   Win32_DisplayControllerConfiguration7 v/ g4 U( r- t9 U, L3 M; b% V( L
  Win32_DMAChannel
1 x7 Y+ q; T7 G& X5 [) m   Win32_Fan
/ V, X, c0 |1 \& c7 J! Y) B4 ?   Win32_FloppyController. _9 U6 |1 @2 M- q# X
  Win32_FloppyDrive
  u0 a6 {, O% I4 E6 a* y0 V1 c! j   Win32_HeatPipe
: d8 U) }/ i" C: z' Y   Win32_IDEController
8 J: A( S; e/ q* w3 `1 u5 T, ~   Win32_InfraredDevice
8 K1 C; D& j( O" n. j   Win32_IRQResource# Z; v# I! m% @3 l, ]+ r0 Q; h
  Win32_Keyboard# C& S$ J" Z7 B: t0 ]8 N" U" X
  Win32_MemoryArray' L5 p& ?* M7 f' n% e
  Win32_MemoryDevice# ^# W( U' n/ h( ~% S6 n- r) Q
  Win32_MotherboardDevice
4 U$ ?+ S$ M$ Z   Win32_NetworkAdapter! F% K! B  |5 Y
  Win32_NetworkAdapterConfiguration
; A/ a+ Y" c, x   Win32_OnBoardDevice" ^9 ]9 L+ B' }# @0 P1 Y
  Win32_ParallelPort( N% A. l& K2 _& G9 E) f. I+ e
  Win32_PCMCIAController" P. X8 s3 E; {. Q& Q6 K, H
  Win32_PhysicalMemory
' _* n% _3 ?9 f, U2 T6 o   Win32_PhysicalMemoryArray
* H/ ]2 I- m' ^4 _   Win32_PnPEntity7 K7 S" L6 [; T1 }) j/ s$ j, ^
  Win32_PointingDevice
' @! b: h; I: j/ X& F1 [" l# n   Win32_PortableBattery+ h9 T. Y& G6 k& a
  Win32_PortConnector
7 y0 U* g# W4 q4 S) ~/ b% u   Win32_PortResource& r: i" [4 V3 T. B1 v
  Win32_POTSModem# T3 P# r9 O: O+ C
  Win32_PowerManagementEvent
2 R7 P) @1 b$ h   Win32_Printer0 Y& ~" P- ?3 ^& Q
  Win32_PrinterConfiguration
; S5 Z: J+ `0 ~+ E   Win32_PrintJob
  A( j9 Z% a* X! v/ b! I6 B   Win32_Processor
5 _3 I0 @9 v' Z* V) E& h   Win32_Refrigeration
( f* H9 [) W3 t3 x0 `1 M+ I   Win32_SerialPort
; I! t) }" c' M3 u9 L: q, O( p# V   Win32_SerialPortConfiguration# U5 t6 H7 \( j
  Win32_SMBIOSMemory1 i: a+ t; g% n
  Win32_SoundDevice
$ E/ `  J( s. c   Win32_SystemEnclosure, E4 s' _0 J' Z- b% b; U  `4 Q
  Win32_SystemMemoryResource4 }) s/ W- W* u! ^
  Win32_SystemSlot
; }0 J9 R- j$ T   Win32_TapeDrive, O* I% i6 q" y+ |& I
  Win32_TemperatureProbe3 H. r2 @" u2 n# W
  Win32_UninterruptiblePowerSupply+ M7 ]; t* b8 z4 s! J+ F7 z' Q
  Win32_USBController
: V7 d2 S7 h$ r/ y/ U1 I, k   Win32_VideoConfiguration+ ?- k) O% M+ G: G1 L7 V0 \
  Win32_VideoController
2 N/ P9 [. G+ N   Win32_VoltageProbe
6 y2 f8 j. f: K' e* n
; k7 W4 K) t. {! R. q. q( [以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-22 01:50 , Processed in 0.019482 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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