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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
: z/ u8 P7 v) k# W* Y$ u
" D4 m( m( F2 ~: b3 a
4 W5 ?* A- }% \/ W6 s1 ]--------------------------------------------------------------------------------
( F3 ]# \! p, I5 N' E* c. I* T5 wWMI: Windows Management Instrumentation (Windows 管理工具)4 L% o& \& N6 H
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
4 ?- @: w, v8 b* p  Y- h  ^   利用这个工具可以管理本地或客户端系统中几乎所有的信息。( x5 x4 p8 ^, U" d' M
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 7 G6 F" J4 s- C& C3 t0 H

5 n5 g) I* s* r3 ]+ Q7 k% I--------------------------------------------------------------------------------
4 j" U3 z$ G* lBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
% y' [) v+ ]4 O  R
6 @  i/ i1 B2 Z; _  w$ y3 [--------------------------------------------------------------------------------
9 K5 W7 g% L) ?① 初始化 COM 接口:
7 ?0 [' y5 J  ^/ U   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
& y# u$ G4 K6 _  v   这两个函数在 #include <comdef.h> 里面定义。4 S7 P+ H1 P: T" K% ?
; q/ P0 F2 @% T" `- R% k
② 获取访问 WMI 权限:
9 {: M; t4 P$ H) S, X6 y6 b   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
* ?, z# a/ G' ?+ U# }   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
* A  l8 N! f  F$ p& k- r' w9 _# x+ Y) }( o+ t6 U
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
' [2 X, b4 `1 B. _6 n+ }5 k) @$ k   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。( S6 @6 u7 o# a2 P7 Z+ }+ u

: J* f( p  o6 K" Ivoid GetWmiInfo(TStrings *lpList, WideString wsClass)  a7 X3 `: A' r( r$ [
{9 k) O$ c! x  S% S9 b1 P& K
  IWbemLocator *pWbemLocator = NULL;: h. M5 A6 r8 J" p) ?1 j3 T9 ]- f: M$ r
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK). g! D3 X0 ?2 w7 r* K7 ^* A
  {
# f& o, C5 A4 r0 ~     IWbemServices *pWbemServices = NULL;
/ f+ ^2 v1 U- f! Z2 r& J4 R     WideString wsNamespace = (L"root\\cimv2");
$ G0 R$ D2 Q3 V. F     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)( {; w9 U+ _0 p3 a  @
     {
5 Y) B8 g' i% f- S! t7 V        IEnumWbemClassObject *pEnumClassObject = NULL;; r# Z1 i+ d7 ~
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;* k! p% p, K8 i8 W& J7 u
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)6 E7 V! `8 \0 G) ^7 U9 W
        {
( q8 c( M, \# p           IWbemClassObject *pClassObject = NULL;
8 R/ i8 a: n; ^) V           ULONG uCount = 1, uReturned;  y# v+ q8 I4 A
          if(pEnumClassObject->Reset() == S_OK)9 u: r( P' @7 q2 \
           {
# p+ u2 l- f! ^  t              int iEnumIdx = 0;  O; [4 g( W; b6 s& F
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
+ q, A  Y  }& o7 A; C) k1 ^               {
  w0 r2 y" b8 \( S( F3 z$ F" K                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");! a3 `8 y6 V# o4 Y& d$ R

" A* U+ N% ~% g2 r                 SAFEARRAY *pvNames = NULL;7 \) A7 L6 g( {: h
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)) P( Y/ L- l5 n3 F
                 {. t6 `2 O6 V/ f: r
                   long vbl, vbu;- H% |4 F5 ^; C% [7 V
                   SafeArrayGetLBound(pvNames, 1, &vbl);
& G$ Q5 f/ f+ S) O" b: l+ R                    SafeArrayGetUBound(pvNames, 1, &vbu);
( x6 l: ]- B9 O; ^3 x$ z                    for(long idx=vbl; idx<=vbu; idx++)
7 D' U; j9 ~9 u4 g4 Z6 T/ @                     {+ V2 x" V+ Q( j% Y8 ]$ s9 q
                      long aidx = idx;
7 S' G# O% }: k& e9 ]! z  _                       wchar_t *wsName = 0;
" U8 O8 U9 l1 ?0 G: |                       VARIANT vValue;
$ k8 J  I  w3 X; b                       VariantInit(&vValue);3 ]7 ^: O5 b9 c4 E
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
  e0 x; S6 y- F3 c1 E" ?
9 |, [* O- r/ V1 e                       BSTR bs = SysAllocString(wsName);0 m& e! u* \: c( l9 h! T! p& r
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
& Z# R( g: b) ~* z                       SysFreeString(bs);
0 `, k9 P. q( N. T" ]( k" G7 a2 Z# \3 O# d
                      if(hRes == S_OK)
1 k3 d  _% l5 v                        {0 m- W) H/ B0 Z* ~
                         AnsiString s;# g3 e9 L# K# `7 f& n, n! q
                         Variant v = *(Variant*)&vValue;+ W& K% ], G; v! r6 E8 @$ R
                         if(v.IsArray())& t4 u  [$ s" w) `
                          {
' ?) U! @! D  E, o; e4 n1 u                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)% K* q$ s* ^. B4 m5 l
                             {  m" ^( ?- D( Q- M4 W
                               Variant a = v.GetElement(i);* Q- Q8 k2 n( h& O. Y1 }9 Z
                               if(!s.IsEmpty())
- g7 V+ ^* P, Q( S- g                                  s+=", ";
% I2 N  h$ ]/ A5 F) J                                s+=VarToStr(a);
! a4 J: a5 ?# S* R5 ?* W/ N% \3 I% N                              }; O4 B$ D$ j) s0 T1 h0 ^
                          }2 U# e& `! w; }* U9 N8 X
                         else
2 J! |' x/ D9 p6 e" I8 ?                           {: e1 [) s/ N8 X. V% V. \$ L
                            s = VarToStr(v);' [* z* e* X4 U% ^) E' f" S2 y
                          }* t) |% N+ I8 t3 A1 V
                         lpList->Add(AnsiString(wsName)+"="+s);
, |! G! u: H1 d: B                        }% a2 O; @# {6 ^, y+ {/ Y) m

