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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)( h+ N0 _6 |: V3 x% X
# j8 A: p! a% q% M8 o

4 S2 C: n) |+ P- Y--------------------------------------------------------------------------------
; E! J6 R1 N' ~! B0 m% [# NWMI: Windows Management Instrumentation (Windows 管理工具)
; C) ?$ F/ S% t6 V6 q1 V" q   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 / A2 o+ P/ q* }$ x" e+ O# i
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。& s/ Y8 F! V+ \. x% g( v
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
" S( n5 e: x9 j% n, t: ?6 n: V; n! I( F6 P" ]1 d
--------------------------------------------------------------------------------
' X' W5 {0 w8 k; PBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面( b5 E9 v. [) s* p; M, a4 E2 X$ d
  N& T& x2 G# J1 o
--------------------------------------------------------------------------------
4 Z; ~! _# k3 ]) P( w# k2 K① 初始化 COM 接口:
# [2 K* g8 O5 z" e4 ~   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。7 F) ?0 L( R, D% w6 D- ?
  这两个函数在 #include <comdef.h> 里面定义。, Z2 d  I1 V% l2 Q, w

; T1 w) w& f- ?2 B1 _, P: d- o② 获取访问 WMI 权限:
0 N% c# v4 ?* [! \   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
6 b& o1 _& H/ Q2 Y; D0 t3 s   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
4 M% U0 ~$ y- }; V  S8 Y8 y
6 p0 D$ m% W% q) [* ~% f" b③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:$ O; N$ a7 E% B' ?1 A7 F3 k
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。* c* r7 {9 C- b! `, ~

* Q* ^) \& ?4 g9 J, Y; Svoid GetWmiInfo(TStrings *lpList, WideString wsClass)
* r+ T4 m& V# I" g& O% Q) H+ a& e* n{* ]4 X* l$ z1 k2 o& R
  IWbemLocator *pWbemLocator = NULL;5 d0 b$ ~+ Y9 K3 p0 K
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
# G# F2 G. {/ C" c9 B2 K$ J9 E   {. A5 S1 g% v3 ~( t3 X+ w" I, F
    IWbemServices *pWbemServices = NULL;
7 t& `- c2 s/ O) o) b9 ]$ Y: @     WideString wsNamespace = (L"root\\cimv2");; ?8 X9 Z2 d; o8 E! Z# K4 t: d  p
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)' j) R* z' E3 L: y" Y$ a- o
     {
/ E) a0 M  w( u4 s2 ^        IEnumWbemClassObject *pEnumClassObject = NULL;
& G5 G% J4 z7 k% C6 U6 Y$ u        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;7 Q; ]( y: }. `" P6 H. c
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)& i2 B5 R4 [4 H2 x2 \( ~
        {! O1 I4 L% X8 \- R( P
          IWbemClassObject *pClassObject = NULL;! N) ?& ]- q0 ?  w) V2 A2 K
          ULONG uCount = 1, uReturned;' n& v3 `0 V( L1 C
          if(pEnumClassObject->Reset() == S_OK): |' ^% w! @5 c# `8 S7 s
           {4 e( v4 w  W2 w" ?& Q
             int iEnumIdx = 0;
; w6 e& D1 v2 _, Q8 c              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)3 ^+ k' H) `* S9 b% x, F; ?
              {
; r! r# a" A- _& U                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
) {) i+ {3 y8 i9 m$ P
1 {3 a0 h# M' h2 q* Z1 l! j                 SAFEARRAY *pvNames = NULL;
! z. F4 V  X0 \                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)3 B& r3 o  K% x( E
                 {- B3 z- `) p: e% F0 I4 [  H
                   long vbl, vbu;
+ l8 c; a0 u& I- D+ @# n) c                    SafeArrayGetLBound(pvNames, 1, &vbl);$ ]4 _4 W1 R6 K' D/ U) }9 w
                   SafeArrayGetUBound(pvNames, 1, &vbu);$ o7 M+ G. f& v& D3 V8 B
                   for(long idx=vbl; idx<=vbu; idx++)( Y( |& H# Z( W1 |  Q
                    {0 j+ ^0 ?. a: x  z3 q1 R9 `0 ~
                      long aidx = idx;% v7 {0 {( F, s' g5 y2 _
                      wchar_t *wsName = 0;
$ C) i7 \, O) @' g, u* a3 s: y                       VARIANT vValue;
9 ]+ y8 F1 ~8 m9 J+ c& d# C                       VariantInit(&vValue);
, l8 o4 l% r; y/ E4 v                       SafeArrayGetElement(pvNames, &aidx, &wsName);
$ o" ^7 C; @; ]5 t2 Y1 L/ h- R: o" k) n% F% M/ M- k$ N
                      BSTR bs = SysAllocString(wsName);6 P; M1 P& m7 ?6 h
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);0 Z4 g. B. T( D+ ]" h; @! S
                      SysFreeString(bs);2 J  _7 x- j' u. D5 \

( O3 A; p' r4 A7 i9 h                       if(hRes == S_OK)7 d2 N9 W+ a: ~
                       {
3 K! C! m  y/ X' f                          AnsiString s;
$ o% o& g8 O+ U                          Variant v = *(Variant*)&vValue;
4 l) V  n4 `" L                          if(v.IsArray())
* Z$ a  F% a. N) a                           {
1 r* H0 ?2 I% u! d. U  v                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)$ }1 v+ l6 j* Q1 T
                             {' y' L7 g& a% i
                               Variant a = v.GetElement(i);- B& [8 j9 U( k( v3 k% f+ l
                               if(!s.IsEmpty())
8 J5 P& Z* `2 A# M# H8 w                                  s+=", ";9 j- y5 D/ B+ v
                               s+=VarToStr(a);
! K: g0 M7 e. C% P2 Z                              }/ V9 e+ D" J( s; T
                          }
3 a" A0 m4 M8 _                          else
* V6 y. f, g$ d& P0 Y3 h                           {0 }/ f( }! Y5 k2 F( H( ]0 U
                            s = VarToStr(v);
/ `& X/ a! z" a9 Z5 a; n6 X                           }
- V% l2 \6 @8 Q                          lpList->Add(AnsiString(wsName)+"="+s);( g8 u! z% i8 Z
                       }  M4 V1 K* p* y0 K

# W+ ^. f6 R0 D5 U/ j/ o                       VariantClear(&vValue);- e7 g* S" @( ~# j
                      SysFreeString(wsName);
% C4 Z/ y) k9 Q/ G0 o                     }% p( U  G9 w' D4 C
                 }. o$ a0 J' g% ?+ @* ^
                if(pvNames)SafeArrayDestroy(pvNames);
3 E+ Z5 j2 o4 l                 iEnumIdx++;; A6 |8 Z, m! C9 v& i
              }' V' H/ x& f  a- A, h
           }
4 @+ @- k) _% V           if(pClassObject)pClassObject->Release();
0 z. u$ Z( ?, ?* @         }/ v4 F& F) D/ `0 m8 |
       if(pEnumClassObject)pEnumClassObject->Release();9 X! b" V* Y# T. J/ d. J" D
     }# ?, j/ \( n6 T7 k8 H* V) T
    if(pWbemServices)pWbemServices->Release();; O7 p: r! Y$ m' J
  }
( V8 E; P; K1 f$ w. L! a$ y  if(pWbemLocator)pWbemLocator->Release();
$ `6 W9 ?. o$ |}5 o( b; p+ X$ ?$ v5 b, L
//---------------------------------------------------------------------------9 G! Y$ r# L# V6 E6 h+ o/ [- ?
% Z0 d" F+ \/ |% e/ [
// 通过 WIN32_bios 获取 BIOS 信息:
/ w, D4 a5 Z1 N7 {void __fastcall TForm1::Button1Click(TObject *Sender)1 Z" j4 j! d2 g- y
{; L# @* s1 x4 }
   Memo1->Lines->Add("================== [WIN32_bios] =================");
; }# R7 |# ~# v; s" v* R5 p    GetWmiInfo(Memo1->Lines, "WIN32_bios");5 ]3 A  @! K) T: k$ a. {7 S1 F
   Memo1->Lines->Add("");/ j. U% @5 T7 t6 N
}
4 {9 Q* c1 O# h& @" l8 F, A' |; F2 \; P, w/ `) _5 p" \' r  L
--------------------------------------------------------------------------------
5 A4 S- E6 R$ Z& _( h, P: ^5 J, o9 u5 \
WMI 可以访问的信息类型有:
5 {5 u9 n& H) [, B+ P6 }. H8 v7 H   Win32_1394Controller
/ ]/ W* C5 a5 z1 p+ g$ a   Win32_BaseBoard
. R% r% f6 [. p1 k- o" d   Win32_Battery" V( g0 \' |+ u' F7 x
  Win32_BIOS
) Q3 j/ A3 o- i- I2 [   Win32_Bus
$ h5 b$ g# i! X" x, P   Win32_CacheMemory
$ h  c/ M# s( H1 U- g4 h; @) [   Win32_CDROMDrive
. |$ u4 |7 |; s+ o- e   Win32_CurrentProbe3 S0 Q8 s( |% K- u+ Y1 G' Q) W
  Win32_DesktopMonitor
( h* }6 |; H) \   Win32_DeviceMemoryAddress
( V( T6 E) W! Y   Win32_DiskDrive
# e+ @; w3 E( V9 o7 G% ?! c3 F   Win32_DisplayConfiguration# g/ o; Q! S9 g
  Win32_DisplayControllerConfiguration
- X$ X3 a$ b" u: s   Win32_DMAChannel% r, u- Z2 l3 t& z8 F/ m
  Win32_Fan0 @& B9 [$ h! N. g; a
  Win32_FloppyController) h# x2 e1 [# @" k1 c
  Win32_FloppyDrive- v9 w3 x$ d" o) y/ V; g9 R
  Win32_HeatPipe
. L& D. t% r  ^& ?+ f# e   Win32_IDEController( y- Q# @7 ?% Q$ k! w  @
  Win32_InfraredDevice( \! r5 P+ f! a( s
  Win32_IRQResource7 a) q* z, K  m% q. k6 w3 G- L% P
  Win32_Keyboard& b3 F3 ^0 }7 l. X3 U7 h
  Win32_MemoryArray
% d: q3 y# K& e: B6 h( s   Win32_MemoryDevice
$ l7 X. q) b! Z' B) x, v; d1 |8 V+ ^   Win32_MotherboardDevice
8 Y2 _, p- z5 a& g   Win32_NetworkAdapter
6 x* ?5 i5 }; M2 r1 r! p   Win32_NetworkAdapterConfiguration5 {: M/ z: i9 c* Z! Q  k6 ]) K
  Win32_OnBoardDevice
! Z; I% X; X- y3 k8 ]   Win32_ParallelPort
+ \1 ~& U% }/ i% }6 W! t   Win32_PCMCIAController) t8 p' [. _4 ]. O
  Win32_PhysicalMemory; u# F/ E: }- p7 X. T3 F
  Win32_PhysicalMemoryArray6 L' x* ?# K8 c
  Win32_PnPEntity6 u5 n, x9 C+ ^5 B( P, H5 c
  Win32_PointingDevice6 E: T* D) N* R
  Win32_PortableBattery, ~# [) ~! ^4 n3 a, ~1 b, {& Z' b
  Win32_PortConnector8 [5 }# t+ q$ [/ c2 `/ d( R
  Win32_PortResource: ~) Y. l  V1 Q( @" P
  Win32_POTSModem( m1 D% y2 z3 p& S
  Win32_PowerManagementEvent3 |$ q3 i- W! ?; y
  Win32_Printer
, D0 A( f, K9 C! G; c0 Q7 `+ j   Win32_PrinterConfiguration
/ J; o+ y7 I: i   Win32_PrintJob
2 H; u& G1 z/ p! E! Q- y   Win32_Processor2 r) V: y6 J/ g: Q
  Win32_Refrigeration
% f* x* v- w) s% M. i1 f7 o   Win32_SerialPort
+ Q% e7 i# T# x) x3 e& O" M   Win32_SerialPortConfiguration
- L. `$ Y1 e9 {* u: {8 C) u   Win32_SMBIOSMemory
2 q' N+ S$ ^+ ]   Win32_SoundDevice/ C, o8 Q# ~( M4 v% ^: n0 M
  Win32_SystemEnclosure/ k& Y6 a0 ]  y4 ?
  Win32_SystemMemoryResource; {4 ~) ?0 G( j% X8 E! Q. U
  Win32_SystemSlot
5 B( k1 ~' y) G) b+ J* {& h   Win32_TapeDrive
3 _% u3 s9 B7 f   Win32_TemperatureProbe
" y* q) Y. z. T4 U/ p* H   Win32_UninterruptiblePowerSupply! t* b+ y: s" F- X4 R7 B
  Win32_USBController+ Z7 j3 g: ]" |8 J7 A  \4 a6 I8 E
  Win32_VideoConfiguration
  C+ b4 F# W0 ~, V   Win32_VideoController
9 c1 O* l- @2 \+ c! u# @5 l   Win32_VoltageProbe4 C3 t* _6 Y8 U# j
1 f: C% d0 _) x7 Z5 }# v( ^$ _, r
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-7 07:18 , Processed in 0.020573 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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