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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)( K9 [) b4 H+ {

9 G$ ~+ y; z# |, }! a
" g7 W! r& s6 W+ z--------------------------------------------------------------------------------4 ~: d* `: N4 i' W
WMI: Windows Management Instrumentation (Windows 管理工具)/ X5 P/ z, `  L; K  W- r
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ( [9 L" k8 w4 j( Y& C
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
6 \, M" V( A8 w$ p+ ?. E6 _: n/ i   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 " U7 C/ a3 b. C/ m) L9 q

0 }& z9 C  g+ N2 E--------------------------------------------------------------------------------
1 {" g- c, T+ `$ \6 H  u! |0 eBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面( T% v# y  p3 ?$ ?  S

4 Y+ p7 H# X9 F% @! P9 F9 F2 N--------------------------------------------------------------------------------% M5 c9 |$ y, Z- Q
① 初始化 COM 接口:- I, C! X) v. B/ S( A
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。$ \! q7 G$ S5 \2 K4 m5 O; l
  这两个函数在 #include <comdef.h> 里面定义。$ T' g. O2 U2 p4 l( p0 T
6 o: o2 s8 ~" L9 o1 O. W
② 获取访问 WMI 权限:/ ]* }* f8 m5 S: i9 D
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
4 ?: i* E+ B% f! ]& e& {; B1 ~* G   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
7 }% Y, ~* L& p7 D8 h5 g3 ~+ f: c) z3 x
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:7 c5 N$ ?3 T1 r$ y
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。: K. ~/ M6 a/ F' q* `+ J

