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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
  ~6 p; E+ ?5 a5 j9 ~, Q
4 _9 D# C/ q+ N' {4 @1 H6 @  Z; `5 e! D7 @8 ^
--------------------------------------------------------------------------------' {- g5 T8 ]4 L; `- r4 C9 J3 D
WMI: Windows Management Instrumentation (Windows 管理工具)
3 Q0 A/ }# S) n* l& U   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 5 J" V6 p! t2 `8 l
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
% ^9 m& E* I* b: P4 K$ I9 D6 R% B   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 5 K9 R) d" F/ D/ J+ `( e

7 Y3 p' Y) s* [--------------------------------------------------------------------------------
$ F) F0 D, T3 Q' v- N8 gBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面! S5 L# C% P* q$ g! E. T
! X5 f7 Q- z1 O# a/ W: ~9 Q4 A
--------------------------------------------------------------------------------
: G: e! j9 W" t0 h  a: t① 初始化 COM 接口:" M$ o% Q2 q" v
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。) |: E7 A! ^& M: o
  这两个函数在 #include <comdef.h> 里面定义。
5 Q4 Z& B* w$ Z1 ~. l
  O' J( \2 s' s+ |* C3 l5 y( v② 获取访问 WMI 权限:
$ @* I5 L4 I9 {% ?: C4 J: l   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
, V" M0 R2 Q+ s$ ~  e. T   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
5 r' j/ m* z8 q1 ^# J# f! _! M1 n! t7 R& ^. a# ?- x
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
0 ~" O1 ^6 R, P/ {+ @. D# n: L, x% {* i   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
4 d; G! S! U/ z  N( G. c% a4 o  n8 `
, Y5 @9 I4 C1 j' j8 _void GetWmiInfo(TStrings *lpList, WideString wsClass)- \0 Q& b5 ^1 }! A9 B0 ~) [- o
{
1 f" g* ]: N' K) p, `# s/ w3 x9 P  IWbemLocator *pWbemLocator = NULL;: u0 ~, G) c6 M$ |' o2 L
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)! \- ]# |4 n% p7 d# ]5 u
  {8 }2 R, T; v! b9 \) {
    IWbemServices *pWbemServices = NULL;* y8 ^1 y# k2 j8 H0 T! f2 G8 Q
    WideString wsNamespace = (L"root\\cimv2");% X: U- r/ v; X- w. `
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)4 K' D9 h; h9 z& J* B
     {
: b2 \( n, K6 [6 J/ W. S! I3 @        IEnumWbemClassObject *pEnumClassObject = NULL;
% v/ m, a2 @3 l- o6 O1 y8 W        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;0 T" p% a$ E/ D1 ]0 E" @
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
4 e& d  Z1 R1 Y' ~5 Q" U         {) j" |" H) i/ V9 c. v: O2 Y
          IWbemClassObject *pClassObject = NULL;6 V% F1 S/ n7 O# A% E
          ULONG uCount = 1, uReturned;! p' c% @- U, B% i- L5 _
          if(pEnumClassObject->Reset() == S_OK)5 p/ ?# \) e$ {5 _. g  u$ [6 Z
           {
7 E5 \4 W0 ]2 H, T; }2 T6 }              int iEnumIdx = 0;
7 I+ t; d$ F* _5 b$ [              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
, Y, _. v0 h; D: A7 M& W6 S               {
! S2 ?' h) E$ h& ^+ V2 M                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
' k0 X- V  O/ A& U9 V. n* ]2 _, c2 o) C  k. w( ?
                SAFEARRAY *pvNames = NULL;4 M" L& r& z* \
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)* V% t, G1 P4 V0 U& y
                 {
2 F4 Y+ ?5 P* p, z! x! H# ?( o; v                    long vbl, vbu;, |) q: [  B$ E3 p% d" O- g& B: S4 |
                   SafeArrayGetLBound(pvNames, 1, &vbl);
& M  v7 L! T/ d; h5 I7 J                    SafeArrayGetUBound(pvNames, 1, &vbu);& a( m  |* K9 r& p7 z; o* B7 _+ S
                   for(long idx=vbl; idx<=vbu; idx++)2 N- G+ Y  u& |0 s* J
                    {
/ |) E; m  ]) l+ g                       long aidx = idx;* s& M2 D. d1 X
                      wchar_t *wsName = 0;  ]3 `" K- \5 O( y
                      VARIANT vValue;/ o2 b0 D: ^2 s. b  |) z1 A$ @4 b
                      VariantInit(&vValue);" w8 g9 k" J! A# c9 q* U
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
6 c; `) R7 s3 [9 U! t' ?. O8 C7 ^3 t$ l0 V1 c' K; _; M" r4 D& }8 U
                      BSTR bs = SysAllocString(wsName);8 q3 [! Z3 Z' G6 I2 X
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);" H0 v  m" q: ^
                      SysFreeString(bs);
  `; B# S: y3 I/ C6 R
