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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
6 Z# P8 n* }8 F
& A# N# J$ V% m6 ?% q, `; t+ m
6 Y) w* P' u8 Z4 ~- }! v--------------------------------------------------------------------------------
+ \- e6 j4 f; C" i$ Q: RWMI: Windows Management Instrumentation (Windows 管理工具)
; \5 p& w+ w- N% l   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
2 K5 ^) l/ r* R* l   利用这个工具可以管理本地或客户端系统中几乎所有的信息。: W& M* v; f2 f
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 8 S' C" \: b9 G: `
$ G4 v% D  y8 M- s
--------------------------------------------------------------------------------
0 q$ t* f# T* u2 o6 l# aBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
  l7 u8 P# f# T: G; S+ ^! F5 h
" Q, j* O% U8 p# J0 d; L$ F--------------------------------------------------------------------------------, A* ]$ ]* H( o
① 初始化 COM 接口:
' Z: c0 R0 _: w   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。$ V' `9 Z. {% p5 C/ x: L/ O
  这两个函数在 #include <comdef.h> 里面定义。8 Y, i  ^3 y6 w) w, b9 T
0 I5 K% W+ v4 H0 z6 W  c8 S5 s1 D
② 获取访问 WMI 权限:
/ S* b, W" r! E   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
, Q- |, a* S# _7 Q! E$ `   如果这个函数返回 S_OK 获取权限成功, 否则为失败。0 O! {7 {, n# L, `1 T. a

- Q8 z7 s, v( z  \③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
6 r' [9 b( N4 v! U; M   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。; _! B& o" H1 x2 X, Z# q
- O0 H9 C+ H5 Z5 x
void GetWmiInfo(TStrings *lpList, WideString wsClass)8 Q! ^5 H+ u- ]
{
3 [6 S% n4 ^9 B8 d5 V" t% u  IWbemLocator *pWbemLocator = NULL;
  `/ d! L; G; J' W/ `  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
" r1 ]# ^1 d( C  z6 M8 M   {/ l( o' E( C% i; I+ b" Z
    IWbemServices *pWbemServices = NULL;
1 k8 E. k1 b$ x2 V' J     WideString wsNamespace = (L"root\\cimv2");
' z) m8 m& q, Z: Z: ?4 W     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)- d  ]* @* J/ v  A1 }% ^
     {+ p) k  U2 e& b) L4 Z7 @- j" n% |0 `
       IEnumWbemClassObject *pEnumClassObject = NULL;8 g- Y3 m7 H, b
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
8 @5 i7 U, g5 V  B        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK), G4 G6 l# Z3 a" ]$ N: U
        {6 v5 K! @% C+ B, r+ {
          IWbemClassObject *pClassObject = NULL;
7 w( I/ ^" X" A$ u           ULONG uCount = 1, uReturned;
! T3 X1 k3 ^0 E8 d           if(pEnumClassObject->Reset() == S_OK)
/ a* B, `  }* S' E' p6 w9 f            {7 g2 r- k& z: T+ R. n
             int iEnumIdx = 0;
: `& L( n, @& L8 @5 X              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
* ~, O5 S) M+ l; N" M. m- T8 _/ N, b0 D% D               {5 a  W& s  |  c0 {. F- u6 m, y
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");2 W' x8 j6 ]2 V2 Q" u0 e8 p: K

. D2 v8 Y2 N7 w. m5 \' x( j" w* B                 SAFEARRAY *pvNames = NULL;$ ?8 v! T5 O2 ]: y/ x, f
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)  N  ]; d8 ]4 {1 j% ?" Z5 ^# r# u
                 {
3 L( A6 ^. s1 X" l* g" C                    long vbl, vbu;  ~: `3 E& d* B9 U$ q
                   SafeArrayGetLBound(pvNames, 1, &vbl);+ _+ M6 M0 c4 y& p0 d$ g
                   SafeArrayGetUBound(pvNames, 1, &vbu);, M/ u4 F- w7 K/ B
                   for(long idx=vbl; idx<=vbu; idx++)
& f, q8 K% w& Q$ o$ v: X/ A# L                     {0 Q# N. c  Y5 G( m3 _5 Y8 c, ~3 t
                      long aidx = idx;
5 R7 \- C0 b" [" U: y# k                       wchar_t *wsName = 0;
# ]% r1 A; f9 n/ V' K" O" \8 P                       VARIANT vValue;
/ w' A, U$ d: n, x4 ^9 @                       VariantInit(&vValue);
+ z% [; K# G* ^( V                       SafeArrayGetElement(pvNames, &aidx, &wsName);
% F) p2 _- H  u. R3 I1 m' n$ I$ M& P: K( x9 J* s# ^- S( |
                      BSTR bs = SysAllocString(wsName);* {  [7 i! }$ g9 U. l+ `' t" d
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);& i" f" X; ~( H6 q( O
                      SysFreeString(bs);
" c3 O7 H# ~1 Y9 D5 T0 I$ ?" X8 D0 N: v! W- [* I
                      if(hRes == S_OK)' A: I, U( m; l
                       {% {# c% _% V0 q! H
                         AnsiString s;+ O% D- _" I5 @( Z
                         Variant v = *(Variant*)&vValue;
/ a# ]! Z' o5 x; q7 z% e8 d- j) W                          if(v.IsArray())
  }. U# T) m* }9 I! Q                           {
) w7 P& l0 V  t# T3 J                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)% _0 I. {: h9 b" [/ t- V
                             {6 G1 b/ l* s7 f" j5 u, E2 S
                               Variant a = v.GetElement(i);! N# m& r9 ^3 G+ z$ S, X3 k6 X0 ^
                               if(!s.IsEmpty())
6 M. [; G* U  D/ c* l* p0 c0 \                                  s+=", ";: O8 p0 i$ s; H4 v! x/ b
                               s+=VarToStr(a);5 p5 v% M6 b+ u7 x) q0 M- L5 O
                             }
8 M, K! s7 t$ z, G                           }
% F, K$ S. V& U/ x( o: ?                          else
9 Y# `8 s2 o3 S( i                           {+ X  w1 C1 E- {& [
                            s = VarToStr(v);
: d0 V" H; Y% x7 Y$ J, Q1 D' @                           }
+ @; ?+ e3 g; d2 P2 F                          lpList->Add(AnsiString(wsName)+"="+s);! P9 E2 o' f' o5 _2 Q2 E+ z0 G
                       }8 O& e, n. P' j$ y+ @
+ D: P& D) k5 Q( H
                      VariantClear(&vValue);
* @; z) x: O1 c                       SysFreeString(wsName);7 C% d/ J2 k0 H, j
                    }
0 k3 k- }( }3 p6 Y, A) }3 W! b                  }
9 C8 K; E- }- f9 N5 H" b, n                 if(pvNames)SafeArrayDestroy(pvNames);9 ]0 K3 R1 q! j0 x
                iEnumIdx++;9 s4 l1 h8 T2 {1 |
              }
