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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
5 ~. ]2 _  Y. u- ?3 L& ~: g$ Q1 p% r/ e  ~' M8 H# Q" q

- k# Y8 [/ t: E) t9 e; {  j8 r' Y+ g: A--------------------------------------------------------------------------------
# i. S1 A' [3 r0 a8 U7 B. i2 BWMI: Windows Management Instrumentation (Windows 管理工具)
; M3 f2 ^$ m0 A2 |) t: ~% f: E   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
$ P8 T$ i0 o5 S* M! D: [   利用这个工具可以管理本地或客户端系统中几乎所有的信息。2 D! {3 U/ h+ n  x
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 , W: q( x" c: h
4 z* V+ v  G+ F+ v1 y; N! B' b
--------------------------------------------------------------------------------, C- X4 n9 ^% z) W
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
6 b. M* C+ e  Y& n1 B: s& L1 y7 s5 }
--------------------------------------------------------------------------------
! R8 C' O& [& N5 L' z① 初始化 COM 接口:3 ~) p: l* C7 f6 F: i. a' {6 K
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
% a8 C2 ]2 p. U6 ^8 }   这两个函数在 #include <comdef.h> 里面定义。
7 ^8 B1 P: Q0 L: _5 m) B1 D
7 p# b1 T3 [  b. n" v' Y6 M② 获取访问 WMI 权限:' y5 A$ E3 B, a1 [1 G: o
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);8 {. G: A' f: N4 g+ e' }
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
, T6 C0 ^/ S5 l: w: n; s6 N. J7 ?( `6 }6 m4 j  Z& \- N
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:) d4 m" O% u2 f- e
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
% S( a3 t( M  V1 G1 }: d- Y
3 w, R9 r: H1 C8 M9 tvoid GetWmiInfo(TStrings *lpList, WideString wsClass)! q. J& d# C% `1 `
{7 ^0 q- P' s! N& `
  IWbemLocator *pWbemLocator = NULL;8 }4 ]9 A8 M* q6 |/ C  Z
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)/ o- j! k1 `. G& D9 N
  {, |- I9 v$ Z) N/ g- y
    IWbemServices *pWbemServices = NULL;6 W8 {6 g4 X1 P- u
    WideString wsNamespace = (L"root\\cimv2");
$ {5 e, T2 j/ ^9 y     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
9 P' O; t2 o+ [. O- O# r      {2 s1 h; d  ~' m
       IEnumWbemClassObject *pEnumClassObject = NULL;8 O* G" v1 t% l  P# g
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;; D/ i# m8 ^# ^5 i3 f# Y
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
& V9 o$ |8 Z5 ]8 t         {
) o/ D* s& _6 g6 H2 x( [5 \           IWbemClassObject *pClassObject = NULL;& Y# y) y" g% a6 ?$ `6 A) q
          ULONG uCount = 1, uReturned;