" N- |: i2 f$ q3 q# m5 p                       if(hRes == S_OK)
$ W8 x  N) `$ N$ z: @/ ~( z  |                        {' B7 s, N; b/ U: o
                         AnsiString s;( {% [) [- D7 e$ w& E
                         Variant v = *(Variant*)&vValue;
; `8 k5 f# i. B8 ]* r; }) h0 f6 Y                          if(v.IsArray())
/ n( X& r$ U$ c+ C4 v1 P                           {4 g7 S" D; ~2 j" w/ X7 |
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
- L( ^+ V* Y! d0 ?                              {$ B; M& X2 `. ^" u. |
                               Variant a = v.GetElement(i);
( g; w. e+ w6 j( y+ z( V" L                                if(!s.IsEmpty())
. X: C% k' @' \                                  s+=", ";! s0 r! ]7 e% P$ ?
                               s+=VarToStr(a);  G  b) d* d4 k, V9 N% N, x
                             }$ S! G3 s% v& a
                          }
2 I: j$ j4 x8 H" C# l                          else
" |4 p! b- E$ P1 P- `# C                           {# [7 S3 J$ _. \8 R
                            s = VarToStr(v);
: x- N8 B* t8 o/ d                           }
- ~" M/ M& z+ N% ^- r' U& U. w                          lpList->Add(AnsiString(wsName)+"="+s);5 t& V9 m. W3 O# d$ g
                       }
  D+ i; U" S* F5 ?0 o
" V3 s: F/ D) g" n. q                       VariantClear(&vValue);
/ _, m! _! p! H                       SysFreeString(wsName);
6 b& D. y7 }5 q- |                     }. c" m' M# k' t' h4 E
                 }4 g( \$ |5 F$ ]0 a2 J7 P  I  x
                if(pvNames)SafeArrayDestroy(pvNames);
- @0 v0 I. K5 ]7 U: \! D                 iEnumIdx++;( @) B! ]1 ?7 q* M
              }
" U- _' w% I# {9 ~. y5 V5 `& U* F            }) Y) ~7 Y, J5 h+ e$ {% F% n
          if(pClassObject)pClassObject->Release();
