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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
7 h" H4 A- j  E5 I) Y+ }  I* O, \8 M+ h$ M1 E! v3 p, L* w
% \: Q4 A6 i9 u( n0 Q# u6 v
--------------------------------------------------------------------------------$ _0 J8 U. N2 D; R% u& e
WMI: Windows Management Instrumentation (Windows 管理工具). r# m0 I4 T2 I$ O8 X9 @5 Y
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。   s3 Z  b1 I+ y$ G5 J
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
. i9 m. i  X5 W/ j   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 3 @$ n9 d- N/ ^2 l2 i8 C6 x! N
9 c8 n: h) g9 s7 v
--------------------------------------------------------------------------------
* R' K& L1 F. NBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
0 |+ p3 @7 n/ o# p5 k1 f$ v$ R9 x4 K6 l9 D  D
--------------------------------------------------------------------------------) J6 L. {( x$ _' u+ D* l; J+ p, z
① 初始化 COM 接口:. G0 l8 c9 e$ j
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
' N6 a4 K- B8 V" v' K3 f0 i5 T3 J   这两个函数在 #include <comdef.h> 里面定义。
; t2 Y9 M/ y9 v+ Q  ~; T. W, A2 ~
! D# y6 a  F% U# A6 D② 获取访问 WMI 权限:2 G. T% v* g) N
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);. D/ j: _4 z$ a/ P
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
1 X8 p) ?+ M3 I
3 u" q' @; v& R% E8 @. X③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:- @3 H8 l2 M3 G
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。9 w* P: I$ \4 D- b; [
; e2 i( I6 H  f0 S6 ]9 F
void GetWmiInfo(TStrings *lpList, WideString wsClass)) r, ?# f7 e; q$ Q* R$ {& I& W
{
8 A: S8 B. g9 O$ k  }, i  IWbemLocator *pWbemLocator = NULL;
% P, S" x( @2 c! N) C' t  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
% d- h, a& M" ?# m   {
/ J4 F7 L  d2 M' ]  O     IWbemServices *pWbemServices = NULL;6 d& W4 d1 v- a9 s' F; X8 K, Z. I
    WideString wsNamespace = (L"root\\cimv2");# a+ Z. }: D$ W, B& y5 X
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)/ a# e3 H  b' f7 [% e  U; }
     {
1 I' J. Z: |$ Z0 L! Z        IEnumWbemClassObject *pEnumClassObject = NULL;
+ u0 {- r/ c! F" M! I        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
' W( m" U2 l" P9 {1 b8 P        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
- [2 I& |/ o# P4 g9 N9 j' S         {
2 n8 w: _/ k6 {7 T1 A& x           IWbemClassObject *pClassObject = NULL;
8 d( p2 `+ c' H; g4 L- `; E. D           ULONG uCount = 1, uReturned;
2 X5 \6 N( T9 W  g0 B  _- V           if(pEnumClassObject->Reset() == S_OK)1 K, J6 p$ Z# O. o5 R
           {
. U0 w' ^/ }( f6 ?6 d              int iEnumIdx = 0;
9 \" n0 S  v# R+ r8 r) Q              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
0 L$ J$ H; P5 M+ y# p& P5 ]               {0 z" U! G; C0 t( s. `& t
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");1 P9 X, m, M+ b/ E
" ]# a/ b% v* Q. F/ V$ \
                SAFEARRAY *pvNames = NULL;
1 S& t9 r' t& t, Y: P, E# \3 X( G0 L                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
& L5 Y$ }! k2 {$ m                  {
. T& w* `/ j; e: s. |' a                    long vbl, vbu;2 c" y, m/ z3 x+ K- @! w' B* s
                   SafeArrayGetLBound(pvNames, 1, &vbl);- f5 s8 |( l4 l
                   SafeArrayGetUBound(pvNames, 1, &vbu);: b/ Q$ Z7 n$ k* ~. x" D& E
                   for(long idx=vbl; idx<=vbu; idx++); `* n7 T9 ~2 g2 l2 S
                    {' ?8 F/ N% l1 f# |0 F
                      long aidx = idx;
9 s9 C( x( t  |                       wchar_t *wsName = 0;+ j/ }/ ?& f1 T+ b
                      VARIANT vValue;  g5 {5 t" @) O6 w& ^& x& H) {
                      VariantInit(&vValue);
( Z" y  O$ a. i6 w  _                       SafeArrayGetElement(pvNames, &aidx, &wsName);
' c5 S* m# i1 \: b3 b; d: N' }; @  a- d) n
                      BSTR bs = SysAllocString(wsName);
8 V, b% p7 w0 Y8 k                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
9 C; A' A: p7 f  [                       SysFreeString(bs);, u: {9 k; j& d0 h) S) @, `

3 w+ j8 E$ w; k7 ^# h                       if(hRes == S_OK)( B0 a% d- z, H0 h* y0 Z" p
                       {8 i' r1 i2 \0 r% y9 U
                         AnsiString s;9 ?1 p8 w! f, T+ T
                         Variant v = *(Variant*)&vValue;( A+ q( d& o. ~- S( l
                         if(v.IsArray())
( M, r/ i( E& ^                           {% J- G; g- k- ^/ x
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++), A! u: R# \* @1 b
                             {. _4 w& H( f. Q+ q# i9 u: d. r7 P
                               Variant a = v.GetElement(i);8 p. ^7 D; B7 h4 p
                               if(!s.IsEmpty())
' G! P  Z3 O  c- L$ K* R. V                                  s+=", ";6 U: A8 H: \, C3 ]0 |$ f( @0 K# u
                               s+=VarToStr(a);
: s. T) \$ ~: k/ ~  g                              }6 q  k$ o' P+ m7 G
                          }
$ i3 R, f; P. |, L8 R                          else. N! A& g3 ^! L, w( m
                          {
3 v- l* ]- \; |: [1 D! {                             s = VarToStr(v);
* ~! \3 e. R0 H0 @1 a) D                           }3 \- U: X6 q+ m0 Q! c" `' i, {! w2 k
                         lpList->Add(AnsiString(wsName)+"="+s);6 [- ?! r6 {9 n1 d! v
                       }
) d9 X7 T1 u  [: b) P2 K7 N5 E) X7 A5 ?( r9 o$ \5 H: N" C
                      VariantClear(&vValue);9 v, g5 a# F0 H9 J6 S
                      SysFreeString(wsName);  U0 r) q5 y$ }
                    }
6 p  U: K6 f7 _, o2 v                  }
7 G6 t# z' Y5 X; b( u                 if(pvNames)SafeArrayDestroy(pvNames);( k- _, m- s6 ~% O' @
                iEnumIdx++;
6 z. p; M6 U; m9 |$ j               }' @) ]1 ]3 b* ^# w$ X5 r
           }1 |8 j% O. f! b1 B+ L
          if(pClassObject)pClassObject->Release();7 {6 M, c  W' A0 R" U& H, w
        }
; [$ F9 p. \6 p  h" K$ q        if(pEnumClassObject)pEnumClassObject->Release();
! g# A: I9 R2 ]1 ]* ^      }4 C! a0 ^/ g, j) a# h
    if(pWbemServices)pWbemServices->Release();8 d. c) L- C& L9 p3 Q2 G; H& B
  }" E! c, |* t' L5 a* J, E$ v. }
  if(pWbemLocator)pWbemLocator->Release();: Z- r& H+ A( u! o+ d
}
) a, V8 O8 H2 r& Q//---------------------------------------------------------------------------
; |1 y7 H+ d8 A( ^2 q: ]1 V- T% T0 ]2 v% ~( O
// 通过 WIN32_bios 获取 BIOS 信息:
/ r" T+ k; [8 X, F; `void __fastcall TForm1::Button1Click(TObject *Sender)
* g/ R! d8 l  I' B5 |1 d- V{+ s4 o/ h# I+ {5 b, v* G% M# z! i8 w
   Memo1->Lines->Add("================== [WIN32_bios] =================");
& x  C# Q+ ~! R# Q6 x4 ~( K    GetWmiInfo(Memo1->Lines, "WIN32_bios");
  ?0 a% S1 S  x2 D    Memo1->Lines->Add("");
4 p& N* k1 j7 N6 |% G' }}3 h/ S* b  d  r+ s7 _9 H
5 l9 F/ ]8 A- G) y$ f7 f
--------------------------------------------------------------------------------
& }' f" B5 Q* p4 X1 o2 x) ~' p
; v) N) }) _. k' M7 |7 IWMI 可以访问的信息类型有:% ?7 Y7 H, E- c0 l
  Win32_1394Controller
, x: z3 ]2 z2 ^3 h   Win32_BaseBoard1 Q& }9 Z0 V+ e2 Q$ `
  Win32_Battery4 D- P* H4 y0 B8 J
  Win32_BIOS5 g+ L% G9 v6 w5 `5 C
  Win32_Bus
