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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
7 z) }/ v* _) ^3 a8 y7 @* D- u9 ?# d  G; b
+ T5 [  Q( n8 ~  H1 {
--------------------------------------------------------------------------------. o1 ^4 [3 Y5 I2 a" H; Z
WMI: Windows Management Instrumentation (Windows 管理工具)
6 d9 r! N0 N- f; s) G3 E7 x2 R   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 5 V; t, H$ ?9 w& a
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。. u( u' F' G: l
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
3 R8 G1 ~! i5 D  _3 s* P/ S6 M% \6 y6 G1 J, \% N9 a* U
--------------------------------------------------------------------------------' ~* c. a1 B* w& J' {
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
4 U  b! ^) m8 [; N! U0 A  m! p7 v. x+ ]  p. z4 F( _6 H
--------------------------------------------------------------------------------
1 G, M! y6 x4 r% v* K① 初始化 COM 接口:1 U& b2 _1 H9 z5 {$ m; {
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。6 s0 ~/ G/ O; c: F
  这两个函数在 #include <comdef.h> 里面定义。( d/ C3 E' k9 A% t1 {$ S. \' H  P# R

' W5 h0 t- V: n9 ]4 }; [! `1 p' {② 获取访问 WMI 权限:
  {/ C, [. y' u" s! d: m   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);9 X1 }  b7 e+ u% S# ]7 _
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。  z! _. g$ o/ F

3 c& v$ W9 ]* v; s5 I③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
0 w" z7 |$ A. V7 d* _1 k   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。  E  T# Y3 ]! T+ N
6 T& r4 z8 D# f
void GetWmiInfo(TStrings *lpList, WideString wsClass). w, t+ L3 m$ X' K/ l
{( q, z4 D. r  ~
  IWbemLocator *pWbemLocator = NULL;
/ P, c4 X, S( ^& g/ W8 I  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)" S. L* v( }  g" }1 x
  {
+ T5 I! O4 x) O6 z4 c     IWbemServices *pWbemServices = NULL;
9 i( u) j4 L7 n- y# a, R2 r     WideString wsNamespace = (L"root\\cimv2");3 S" I4 F' w; R& J& x
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)& y$ |, D9 g/ d$ g
     {+ U. M( f4 D) P4 `2 P5 M
       IEnumWbemClassObject *pEnumClassObject = NULL;! a3 K7 ~( [6 O9 _
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
4 j9 C3 K1 m8 I6 H- Y& w        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)/ W# D  E0 R$ q9 U4 D
        {
( k5 l8 g% v7 {2 a           IWbemClassObject *pClassObject = NULL;4 }* s: n# A* W* X! L
          ULONG uCount = 1, uReturned;# ?/ ?3 {# A" A+ q& `- G* q
          if(pEnumClassObject->Reset() == S_OK)
6 ^  y+ l3 m2 J4 E            {9 F& z* X/ B5 T1 E3 p
             int iEnumIdx = 0;. @# k, `. V$ m0 `, U. B" X9 v
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)/ y! q( S7 \: I' ?
              {
/ \* V. \9 G  j+ l. n  _/ u) }                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
5 F; n; y  y& M$ k$ O1 I: @. g
( Q! U7 h" r3 ^7 E% ^0 Y                 SAFEARRAY *pvNames = NULL;
4 h0 s8 ]+ i' I+ L2 O1 J' H: F                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)+ @' x5 |/ H- U" a3 y
                 {, Z- ]3 ?0 a! W( i& u8 |& a  l
                   long vbl, vbu;
1 }' y9 o  A1 i& n, d: t! h6 _                    SafeArrayGetLBound(pvNames, 1, &vbl);
) _+ O9 F! w' U2 y) v. i                    SafeArrayGetUBound(pvNames, 1, &vbu);% o+ C) h- I- d- k" x
                   for(long idx=vbl; idx<=vbu; idx++)( G% G: `" r5 X8 i+ k7 S
                    {3 o- ~' {" p! s8 u3 Y: s) b
                      long aidx = idx;4 R6 t6 F# D. w" f- s
                      wchar_t *wsName = 0;1 [9 c* K3 D: G) x( J; V
                      VARIANT vValue;0 S) j* h6 i" d. z+ i
                      VariantInit(&vValue);7 I( Y% C; i: u: `( _" q
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
9 o; t6 z0 L# e: |6 ]) h+ j8 ~$ Y" u* {7 W
                      BSTR bs = SysAllocString(wsName);
; A% b0 f5 x* p2 `  r: A                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
" U6 d& B5 Q7 d' E0 I9 J                       SysFreeString(bs);
' X( y$ E* ]' `" O5 b6 [
1 B* h' a9 @5 f( i                       if(hRes == S_OK)
) v* r7 P1 X" J( I  X' P. g                        {& h! Z% I# }, l% W) M
                         AnsiString s;$ r- ?  Q/ f5 ~# N
                         Variant v = *(Variant*)&vValue;
# n1 k" o  I4 i$ {; Z4 U) F% }% |                          if(v.IsArray())0 c8 ^$ a; r6 V1 H; A) u6 ^
                          {( E- ]' q2 D! E6 z0 J! a$ S: |7 R
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
; ^9 }( N( j5 m0 f; _# p' Z                              {
, r3 \5 N) D' [6 U* H  Q                                Variant a = v.GetElement(i);
# O3 d+ B+ q) A4 a; q9 D0 E/ L# U  b" z                                if(!s.IsEmpty())% \: v% x* s( O
                                 s+=", ";
+ ^( T& s  v# i3 P' y; I$ @+ w! y! ?5 v                                s+=VarToStr(a);
/ t+ Z" [* C& W) ^                              }; ^& `. B+ s2 B) W
                          }1 l( a2 Q1 y8 e0 _7 t: ?' [' ]4 Z
                         else
7 z, B, L$ T6 Q% ]                           {
( U: {0 N$ K! D/ J9 l                             s = VarToStr(v);% X% N! T8 N' u
                          }$ S5 O, G( {) ^6 J' ~
                         lpList->Add(AnsiString(wsName)+"="+s);+ m, ~: ^, ~; P
                       }# w$ ]( p/ \# u

, ^, z7 R, @' D  U) I3 ]8 C' ~                       VariantClear(&vValue);
. _) r* c* H) k                       SysFreeString(wsName);
+ M0 @2 S) T7 Q+ [$ J                     }2 J. J2 {' g* V- u' O8 o9 j
                 }
) M7 f9 T8 y/ P  ^( q+ y# E                 if(pvNames)SafeArrayDestroy(pvNames);4 z- o0 T9 Z. d7 g& h1 n4 ?
                iEnumIdx++;! Z- g- q" m5 d# `( B9 A# f, Q
              }: m, [! ^6 k1 Q& @
           }* H* i8 r8 [# b" r* |2 L; I/ e
          if(pClassObject)pClassObject->Release();
) ~* y- _0 C' n" l1 d3 Z3 w" {# Z2 _         }
; P2 r( F1 d5 S3 {. n. s+ ]+ Y        if(pEnumClassObject)pEnumClassObject->Release();
2 H% h" \8 V8 C% v: M      }8 r/ d& f0 ?: F8 S
    if(pWbemServices)pWbemServices->Release();
$ b# k: w6 S& a6 \" A% N   }. ?- D4 @  s2 ~9 J2 C7 }9 ~" o
  if(pWbemLocator)pWbemLocator->Release();
' P" v2 c" k; @" {. T% s}% t" @8 d. c6 w1 T8 ^+ Z) P
//---------------------------------------------------------------------------
" c' s) e  z* Y: P+ d! i/ ^. \7 I, |: J- l1 N1 Z5 ?2 H  W/ f) G2 i- Y
// 通过 WIN32_bios 获取 BIOS 信息:; Q! |3 g# s' F( K+ b/ y
void __fastcall TForm1::Button1Click(TObject *Sender)/ z1 K1 M" `( q* ~
{
  I. g3 @3 \  b6 E/ \    Memo1->Lines->Add("================== [WIN32_bios] =================");
& g5 H( O, a  H    GetWmiInfo(Memo1->Lines, "WIN32_bios");( l1 `& U1 y- p* U: ~. p
   Memo1->Lines->Add("");
! x0 ]5 D0 F1 {( g8 V7 L  h}
8 V" q; v# t$ G0 U1 k3 s
& x; U: [+ \+ E9 {2 X--------------------------------------------------------------------------------
; e1 h* t. L6 |4 ?6 y
7 W- a" t# v1 z1 P! |: [WMI 可以访问的信息类型有:, x: M# R) o6 z
  Win32_1394Controller$ K, U( E1 z# {9 T1 Z8 f- H
  Win32_BaseBoard: s  ], D& Z" t
  Win32_Battery  e; E4 k1 W& F1 P/ m6 E
  Win32_BIOS
4 ~$ q6 z; L  M, G6 j% D4 `% v   Win32_Bus  t, @  F0 z. [  t
  Win32_CacheMemory
1 K2 Q) e' C* X   Win32_CDROMDrive
& a# ^5 a/ r9 I) a; g   Win32_CurrentProbe+ v3 b7 K' H% w9 o3 U6 K/ t
  Win32_DesktopMonitor4 ?- x! q" s" C3 ~% {
  Win32_DeviceMemoryAddress! }  o- i' P5 }! d( a
  Win32_DiskDrive1 n5 G$ [9 N4 q0 C' s9 w. Z; f& h
  Win32_DisplayConfiguration. Y: [1 w$ d: V7 e. p+ z
  Win32_DisplayControllerConfiguration
3 F  e3 s1 i" B. H   Win32_DMAChannel
3 g; p9 p7 T7 e, j" w. n+ Z   Win32_Fan7 F( A% ?: Z: B1 x' h: E* g
  Win32_FloppyController
& ]9 K* b7 p/ I; d; f# q& `   Win32_FloppyDrive/ C" M# B3 u& R; N  V
  Win32_HeatPipe, c* ?8 t5 z; I( P3 \  o$ t+ O
  Win32_IDEController
; W, F. \$ S: b3 |0 A2 ^   Win32_InfraredDevice
  p( H  x2 C# W1 _+ v1 T   Win32_IRQResource9 N3 [$ {4 S5 j6 b
  Win32_Keyboard; q( ^9 H4 D7 x& Y
  Win32_MemoryArray  i3 v  @7 M2 x4 d9 g6 Y& u
  Win32_MemoryDevice
. a3 M9 T( I& r4 R- n* |* F) p; z   Win32_MotherboardDevice3 C6 y& E" }9 [9 w( l5 R' A) Y0 r
  Win32_NetworkAdapter9 X. A' R  h1 {4 R% f& P
  Win32_NetworkAdapterConfiguration
: S6 [8 Z3 |: f8 A) \: \) f   Win32_OnBoardDevice
% p0 O, ^( x+ o" G7 ~8 K; h! K3 V2 t   Win32_ParallelPort' n. a* }2 B- k! n
  Win32_PCMCIAController  t2 N8 W4 A/ F( o; W8 }% e; z8 g
  Win32_PhysicalMemory
( {- B0 e% y1 \; w   Win32_PhysicalMemoryArray& [# O8 P; l3 M2 z9 _1 G: ?
  Win32_PnPEntity
( t6 Z8 l& _" i   Win32_PointingDevice8 t6 t* n; T7 P" i4 K5 Z  i4 Y& l/ Y$ m
  Win32_PortableBattery8 X, u, u$ K. ^) W. Y1 n# w
  Win32_PortConnector
4 }" q. ]! E) G, {* V& s- X# Z   Win32_PortResource7 W  ]5 z3 x: ?; s
  Win32_POTSModem
6 P: x1 g& \' {: O) L   Win32_PowerManagementEvent
; Q1 R0 f6 j/ ]$ X' n   Win32_Printer
0 U. u( Y' D+ W   Win32_PrinterConfiguration2 V$ P( H" }" p0 r1 E. c' A
  Win32_PrintJob# Q* O: w; A0 S6 n% V% r" J! o
  Win32_Processor
, V1 X* P" V, s3 ]3 }   Win32_Refrigeration
$ w9 `/ E  k5 w  K   Win32_SerialPort
; g. Y  J# ]2 Z) l% i: ~( R7 m6 @' ?   Win32_SerialPortConfiguration+ f! a6 t' j; a# \
  Win32_SMBIOSMemory; X3 F. v/ D$ S1 y6 p# {4 s& X! n5 ]: G
  Win32_SoundDevice
: j3 E7 Y3 D- @   Win32_SystemEnclosure
; ^0 l( u  [- a7 l6 W   Win32_SystemMemoryResource
  V( ?/ }5 Y! ]/ M, R. S1 y: C   Win32_SystemSlot: O- t4 O8 ]# q4 O+ U% ]
  Win32_TapeDrive
: h+ j8 m8 J5 v9 d& l   Win32_TemperatureProbe3 Q; H  T5 g3 y7 j( L$ b8 f
  Win32_UninterruptiblePowerSupply
6 W5 }+ v/ }: I$ V6 y3 o$ q   Win32_USBController
- ~  {  Z( g7 G3 \$ J, p   Win32_VideoConfiguration
. ]' S* p5 i  v+ _& ~; `   Win32_VideoController
5 B/ }, m- ?7 K' f6 E/ O   Win32_VoltageProbe
* U  f) O( l% Q# E, D3 w2 {& }2 |: K" p/ h5 [9 @/ B% ]+ o% K
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-8 21:51 , Processed in 0.018223 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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