: h( g8 `0 N  @- |+ [8 z         }
( |! Z7 n5 t, Y; O8 J) ^        if(pEnumClassObject)pEnumClassObject->Release();4 l  G  i+ S  c4 v# L+ e5 m0 N8 Z
     }) T3 L4 J0 z$ N1 N# t3 g# l, V
    if(pWbemServices)pWbemServices->Release();9 k/ S6 E4 Y9 F7 }
  }
5 X0 L+ r, X( M) B5 o  if(pWbemLocator)pWbemLocator->Release();6 L; z: S# d" ]9 f' K% I  O
}
. H! _4 H! E0 |$ D0 g4 Q  I, j% h//---------------------------------------------------------------------------
# S1 c+ K) P$ m3 V  h" o  D1 Y+ e
// 通过 WIN32_bios 获取 BIOS 信息:- H1 e/ P3 T# E7 \3 O
void __fastcall TForm1::Button1Click(TObject *Sender)
0 ^; P) o, m1 k% i: \0 A' I' H4 K  U{" _; t2 n9 {6 {
   Memo1->Lines->Add("================== [WIN32_bios] =================");& ]9 Y5 X: D4 O( w! E6 `3 ^2 z
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
( _; U: b$ i7 {% c    Memo1->Lines->Add("");
$ a6 N' P$ ]/ O6 m0 \5 T) I}5 M( m- p* S! U8 s9 l
4 C6 n% j2 p+ j! L! n# B* T
--------------------------------------------------------------------------------# |* q5 f* t+ f% t# z, `, ~
# Y2 P( Y. K, g& A
WMI 可以访问的信息类型有:0 d6 p: E5 _! N  L  ]& C
  Win32_1394Controller. m: O" b$ s+ i' k  g
  Win32_BaseBoard5 E/ \2 L% u. B; \" F. R
  Win32_Battery9 i2 o8 [! R9 t& D6 n$ g
  Win32_BIOS
( p& e8 y" n) @( A7 v6 d" Y' }& B   Win32_Bus
+ L+ s7 H3 g% O. z0 ?2 B) w   Win32_CacheMemory3 }8 i; P9 N2 e4 [5 U( ~; N
  Win32_CDROMDrive
5 V: _( L6 T3 K0 d# r' n   Win32_CurrentProbe  I. y- o% Y' U" t
  Win32_DesktopMonitor3 a/ S" {9 e4 K2 a
  Win32_DeviceMemoryAddress: K! \- p' `1 c+ A- U
  Win32_DiskDrive% `8 q; Y% O0 c
  Win32_DisplayConfiguration, }5 n( }; `& Y( S
  Win32_DisplayControllerConfiguration. g- ~  [- t. J9 H
  Win32_DMAChannel
9 O2 y: V3 _% Y8 o+ H& m. f. S   Win32_Fan3 @- i/ u& @  l3 N  V; D
  Win32_FloppyController" E, R4 ?  U1 S/ E4 Z( \4 V; z1 x" @
  Win32_FloppyDrive
- J6 d1 w" D: @; g/ r* g9 a   Win32_HeatPipe* q9 V( `5 _: Z' k
  Win32_IDEController( K2 @6 w3 U" a" V6 h6 u
  Win32_InfraredDevice
% @2 E; t: Z8 u+ O   Win32_IRQResource" D; F5 K7 f* q2 `; s. }! H
  Win32_Keyboard3 \3 f9 R$ w, E6 n7 `
  Win32_MemoryArray
3 X; h% ~3 H: A) x   Win32_MemoryDevice; m( @  L: x- ?' ]8 v8 N
  Win32_MotherboardDevice1 r; E1 M6 n9 j% T1 K4 z* }
  Win32_NetworkAdapter0 z) k% Z# G6 i+ ^
  Win32_NetworkAdapterConfiguration
. `( X- ?3 }4 G3 X7 a1 e/ t   Win32_OnBoardDevice
  u4 C7 Z  m/ G- v' ~   Win32_ParallelPort/ `( J6 y+ X& c2 M2 _/ ^
  Win32_PCMCIAController
6 v  s: u7 O6 @' U( y/ A   Win32_PhysicalMemory% ^" s8 `( X. D0 m
  Win32_PhysicalMemoryArray6 v* v) g0 `1 ~# W
  Win32_PnPEntity
! Q1 w! l4 [" p  H7 |   Win32_PointingDevice
* N5 S: T( f2 }/ O$ ^8 m, Z   Win32_PortableBattery7 d- s* }! P8 }& p6 `
  Win32_PortConnector
$ F! u# G% e, f* E% x: D   Win32_PortResource) |( G% n" Q0 Y
  Win32_POTSModem
, o: K8 S0 z, x# u8 W   Win32_PowerManagementEvent% u& n4 j. F/ P2 {- q1 m9 v
  Win32_Printer( Z( u& o9 u& m% [+ l$ F7 S+ M5 s1 P
  Win32_PrinterConfiguration+ o2 o3 `  H3 _0 A& u0 t( ]
  Win32_PrintJob
7 q' A. p1 Z! M( V1 s0 X2 j2 R8 m   Win32_Processor. v; M! V, i' L; }1 Y% G; ], p
  Win32_Refrigeration% c( J1 A: D# a! E
  Win32_SerialPort3 G1 F' L7 U$ P* v; D0 H
  Win32_SerialPortConfiguration
* x, s! W* J$ l; y$ G8 P7 K   Win32_SMBIOSMemory
+ ~) L7 ]# Q+ f: `  Q   Win32_SoundDevice
0 {. g, @# |8 G5 A2 Q  R2 u   Win32_SystemEnclosure% f) p+ G- m+ i5 {" P; h/ p
  Win32_SystemMemoryResource6 j4 u/ k- \. {8 t) E
  Win32_SystemSlot
0 z& j! T5 m3 P8 Y0 [! q8 s# z4 C   Win32_TapeDrive
' z% D- k- ^6 X) D9 k/ n+ a3 R+ ?   Win32_TemperatureProbe  k3 M& @8 j& N: r! M
  Win32_UninterruptiblePowerSupply% ]+ `% N$ R4 u3 d4 w
  Win32_USBController
3 T/ d* \0 V) ^2 s6 W   Win32_VideoConfiguration
( o+ L  V1 ?2 M5 t+ u- r# |   Win32_VideoController/ u2 ~  y, Y! O2 ?4 U: j) H' Z
  Win32_VoltageProbe! t& l2 j5 w& `! y7 m1 F8 F

- `9 M4 U* }( n6 t. {1 `1 K$ S+ @以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-5 09:31 , Processed in 0.018973 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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