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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者): l7 Y0 r! v" T

6 l# r  O/ \8 T; D$ X
% T0 j& S9 K  D# g4 ]2 a, h--------------------------------------------------------------------------------
" k0 E) [" F8 i# iWMI: Windows Management Instrumentation (Windows 管理工具)2 [$ z7 Z# m% @0 `
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
* Y8 p* A, f( ~, x+ f! ^& _   利用这个工具可以管理本地或客户端系统中几乎所有的信息。/ y1 `) ]" e' `0 n
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
# B/ o! y% y$ O+ m% |' ?
! D+ j) ]# i5 F) q--------------------------------------------------------------------------------
& _+ j9 j& n' {- dBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面1 j' h/ U3 W1 e/ i' z/ c
- F8 i1 P) D8 P3 S, b
--------------------------------------------------------------------------------
. Z& J2 w: `: W* L& E① 初始化 COM 接口:5 c8 ~/ w2 }5 y- n
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
/ Q) `) M! B, L; R  V( {   这两个函数在 #include <comdef.h> 里面定义。
$ B) J) {9 W  a$ L
- B* t2 h( |& e; t  V' v4 e+ `② 获取访问 WMI 权限:* n# v: R: Q9 h2 Y. J8 Q; i
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);& P0 E1 l: P4 f
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。" T6 h% h* u2 ^* H+ u( r8 H
7 S4 |$ k  e1 z4 y) B& |' ?# |) m
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
! e- a! _1 c; g. c   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
( P" k) T0 k- D4 B6 a
- k. F, r- o( j/ A, cvoid GetWmiInfo(TStrings *lpList, WideString wsClass)/ P& G0 L/ ~5 i; c6 E6 ?% T
{
5 E# B! u9 r! ~9 H# Y, ?! k+ T  IWbemLocator *pWbemLocator = NULL;
: W% i4 t- y0 A9 \$ m. J/ g  A  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
/ R! O: y# n) q/ t" v   {- g1 @+ O$ q2 s
    IWbemServices *pWbemServices = NULL;
! O" O# P4 Z( c4 Y     WideString wsNamespace = (L"root\\cimv2");! g& T* H- E* A( W8 Z
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
  V# S7 R% {) f6 X( g      {
! @7 q- |- M7 n* N( \# z% E# Z- y        IEnumWbemClassObject *pEnumClassObject = NULL;
, I7 w# q5 @* \% t6 f8 K$ h        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
8 P! ^. p; p2 T- Z/ H        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 I! V- z+ u+ A  _7 b         {
( O- o% N9 d. i* z! u! c9 Y           IWbemClassObject *pClassObject = NULL;+ L' U2 n3 X1 `7 ?1 n
          ULONG uCount = 1, uReturned;8 P" w- W7 {: ]: S
          if(pEnumClassObject->Reset() == S_OK); [+ M4 u# ]2 m  g+ B# ~) t
           {
6 Y8 y1 x* B/ f# G& K# M  }" F+ \              int iEnumIdx = 0;
2 W+ x! s1 m6 G- t1 R              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
, o. T' d9 ^5 Y2 F. Z               {2 K; M2 Z, r- `; W- C
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
1 D5 E  u8 }6 {9 {
4 g! w- v9 a! z; V7 `6 I                 SAFEARRAY *pvNames = NULL;* A+ c+ |  ?8 _
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)$ p. G7 Y* I5 f. I, n3 d
                 {
& y2 Q# j" @9 B' i                    long vbl, vbu;
& |! _  i; p# S0 p# i                    SafeArrayGetLBound(pvNames, 1, &vbl);
- r4 }, `' q$ i- j' U% R$ \                    SafeArrayGetUBound(pvNames, 1, &vbu);
7 B. }, i+ N1 \! U                    for(long idx=vbl; idx<=vbu; idx++)
$ y, P, h2 ?3 @$ }+ U                     {; w2 f  k( }3 n" }& @2 V$ f
                      long aidx = idx;* @! Y1 K: I) x2 m) G, ~2 N
                      wchar_t *wsName = 0;, l! G( j8 _: l/ |6 @6 `4 w( `/ ^
                      VARIANT vValue;8 {, G' C! e# h( Z  S+ H
                      VariantInit(&vValue);1 o9 A( W+ c/ t( v6 [# o
                      SafeArrayGetElement(pvNames, &aidx, &wsName);( L$ y5 _5 T( N) y6 \

# o/ ]# o( w$ \' q% E0 J" Q* h                       BSTR bs = SysAllocString(wsName);
8 p0 P. X+ W; T6 S" b                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
: n, ^% K) P$ o                       SysFreeString(bs);
+ a" |, Z% b! \) e* n- m1 {% q
$ C5 w' S; Y4 @- i9 M. T4 {/ J                       if(hRes == S_OK)
" A$ n0 f  h# y) d( ~                        {0 v) q( T1 p6 B  p
                         AnsiString s;
2 T% d/ W! Q+ H" W7 v" a* n                          Variant v = *(Variant*)&vValue;
% g9 K& U  f$ C- ]  z: L6 \' x                          if(v.IsArray())7 L$ \3 b: t2 I5 e2 C+ X
                          {# p  N2 {3 O8 ^; c8 H
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)( P+ M9 G( v6 n& l: s
                             {9 a) f* b) x4 I' L1 r% o6 M
                               Variant a = v.GetElement(i);% k2 v5 B3 i4 r  [; L
                               if(!s.IsEmpty())
  v5 O3 z3 i9 F6 D  p                                  s+=", ";5 {) J# ~6 p: T; m3 c
                               s+=VarToStr(a);6 K' B: N( Z+ B; w# f9 k, G  z  Y
                             }6 l& C% p  f% p' \; |* O* P2 J! |8 l) E! x
                          }& ~! |  H" X. h7 a" P
                         else% u/ V7 |; x% t/ l
                          {5 X  x' T; u3 f8 O, |0 o
                            s = VarToStr(v);+ F1 v8 w3 T7 S% a* o
                          }& F0 q+ K- D( B" J
                         lpList->Add(AnsiString(wsName)+"="+s);
% E; H( I( l: U1 X( ~                        }
1 M0 [" A% H0 ^) z# [  [2 Y, V
2 l; U9 }, P0 l/ u/ C$ N                       VariantClear(&vValue);- X( i$ B: ^* R4 r( d0 Z
                      SysFreeString(wsName);
; _+ |$ y3 W4 K                     }) h9 g- [- C0 g9 p7 c! z
                 }
. I. D# [& z  c4 A$ R                 if(pvNames)SafeArrayDestroy(pvNames);
5 @5 r# c! ]) d1 n8 h6 B                 iEnumIdx++;& ]& h! x' {% G, i
              }5 M3 M, }+ D4 l8 A
           }* e" c1 U- R: N: r" `
          if(pClassObject)pClassObject->Release();
4 c9 L( _( E9 X         }, o: j6 z/ }& H7 Q- |  N5 D
       if(pEnumClassObject)pEnumClassObject->Release();5 R+ v2 g* G7 [3 F* x4 W4 z
     }
4 L9 a+ L2 v, J8 ^     if(pWbemServices)pWbemServices->Release();; S! e8 ^6 m5 X( R" S4 s
  }8 @% D' I" d9 j# L7 U8 S. H7 B
  if(pWbemLocator)pWbemLocator->Release();
- H: S) v6 e: `}# `; A7 t# ]+ e" @' J
//---------------------------------------------------------------------------
+ L/ |3 E3 J; m; U9 f; T3 J. n  k9 V! r* E, M0 ]; V- C
// 通过 WIN32_bios 获取 BIOS 信息:
8 r" O* l9 j$ z1 n2 v7 o' Ovoid __fastcall TForm1::Button1Click(TObject *Sender)
1 w4 f- W" @/ n, k7 e{
. q0 R8 L/ G. |: k  R    Memo1->Lines->Add("================== [WIN32_bios] =================");' {- ]5 K: J. ?" \+ t9 p6 m# R
   GetWmiInfo(Memo1->Lines, "WIN32_bios");9 _  I: Y; g/ I8 k! _0 d0 f  i
   Memo1->Lines->Add("");' a4 u6 ]: |  d! i. k
}
' n& E& S* d& n, Z. X
. E" Z0 R0 Z$ V, l7 f6 j--------------------------------------------------------------------------------1 v* B2 ]; A, t- z3 ~8 M

! z' z& u. \% f- Z. BWMI 可以访问的信息类型有:% n  Y) A1 j6 `  Q/ }3 \
  Win32_1394Controller
5 q% f  {# g! f0 [1 _   Win32_BaseBoard
, x; o. x# t% h4 z$ y' j4 ^* v   Win32_Battery
" }: ?1 a* {9 R9 ]" i% x   Win32_BIOS* W- P# |; u. q  b; G
  Win32_Bus* _3 X% _* m. a3 o1 ?1 o4 H+ F
  Win32_CacheMemory: ?: C$ m/ J, u. Q
  Win32_CDROMDrive# a7 T; ^3 V% L  @4 \3 r
  Win32_CurrentProbe
4 p, c6 _/ B$ W+ G   Win32_DesktopMonitor  G( ^$ g: ~( B
  Win32_DeviceMemoryAddress2 }& F; X4 l! o+ J0 ~. @7 a
  Win32_DiskDrive
  k: S% }  L5 G. x4 {2 j. x   Win32_DisplayConfiguration
0 X: {+ }  X+ |   Win32_DisplayControllerConfiguration
* d) C, p9 D5 h$ q# w' {& K+ \) g   Win32_DMAChannel3 R# _% B* v# T1 p
  Win32_Fan& O0 K4 J; T1 R5 c9 E  P9 Q
  Win32_FloppyController
; h4 u1 M+ h5 j7 T' E" _   Win32_FloppyDrive' L7 H, e! k6 e, Z& ^+ g: d
  Win32_HeatPipe
5 K' D# h1 a' _* c   Win32_IDEController2 S: o1 f+ }# x
  Win32_InfraredDevice, B5 |- y; {# m2 q
  Win32_IRQResource
: s9 P4 I) ?  s   Win32_Keyboard! C" N3 ^' b+ {" t
  Win32_MemoryArray- R  x) x) K( ^0 F- P9 Y
  Win32_MemoryDevice
& v8 U4 {& {0 }: b3 K7 J2 x3 U   Win32_MotherboardDevice7 Q0 S1 E7 t2 r  v& O( _& }* m+ w
  Win32_NetworkAdapter
! _4 P: Z) f, u* T. @   Win32_NetworkAdapterConfiguration
% M2 q% {$ d& }; S0 Y3 E: u$ I7 t   Win32_OnBoardDevice
8 l) d, c( `& T$ @, w- F* @0 `   Win32_ParallelPort
1 F9 Y- _% q) I0 _8 i' {4 ~   Win32_PCMCIAController3 X) Q, k+ F; |3 e' B: u
  Win32_PhysicalMemory  V1 A: ~3 p5 o& z% |
  Win32_PhysicalMemoryArray0 ]( _1 `& e; W; a$ h! V. [% X
  Win32_PnPEntity5 f+ D2 y: R) C2 r  P8 l
  Win32_PointingDevice
# ]; l1 }. _9 e   Win32_PortableBattery3 Y/ @% U4 W! g$ Z- t- @' c- E% f* o5 Y
  Win32_PortConnector
: u, H/ {6 l* t9 w5 }9 v( z9 }6 D   Win32_PortResource
& I2 k0 t+ k! _. ?   Win32_POTSModem
# Z$ W$ D- A' g3 R& h  t   Win32_PowerManagementEvent
7 P& k# v9 R; N/ k+ s   Win32_Printer
. ~9 C8 x/ b: R' h+ S" y9 ^- C0 g6 F   Win32_PrinterConfiguration
/ G% V5 f+ z9 A5 P% Y1 x* s& }3 a( \, N   Win32_PrintJob
) x4 ^/ e1 N& y   Win32_Processor$ S9 Y& G0 I. H5 U# O$ Q  H7 Y
  Win32_Refrigeration
! k4 z5 r1 t& l& Z/ _. r6 U   Win32_SerialPort. z. v6 i- |% q0 ~. k
  Win32_SerialPortConfiguration0 d. b0 C' Z" ]% h9 U' n4 n
  Win32_SMBIOSMemory8 J! o5 {7 ]3 P/ Z8 }' r
  Win32_SoundDevice
. N" B! k& Q# S$ ^   Win32_SystemEnclosure; k' s7 l7 Y. N
  Win32_SystemMemoryResource7 @$ A) F6 E; \" F# Z8 J& p" M4 w
  Win32_SystemSlot7 q2 I7 q* m6 t, L
  Win32_TapeDrive
/ ^6 e! b  p3 D9 X. d  M4 Y/ k5 E   Win32_TemperatureProbe
' U; i8 ~2 q0 Q3 s+ w$ j   Win32_UninterruptiblePowerSupply: C7 @# {* C, _/ Z! i0 C
  Win32_USBController
" e- t+ v* V8 `$ [& Z, _   Win32_VideoConfiguration! s* ^! ~. A" H6 T8 _  a4 C
  Win32_VideoController
' _0 r! M8 p" V. W/ ]   Win32_VoltageProbe
1 Q( p# y! k; R1 u6 k, X. g' i" _0 D6 I1 i
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-30 19:30 , Processed in 0.019247 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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