' U' |' y: ^: ^  N1 i7 {! s4 w                       VariantClear(&vValue);- K, G* R  K! S8 z7 c, h
                      SysFreeString(wsName);* e- ^, j6 i) w* t# H
                    }7 E3 u% e' u: L- n- _! h
                 }
  `% `4 ?5 `: o. y4 d: S7 P* v                 if(pvNames)SafeArrayDestroy(pvNames);! t. w4 x& ?, S2 M) Q% x  @
                iEnumIdx++;
  c# [7 s! p, L/ }               }/ m( x; q7 m0 w! ?/ K1 J( f( j
           }. t: J, J% N0 Y* Y; h9 F
          if(pClassObject)pClassObject->Release();' N9 R, R, T1 u9 C( o/ b& ?
        }
& e8 V, r) ?$ _# P" ^9 j        if(pEnumClassObject)pEnumClassObject->Release();; n+ [2 m) h  y, |. z
     }
" m0 ~# _: K; I/ ~     if(pWbemServices)pWbemServices->Release();) s! O+ j! P( v/ ^1 N, m( @) {+ r
  }4 q( V2 y; p( [, f+ J" h1 _
  if(pWbemLocator)pWbemLocator->Release();  P4 O: C0 ~) [5 B  |5 @9 w% z" u
}
# J6 c* x' S0 M5 T//---------------------------------------------------------------------------
! E1 K, ^' s; w# ?
2 r3 I) }6 G" ^- {& F" m; }" Q// 通过 WIN32_bios 获取 BIOS 信息:- X' I" d8 z6 s: }( i/ a/ {# d& a
void __fastcall TForm1::Button1Click(TObject *Sender)7 O" _2 [3 I6 k& C; J
{
7 s) @  x+ D6 R7 p  a% t1 c    Memo1->Lines->Add("================== [WIN32_bios] =================");* @9 a4 P" S" p  L
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
! q9 q$ t. t# p8 Y( L8 J  i9 ^    Memo1->Lines->Add("");
4 o  e3 D9 `/ Z}" a" p- b. w! q