, N# w2 G2 ^+ ]% [  p( B: e   Win32_CacheMemory0 x/ C/ L6 S7 b% t" C5 s
  Win32_CDROMDrive
% C" I/ z' Q$ i; n   Win32_CurrentProbe3 i: A; ^( {% r: w- Y$ @+ y
  Win32_DesktopMonitor0 X3 v2 {4 |. L
  Win32_DeviceMemoryAddress, E3 y$ t! Z) y3 r8 M# H
  Win32_DiskDrive2 {4 ]0 ~0 T1 P% l
  Win32_DisplayConfiguration- P( e" ^3 q0 R
  Win32_DisplayControllerConfiguration
  @6 A! j9 O* z& Q+ n5 n, ]6 M   Win32_DMAChannel, L2 _" Z" z1 T$ w) L  P
  Win32_Fan" B: n1 L) k% `' {% R5 v% o4 |5 e
  Win32_FloppyController  H, D# v3 X8 Z. G
  Win32_FloppyDrive
: k2 W2 Z  P& W$ H2 S: {1 o( |   Win32_HeatPipe
5 s/ W( d  d0 k/ U- k( Q- H   Win32_IDEController
5 r  A7 B% z+ [; f* ]. Z- _2 u   Win32_InfraredDevice6 ~( r* N' o5 x5 P2 b/ J3 j
  Win32_IRQResource
; b1 C+ d7 y( m3 q5 l8 n, H   Win32_Keyboard+ C! ]: V% ^: Q6 B
  Win32_MemoryArray
. Y* B$ v  O  e   Win32_MemoryDevice
7 E8 a# \0 t% P7 N   Win32_MotherboardDevice
7 e# b2 }7 x6 Z9 Q   Win32_NetworkAdapter
+ v+ F" E% \" _, C+ v   Win32_NetworkAdapterConfiguration' H4 d) n: R3 q' G5 O1 T* z
  Win32_OnBoardDevice# y* m" Y5 t/ U
  Win32_ParallelPort
: G1 o! n. }8 \/ s   Win32_PCMCIAController
/ ?) u6 b, `  p! m$ {   Win32_PhysicalMemory
/ G% L/ n" g5 k2 H; Z) z, N   Win32_PhysicalMemoryArray2 v7 S, ^0 u8 Q& L1 _* g3 x
  Win32_PnPEntity! m% J% D. M: {9 i
  Win32_PointingDevice! W4 Q3 z% D; w( n6 `+ i( t
  Win32_PortableBattery
/ V1 z* k& t- U: c1 u7 {   Win32_PortConnector0 `( ~5 Z1 E! Q3 V* X) z8 v  ^
  Win32_PortResource
' [4 b; N) G0 s2 t5 K   Win32_POTSModem6 n! ~7 w3 u3 r3 r1 N0 j
  Win32_PowerManagementEvent2 J3 @6 s3 g' q6 ]0 m
  Win32_Printer
: F3 B* A0 ?* c+ G, L2 f   Win32_PrinterConfiguration
$ h% a' G8 Y+ S/ m/ E   Win32_PrintJob8 a1 C. D5 `( K% ^, Q
  Win32_Processor3 X- ~7 f. c8 R0 L. s! R
  Win32_Refrigeration' O+ r7 h& t' O+ Z0 m
  Win32_SerialPort5 g9 L% ^6 j8 J  [1 g; u
  Win32_SerialPortConfiguration/ h& Z/ z* H0 D& m
  Win32_SMBIOSMemory& {/ k. K8 C& f3 I
  Win32_SoundDevice% u7 B! Z1 q! \+ N
  Win32_SystemEnclosure
$ ]- E" j! g+ x& i' O   Win32_SystemMemoryResource1 ^% d$ B, G5 n* d" k  L
  Win32_SystemSlot" F/ a; a* ?; H/ A; p* l* Z
  Win32_TapeDrive0 X/ n+ K/ o" U& t
  Win32_TemperatureProbe2 Z7 w, Z2 ]- Z% W
  Win32_UninterruptiblePowerSupply! t/ X( g3 e, q/ N" x
  Win32_USBController4 \9 H" L% L7 T- V
  Win32_VideoConfiguration4 Z, B& r8 C. o+ P: T/ b
  Win32_VideoController
7 M$ u; `$ B& G! s   Win32_VoltageProbe* ?7 @" D* E- u; F

, o1 u: K6 R/ ~) I8 g0 N( ^# {3 Y6 S+ P以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-16 06:47 , Processed in 0.018740 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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