/ t1 o% v  u2 w            }
3 w+ K  r) R" m7 r4 n0 a$ t           if(pClassObject)pClassObject->Release();
  L( w  L( W  @, X# }# P         }5 [/ W9 d) ^, Z( S# _1 E! H$ ^
       if(pEnumClassObject)pEnumClassObject->Release();
# k( {: F7 N, y. W" {9 N+ Z      }8 f; l# ?+ S+ z* u! h
    if(pWbemServices)pWbemServices->Release();
" e" c6 u' q: ^8 a   }
" j/ q1 T+ F4 ~( B0 E* C4 w+ n& j  if(pWbemLocator)pWbemLocator->Release();
. o4 l( f: E7 D8 w" H9 z- X1 ^) N) A}! f0 O1 W1 _1 I; e0 W6 ]; M' l
//---------------------------------------------------------------------------" E# B( E2 B9 S# Z, F: ]' c' H3 V$ E% h

: P# [- A  V: B0 {7 W6 m% }// 通过 WIN32_bios 获取 BIOS 信息:
: e  P- a" N8 v4 u; i1 }  Yvoid __fastcall TForm1::Button1Click(TObject *Sender)
, I/ i2 g! J9 n$ F6 }- U{3 O+ m; ]0 o6 ?( P( _
   Memo1->Lines->Add("================== [WIN32_bios] =================");
! q! H% t9 w2 n1 p5 H    GetWmiInfo(Memo1->Lines, "WIN32_bios");
' Y0 t6 ]. d$ C. k% ^    Memo1->Lines->Add("");
/ ?$ e2 E3 E  W) X( n}7 w7 X/ ^5 J+ r/ {
2 x+ c9 t0 J' ~) o# {
--------------------------------------------------------------------------------2 @- B/ v+ o1 l9 d# I+ @7 Y3 Q' r
. J- r5 i# P: I( _' l7 }' }
WMI 可以访问的信息类型有:2 N; B& P# O" W1 W  f/ M+ c/ z
  Win32_1394Controller9 e2 I0 ~' \, {& S+ ]4 d
  Win32_BaseBoard
4 c. h, Q3 A% Z0 O. m6 i   Win32_Battery, \/ E5 n( @! t& ?8 ~* U  P$ `0 i
  Win32_BIOS
- [% Z3 S  R1 q" O8 W   Win32_Bus
# \/ a( |% @, H   Win32_CacheMemory
/ Z5 I$ r" V6 j! h8 U  l! @* {* @   Win32_CDROMDrive0 H# c4 N9 G* V. R! ]: o5 o
  Win32_CurrentProbe; |9 m5 d! r+ R4 G5 Q
  Win32_DesktopMonitor( Q# N% F& K; X+ z
  Win32_DeviceMemoryAddress6 Y" c. p) J! H2 c- P% v
  Win32_DiskDrive/ `7 X  }) ~5 U& t4 C
  Win32_DisplayConfiguration
4 }: V# z1 ~( Q$ Y   Win32_DisplayControllerConfiguration* W( P( c3 R5 x! w$ p
  Win32_DMAChannel  J2 a! O: Y5 E7 \+ F$ R4 l1 M: {/ Z
  Win32_Fan* i% A/ L- L" P3 D6 v
  Win32_FloppyController
- {. P" @6 H# m, d- @   Win32_FloppyDrive& m9 U" }) S3 b& C5 v: c( c
  Win32_HeatPipe
+ Y6 R& M/ ^) {  t% U/ D   Win32_IDEController; ^2 R. @- p* m* }
  Win32_InfraredDevice
/ C. ]( g1 y: [( e! V$ M   Win32_IRQResource6 `: `" V% u4 p0 x8 c
  Win32_Keyboard
) o0 k( }6 B8 _% Y   Win32_MemoryArray, a. t% g' f" a! o
  Win32_MemoryDevice+ T0 t0 j$ s% B6 W
  Win32_MotherboardDevice
& ^3 @  ^9 o9 A3 x; j   Win32_NetworkAdapter
) K$ \1 @9 y8 B$ E4 h4 ^  A  B2 ^   Win32_NetworkAdapterConfiguration( G; J" O+ `% G7 Y$ o
  Win32_OnBoardDevice
2 _/ ~, t( z7 r' D   Win32_ParallelPort
" L3 Z5 `( a. n& w" }; _6 c/ E   Win32_PCMCIAController
8 }; U7 e- I2 ?   Win32_PhysicalMemory  M! t' U# F8 Y8 \
  Win32_PhysicalMemoryArray9 g% R( B# v% H+ b+ X8 H  W
  Win32_PnPEntity: s; Z1 Y- a: X1 y9 F
  Win32_PointingDevice
. X# J2 @2 A5 l0 \   Win32_PortableBattery
8 G' }( ~& q5 `! l   Win32_PortConnector
' s' f: U  C$ D1 T6 c- \4 X   Win32_PortResource+ ^* H0 \, x0 H9 X- j+ K
  Win32_POTSModem
" x9 V( }% P1 x" n, h0 s. R; e# f   Win32_PowerManagementEvent8 C* z4 \; C6 K! T! X( n6 \
  Win32_Printer
4 G; \* T; j: i% P# B+ _# Y3 U   Win32_PrinterConfiguration
7 Q8 W& m& z" Z2 c% ?   Win32_PrintJob
4 i* m" `2 Z/ G# d& H/ b0 X   Win32_Processor3 u. u7 g& q9 d# x3 P
  Win32_Refrigeration
0 T& U% \( K; C7 `4 h; L   Win32_SerialPort, B+ ^/ \% B5 S: r" }' }
  Win32_SerialPortConfiguration
1 U# H: {( |" e   Win32_SMBIOSMemory7 ^" K' [: w4 v4 |- A
  Win32_SoundDevice
) c) \0 x. q8 @1 v7 x' W- P6 j! ?   Win32_SystemEnclosure
! E7 h; |) Y" q/ |% s8 Y   Win32_SystemMemoryResource
9 d) K; g% \& H   Win32_SystemSlot
* Y% @- ]+ y% A4 x+ {# f   Win32_TapeDrive
0 }2 v5 C9 D  a* X3 D, r   Win32_TemperatureProbe
' _7 L' l4 R# E7 W9 }: f# R   Win32_UninterruptiblePowerSupply
3 y5 H0 o3 g: X( [) p, ?" t   Win32_USBController% i( T/ C; ~$ a# R1 H) C
  Win32_VideoConfiguration
3 X/ V! m, s2 d+ `6 a+ D   Win32_VideoController
) z1 I  W. l! F$ J7 Q   Win32_VoltageProbe& m& G' S+ I6 r

/ h0 t" G( g- O8 z8 {以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-16 14:33 , Processed in 0.019600 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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