0 G5 A1 X, ~/ q7 D--------------------------------------------------------------------------------( s  \% v6 a: s1 Q' [: p

7 o5 {( m! F2 B8 h& hWMI 可以访问的信息类型有:
5 k5 e3 l, A$ m   Win32_1394Controller! `! ^) e) N8 t" @  y
  Win32_BaseBoard0 K9 k7 l. i7 B6 _! V
  Win32_Battery8 N! y# Y. W, W* r
  Win32_BIOS
! ~& l! J# H6 E/ @   Win32_Bus8 |; U/ l  Y+ y
  Win32_CacheMemory
$ k* [9 s& ^# X3 W) u   Win32_CDROMDrive- P, l, E( E1 X) _* D! l
  Win32_CurrentProbe
( @7 h, T- m! G+ h. j   Win32_DesktopMonitor
0 }' w) f5 l4 x, ~   Win32_DeviceMemoryAddress6 j1 y. b" ?$ v" p
  Win32_DiskDrive
" O4 S& s) U$ Y, y   Win32_DisplayConfiguration
; g1 I) j; s" Y1 h$ L1 C9 N3 e   Win32_DisplayControllerConfiguration
% M/ S8 e! \% g: a  `; s% e   Win32_DMAChannel
: T* h5 t* z% o6 d/ W   Win32_Fan
5 V  b7 ~" i% s4 W   Win32_FloppyController$ _8 |7 S# N8 F* s' [
  Win32_FloppyDrive/ D/ p0 }0 r, e: T  \. U
  Win32_HeatPipe
" y3 D6 S& C9 M4 A- o   Win32_IDEController
+ ]/ t1 x0 ^0 O3 V   Win32_InfraredDevice
: p2 r' v8 X( Q2 F   Win32_IRQResource7 j- J1 B. h' L
  Win32_Keyboard
- A% Z- _9 ~( I2 t" N2 G! A+ W   Win32_MemoryArray
$ k  x/ i/ p$ W% t$ {( i, w   Win32_MemoryDevice
8 Z, z+ R' f8 x/ y5 j   Win32_MotherboardDevice; }" P% x8 _5 L  D% {  e( R
  Win32_NetworkAdapter
  G6 }/ L! ]+ [5 ]- a( {. l   Win32_NetworkAdapterConfiguration
! R7 F4 O, t9 h   Win32_OnBoardDevice0 @0 c* u1 \) k5 m  q( ?: k
  Win32_ParallelPort
! r* X9 [/ j* E: b1 W8 G   Win32_PCMCIAController$ p0 y& x% v. b2 l
  Win32_PhysicalMemory2 [, {) M: j$ ], M; h" r- J; i1 r
  Win32_PhysicalMemoryArray
3 }# T( i5 \( Q( U. _3 h# H$ [   Win32_PnPEntity
3 e9 ^; L% ?+ d) D. l) C7 U( N   Win32_PointingDevice
/ i/ G; K- K* [1 q" @   Win32_PortableBattery
8 B0 v- S0 u6 W   Win32_PortConnector
% b% L% L! t9 c/ Q" x   Win32_PortResource8 f  |1 G% S" ~7 o9 T5 T
  Win32_POTSModem& J5 s6 o& d8 A0 o3 S
  Win32_PowerManagementEvent/ C3 A2 u% z. `' n0 F! J- B$ b
  Win32_Printer
8 j% {6 C( e; ?5 @9 t& ^7 h- q/ x4 B   Win32_PrinterConfiguration
* ~7 ]  ^4 n  y) {   Win32_PrintJob
* w8 b0 v& P8 b1 y- P( E   Win32_Processor! t& o1 T: p+ y' ]% k# t( y
  Win32_Refrigeration6 g+ A* g* U  L; E' K* T5 n; `
  Win32_SerialPort% D) K5 j$ b% L9 R
  Win32_SerialPortConfiguration
$ n1 g* A, W8 y$ y4 X   Win32_SMBIOSMemory7 ]" S* Z; @- j- h# Q. O
  Win32_SoundDevice% w# v, H5 L. ~1 U* H& X
  Win32_SystemEnclosure
$ ?/ }# V/ `9 `9 V   Win32_SystemMemoryResource) I: A1 J9 A' i- u9 L$ Z) g& h
  Win32_SystemSlot( g1 a9 s( ?" A9 b
  Win32_TapeDrive
- L/ s" I6 F/ B2 m- y- d   Win32_TemperatureProbe
! q$ b  l3 n7 O9 L   Win32_UninterruptiblePowerSupply- b; P* H5 _+ _( `( I( U- p
  Win32_USBController
7 N( d/ c" q) Z7 p   Win32_VideoConfiguration6 Y5 l2 S/ O0 ?7 L# C
  Win32_VideoController
, P4 T  U* P$ E  ?# E6 P* O. B   Win32_VoltageProbe
( \9 b- Z& }# Y6 Z, \) y; v0 Z* P( l! Y- X# T  A
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-18 03:58 , Processed in 0.035632 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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