' e- H& p8 u9 @$ Q/ l7 Gvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
& R+ ~7 r4 h1 l! @9 B3 c; P{
; J& ?) T1 V  R* w8 {  IWbemLocator *pWbemLocator = NULL;, {" J$ m. ^2 E" p3 B
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
+ Y) l5 Q3 |* W' k. K4 p" o; }   {
" O' o$ U: t) l1 ~     IWbemServices *pWbemServices = NULL;/ c1 W- w  L. q8 f, B  }, W; {
    WideString wsNamespace = (L"root\\cimv2");' W4 ^) e* P- V
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
2 X$ I& B# y) F& ^/ {) i+ a      {6 P8 Y0 H0 H# q: ~/ F/ G- ^
       IEnumWbemClassObject *pEnumClassObject = NULL;
" H2 `  z* A9 V2 s        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
: p3 o/ i, B2 T        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)1 _9 k0 J% j( O& t
        {7 @7 L$ w9 Q) X$ D+ D1 y. \
          IWbemClassObject *pClassObject = NULL;
9 p2 K, z6 A+ v* f6 N           ULONG uCount = 1, uReturned;
# p/ |3 {7 V2 P           if(pEnumClassObject->Reset() == S_OK)4 Q- X! ]1 a5 d# ~% `
           {% H9 M# Z5 @, s6 u
             int iEnumIdx = 0;$ A" ]3 ]* `1 c7 \+ k
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
( L7 U; I; |$ y, i6 |               {$ [6 c. j- O3 o1 m
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
7 f7 Q& V; U" ?  ^4 U7 |, K" e4 O) X7 s- O9 {& Q: O% }
                SAFEARRAY *pvNames = NULL;/ {! H* W4 N, K/ `
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
$ t3 G$ ?6 t: f0 m- z                  {4 P# ?2 v. H% c; ]
                   long vbl, vbu;9 C* P2 ]4 l  {
                   SafeArrayGetLBound(pvNames, 1, &vbl);
2 i4 v& R5 _9 u, D; J                    SafeArrayGetUBound(pvNames, 1, &vbu);
9 ~1 S4 U# w4 H' x1 H: w: Q' g                    for(long idx=vbl; idx<=vbu; idx++)- z3 z9 Y5 \$ E2 ]" z4 `. H
                    {
- T' T5 I* F) T- a% @- g                       long aidx = idx;3 d2 f5 V! f7 R, L3 _9 o4 K
                      wchar_t *wsName = 0;
" C) [* A3 `" }9 j                       VARIANT vValue;
; G6 j% K9 V# j                       VariantInit(&vValue);6 r6 A- l, ~+ f- H  `
                      SafeArrayGetElement(pvNames, &aidx, &wsName);5 \' e! {* m' \0 W* o
* R' Z: {5 ]6 _. I& K
                      BSTR bs = SysAllocString(wsName);' N4 Y: Q9 G: Z: v
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);6 |/ a  T( r: \6 A/ A
                      SysFreeString(bs);8 O* J9 d2 e5 h9 A7 T! r/ V7 Q

2 c$ b  D1 D+ \* H                       if(hRes == S_OK)
; M' h1 O. C$ v3 n  [& f8 G                        {
. ~* v7 I, F' X; T( h. i1 V* h+ v                          AnsiString s;
7 l' [1 C% {- y( v9 x/ @                          Variant v = *(Variant*)&vValue;
8 ]# K0 L5 G/ T. h! S  b0 H                          if(v.IsArray())0 H9 R2 ?& ~) a
                          {
5 B/ P" w' `, s. u( P: ?7 v                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
& i2 R. t5 l6 o2 N; A8 r# P+ ~+ j                              {, n$ _# R! ^2 r9 W* \  k/ B
                               Variant a = v.GetElement(i);) a1 p4 k' _- N) h) E3 z  J
                               if(!s.IsEmpty())" O9 t- a% ~; y" B8 E( G: ]. S
                                 s+=", ";! D6 C" u- I7 s  E; }# Y
                               s+=VarToStr(a);
# R+ _' h0 S" C/ \. @                              }
9 W' @4 V* }7 K  Y8 z                           }$ |: v2 r$ {; d' s$ I9 {
                         else7 x0 I6 s# n. g( @5 B5 l
                          {
2 F0 D. m: p+ ~3 ~+ P2 s                             s = VarToStr(v);
3 L, o( x$ n6 S  k2 B! N) U' Y: s                           }7 k; q% s8 i. i! @  Z" N. d
                         lpList->Add(AnsiString(wsName)+"="+s);
8 M, o# F" }9 }  S* i                        }+ k( E3 F3 k, W1 a. z* s
; \, v; g1 K7 w1 p' v9 y. b
                      VariantClear(&vValue);, R4 {, l: u. [; I1 _8 e9 J8 [  P
                      SysFreeString(wsName);9 h7 |, J% f+ G- u
                    }7 a) ^- l) z- Y+ @2 Y. H
                 }# X+ B$ H$ l: K. Y8 X
                if(pvNames)SafeArrayDestroy(pvNames);. u2 O, k6 E0 z( _2 f4 y! W
                iEnumIdx++;4 X8 X! G8 `( p
              }
3 s# j9 E8 ~. }7 e' E; ?            }
8 d5 M. b* i; O, a2 O- Z  C           if(pClassObject)pClassObject->Release();
1 j+ T9 A: o7 h. S. W         }
% y4 a  I1 n8 ~) [6 {; A9 z        if(pEnumClassObject)pEnumClassObject->Release();2 G; S: @& X; g! d: ^5 u4 H
     }
! i, I7 I9 M. q6 `0 G! x     if(pWbemServices)pWbemServices->Release();
4 S: J5 X& m2 ^! L( F- n, T& H$ A   }4 I; t' h$ E% m" W2 P
  if(pWbemLocator)pWbemLocator->Release();
! [: D6 t& w. P6 D; r}0 w- H; v# X8 S2 O- n
//---------------------------------------------------------------------------# M$ J4 S9 l1 E. ^: B' {
% p7 M- L& B0 ]; A# T
// 通过 WIN32_bios 获取 BIOS 信息:- G5 N2 E6 }- }
void __fastcall TForm1::Button1Click(TObject *Sender)
! z* S# z1 W) e/ B( P2 R7 A0 k9 G2 C{
1 s( q4 Z$ W+ z5 R5 y7 m4 U; X* e3 t3 z    Memo1->Lines->Add("================== [WIN32_bios] =================");' o  X8 |, J( V* r& b4 q" P
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
7 n' H* R# H8 k! D$ |    Memo1->Lines->Add("");0 Z( ?, q6 R' O" A/ F  G
}
8 r2 D7 H5 ^' y) U; }# z( b/ x
* |. R9 b6 R! A' ^+ K, G& `" y0 F--------------------------------------------------------------------------------- o. W8 Y: ?: y% T
( a' X# p0 w  k% A7 n. v
WMI 可以访问的信息类型有:# T; _* Y3 @# }: D3 r  C  J4 I
  Win32_1394Controller" x6 h& q; z$ p
  Win32_BaseBoard6 o4 M, @( v8 a1 S6 r0 S9 ~7 n/ Q
  Win32_Battery* R1 E& u( j7 n. D  l
  Win32_BIOS9 x& G3 g& A  s* f* V* s
  Win32_Bus9 `( P3 C2 M. k' w% o: A2 E
  Win32_CacheMemory
6 d% @4 \* Q; l1 ^$ A   Win32_CDROMDrive
7 x3 @" F0 L! s   Win32_CurrentProbe
2 b0 M5 Z' ]7 z6 \( `   Win32_DesktopMonitor
8 C$ V9 s3 Q3 k: Z$ N/ Y  {   Win32_DeviceMemoryAddress
3 X4 l2 H! l# v) K   Win32_DiskDrive" o: D" b1 r) V) ?; X  V  a$ E
  Win32_DisplayConfiguration
: N/ r( I5 |+ K6 ^, ?* z  P   Win32_DisplayControllerConfiguration
. c% w7 J% S8 t" y+ [   Win32_DMAChannel
( L4 Q% Q+ z. t6 \5 L* G   Win32_Fan
) o4 P: V$ o  v, F/ ~. ]   Win32_FloppyController( R  T/ x3 @& v6 ]0 x. j
  Win32_FloppyDrive! t2 F5 d) Y* i, E
  Win32_HeatPipe$ N. Z1 f! [$ e, q' A
  Win32_IDEController
1 h" W1 r; N" J5 e   Win32_InfraredDevice
2 \$ V! W# Z3 a$ W7 Z   Win32_IRQResource6 r- b# U; \1 ?% i& C7 }
  Win32_Keyboard
1 `& {8 Z5 u7 e& q+ m' a1 m$ Q/ D   Win32_MemoryArray  C' A% r7 i# \& p4 _  o0 B8 e  s) q6 j
  Win32_MemoryDevice
# h" z( z* p2 _8 R. l+ E; S1 R   Win32_MotherboardDevice6 S% p! C. s7 t0 }( c3 o
  Win32_NetworkAdapter5 L! k& l0 d! a1 `$ S
  Win32_NetworkAdapterConfiguration
3 Z; o1 }4 ~) R3 E+ |   Win32_OnBoardDevice. n+ f# M- R( o
  Win32_ParallelPort# e% t, F) A3 K) n9 A* ?% }  l1 ]
  Win32_PCMCIAController
" W+ |8 l4 ]6 T4 }+ x# t   Win32_PhysicalMemory0 F6 A" ?' E# x3 b5 i% ]- b
  Win32_PhysicalMemoryArray9 X0 j- `+ n' d$ K- N+ s; A& O$ C0 N
  Win32_PnPEntity
* v9 Q% ^5 l5 K, x# W* E8 J   Win32_PointingDevice
! t' y3 H/ W& i   Win32_PortableBattery
0 e3 j& T# M2 W$ |% u: I+ ]6 t   Win32_PortConnector
( _/ p  o* U8 R   Win32_PortResource* y2 z. |) L! S1 [) V2 Q" \; ?+ Z6 I
  Win32_POTSModem5 d- N% w' B* N* x" ?4 j( X  E
  Win32_PowerManagementEvent
& ~- s, m6 q. b7 o' @" q   Win32_Printer
7 W& d. y: t* w) g7 D) Q( m' W. _   Win32_PrinterConfiguration, r6 [1 Y$ [; a; V& g& J& M  P/ v5 ~
  Win32_PrintJob
9 E% P4 v7 y6 q   Win32_Processor
7 V, N4 ^, ^" y5 C1 t; ]# E   Win32_Refrigeration
1 a- w2 D9 d/ S# [/ n6 l   Win32_SerialPort2 y! {6 Z4 M8 S, {3 F8 b# W
  Win32_SerialPortConfiguration
. l. h- h; M0 _; F7 h   Win32_SMBIOSMemory  k/ E0 w1 q* ^  d
  Win32_SoundDevice
- ?& j0 d7 ]0 }6 ]) m   Win32_SystemEnclosure; v8 t: m5 M* Z8 g4 N
  Win32_SystemMemoryResource
: Z9 o7 W4 B3 ~$ d' T   Win32_SystemSlot
6 U5 }# m  L' @   Win32_TapeDrive
  M* W7 R/ p  K+ x3 ]# Y$ E   Win32_TemperatureProbe
3 I9 J! {. S( I2 x2 g: L$ [: a+ ~# _4 n   Win32_UninterruptiblePowerSupply) h5 B; k  O5 C; _5 Q% v
  Win32_USBController
) T& M% o1 H2 N; d5 h   Win32_VideoConfiguration2 O% |1 r" w4 h; i  L3 V# ?
  Win32_VideoController* t9 Z" X# C* k
  Win32_VoltageProbe
: Y/ g  R' ^1 y- X) Y& H1 f7 v- v9 D& y6 w8 S. a8 B& o. ?
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-20 01:47 , Processed in 0.020100 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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