8 ~" S& E' ]7 k1 c( c- F. j: Z           if(pEnumClassObject->Reset() == S_OK)
* ]7 F. K3 A6 [            {2 q9 g- a# n" v0 {$ x' w
             int iEnumIdx = 0;
4 ~" P7 A8 {# a. r              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
$ K; F/ P1 `' g0 B               {$ E0 v- u0 x& l2 ]: r0 W' M
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");& t+ p$ M% y6 b  a& x
- p$ e( M- W5 Q4 ^) J3 d
                SAFEARRAY *pvNames = NULL;" G& e$ C% M; m# n- a
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
: v: _' {$ i+ W1 F; q( T                  {
8 V3 b9 Q* N2 i5 v; L! r                    long vbl, vbu;
0 T0 c4 |" S7 h  T+ w8 U/ R# @; Y                    SafeArrayGetLBound(pvNames, 1, &vbl);# J" X2 N  g* G. r' J  A# L
                   SafeArrayGetUBound(pvNames, 1, &vbu);
) a6 u. b0 n9 n4 a                    for(long idx=vbl; idx<=vbu; idx++), g1 c. b" f! z3 D' [  `
                    {3 u' q& y# C1 V1 O4 e# E
                      long aidx = idx;' o  J+ d; B, ?8 A/ |- `
                      wchar_t *wsName = 0;: u$ u4 j" c" c
                      VARIANT vValue;) R9 ]2 y, \8 p2 ^( I! v  ^8 {) F
                      VariantInit(&vValue);2 H# n" P) L" T% e
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
$ K7 j# T4 l) R0 Y; {: _5 _6 a2 @
. o, {1 P& H+ I' I) U1 }3 T) z* x4 {                       BSTR bs = SysAllocString(wsName);' y" z7 A- q: ~5 X
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);* ?( m5 a$ v5 T' Y+ a/ ?: l! v
                      SysFreeString(bs);3 K4 @. K1 z3 [! R* _2 p# \

. u. K+ ~* S1 [9 \, N$ B3 ~# J- F                       if(hRes == S_OK)
5 f2 b/ U- |1 a! t& ~* G                        {# z5 v4 z' i' h0 r/ `% U* L! N
                         AnsiString s;, `  j4 o# r& Y
                         Variant v = *(Variant*)&vValue;" {' |; @. J1 @3 @* U+ I
                         if(v.IsArray())
* v4 t1 H2 Z, x( H                           {% q' n  |# d. _4 R  ~% d
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
" K* \) G9 t* I% W# g                              {
: u' P; `8 v# F. s# k- B                                Variant a = v.GetElement(i);
1 S8 U. [7 ^" d# X6 M. z" d9 W                                if(!s.IsEmpty())
0 j8 F& D' S/ k& M0 K: d' }                                  s+=", ";6 G9 y  [# |: a1 S* L
                               s+=VarToStr(a);! L$ J3 f" N8 m! j5 z
                             }; M2 z0 p+ n' q' Q1 @3 v4 [
                          }, ?6 `$ U# A) a! [
                         else. z5 W( y; |+ m9 R
                          {
7 ]' ?: g! {* V7 m' m7 N                             s = VarToStr(v);/ [; E/ n8 x1 I
                          }
; h" b7 }; S/ k6 ?: ]) p: G0 y                          lpList->Add(AnsiString(wsName)+"="+s);  P$ Z3 Y2 d( q3 d6 h4 c0 m
                       }
9 P1 ?  Q6 k- |+ {9 U; }" U6 Y2 l1 d# k7 i
                      VariantClear(&vValue);
: c& W4 u$ J5 V7 j  I: M: L4 J1 L                       SysFreeString(wsName);- d9 [' |/ s6 C
                    }: F1 Z0 i/ @0 B/ a
                 }
* a& b: k! f+ J! W                 if(pvNames)SafeArrayDestroy(pvNames);
* F5 }" {4 s: _- W( I2 P                 iEnumIdx++;9 x0 o+ i0 I7 a& w
              }* n: q# N2 D, B  M
           }7 Q. ]& H* Q8 N( `8 A! q% [& U
          if(pClassObject)pClassObject->Release();: E+ [0 d1 M; J
        }4 p3 r3 z  T3 i( E. g. l2 x
       if(pEnumClassObject)pEnumClassObject->Release();
& j4 i, X: c$ D      }
" S$ y2 V0 o( {# h     if(pWbemServices)pWbemServices->Release();
2 D4 o( q/ G' M+ V% c   }, M( ^1 l1 H8 \$ ^* d/ H1 s
  if(pWbemLocator)pWbemLocator->Release();
( t$ U' q8 X) P0 r" J6 C5 Z" K}
. ~' Q/ e. Q# c//---------------------------------------------------------------------------8 h6 r! i. `+ W4 t

) h* y: U, B- Y' a% Q* g9 M// 通过 WIN32_bios 获取 BIOS 信息:
+ R$ I$ l' A# W6 s% Z9 J. evoid __fastcall TForm1::Button1Click(TObject *Sender)0 G/ N. }6 m- Z6 \) P6 c1 M" Y$ O
{
1 ^. f9 h! X) Z; H6 Z! z* W9 u    Memo1->Lines->Add("================== [WIN32_bios] =================");. ^0 \4 ~" r7 x' C+ `7 I  `
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
1 d4 l! [' q* S- o* A0 ~; {    Memo1->Lines->Add("");* c( H& {! o/ g/ I/ U
}
4 g. L3 r! i) ^% q5 b# i6 B( k) g6 T
* ]' E3 Q/ Y7 f: j! n--------------------------------------------------------------------------------
9 E, _1 c' ?- r; M! `4 Y+ W6 }8 p# q' m4 a
WMI 可以访问的信息类型有:
! o+ w, s8 B) e2 f: [& e+ Y; C   Win32_1394Controller: J4 R/ j* ]6 Z3 j0 t% W- R
  Win32_BaseBoard
) ^) \7 `* @+ T& z; f   Win32_Battery7 e- p) t- M: \% g  k" s
  Win32_BIOS
/ f" @( a: H7 r) G3 u' |   Win32_Bus
% Z  o$ m/ |3 n: Z9 L0 [   Win32_CacheMemory
* d! X1 d9 X' H- g4 h6 K   Win32_CDROMDrive; m' P4 D. v" H9 E* l. Q& t+ m7 m
  Win32_CurrentProbe
' c3 Q0 k: F0 A; t! S6 S. f   Win32_DesktopMonitor
. y& [9 U/ X7 l) j6 {5 y   Win32_DeviceMemoryAddress
! i8 ?5 _9 q, A8 E! |   Win32_DiskDrive( T6 Y6 b0 k6 I: X8 H# b
  Win32_DisplayConfiguration. z) r' `$ y+ f2 U
  Win32_DisplayControllerConfiguration
0 \  E' ]* d) C3 o3 r: g9 ], K5 C! l   Win32_DMAChannel
4 y3 B! ]# i; ^/ N( }. J" b0 Q" I   Win32_Fan
& B) X/ b- n( Y# @* ^3 E+ N' x* [   Win32_FloppyController% q( v7 m1 H  m. j% V: t: v' W
  Win32_FloppyDrive8 T1 g! X4 ]; P  g. \" q( F
  Win32_HeatPipe. F* \0 _$ T- h) d3 m! ~
  Win32_IDEController4 I" r6 o' t. ?) q  [$ p' y8 i5 Q  F; f
  Win32_InfraredDevice
" z3 u' s8 Z, \4 ]7 U3 @% t' u   Win32_IRQResource2 f& v  |  v! _5 S
  Win32_Keyboard
* U, W* W$ p/ [) F   Win32_MemoryArray$ I4 L. z- Q$ W! l1 T" ]
  Win32_MemoryDevice
8 m3 e& r& G0 z. b8 r   Win32_MotherboardDevice
0 l2 K- r' l8 W" }5 G5 v   Win32_NetworkAdapter7 \7 j# a  g) @; d2 ]/ t4 f5 u& D
  Win32_NetworkAdapterConfiguration8 D8 T( ^' }( f. q; y$ i
  Win32_OnBoardDevice9 G/ E+ {+ A* h8 V. J  B
  Win32_ParallelPort
/ z" v3 _; r) h   Win32_PCMCIAController
1 [: j* u1 E. n$ l+ u6 I1 i   Win32_PhysicalMemory( X4 p4 a- P6 ?8 N( A
  Win32_PhysicalMemoryArray
! r5 N  k6 }4 K+ ]+ H   Win32_PnPEntity
6 Q0 R: o# d/ Z. V3 ]- D   Win32_PointingDevice9 ]4 d" y6 f. J
  Win32_PortableBattery/ J/ `! S  @, y* l
  Win32_PortConnector
0 F5 ?* i: w8 l) ]/ {  P- [: ?   Win32_PortResource9 Y  X: D9 o0 p3 w
  Win32_POTSModem" y$ R& U3 b2 Q+ c# m1 G$ G) n/ |
  Win32_PowerManagementEvent
8 S- T; G4 L( X5 C* n   Win32_Printer# ~4 S% d1 P& e* H; B
  Win32_PrinterConfiguration9 K5 @1 h" I. c: H
  Win32_PrintJob
+ L5 H) X& G( x   Win32_Processor
( }( p. y( v- C  _; ]   Win32_Refrigeration! C0 f% q, V/ n1 x5 O! T
  Win32_SerialPort9 D9 X5 {: ~" L) ]* K- a+ B" F
  Win32_SerialPortConfiguration
" Q7 {0 Z, z+ U) S+ L   Win32_SMBIOSMemory. k% A" Y3 N, V1 b4 z$ }7 T9 C
  Win32_SoundDevice) L  t/ u4 b+ L- j0 t* j
  Win32_SystemEnclosure+ m; ~; f, S  D8 ~; x: P+ u
  Win32_SystemMemoryResource& w8 M& v2 v. @$ Q1 F; d! F6 _0 _
  Win32_SystemSlot% G' x  ^9 K1 g7 U+ D" S. p
  Win32_TapeDrive+ c8 T+ I/ d. O7 P! v7 K. Y
  Win32_TemperatureProbe+ V. `6 ]2 r0 i! i
  Win32_UninterruptiblePowerSupply5 C% @% V, s) ^! A0 ^+ A
  Win32_USBController& T; Q/ D/ ~: \5 g) Z
  Win32_VideoConfiguration
+ Z0 X) w6 d! R; B4 r   Win32_VideoController, }7 V! J0 @; {; ?7 h- s& R0 L* T2 W
  Win32_VoltageProbe  H% C: v5 ~" E3 @
! w& ?0 c/ H3 Z) D* {; u
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-28 05:34 , Processed in 0.020024 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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