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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
" k% v6 z4 a1 W4 {" ]# u4 \) l% l" Z7 ^5 n
& E: e! y, o% W( }0 y! X! \
--------------------------------------------------------------------------------- n' B* T3 P" N
WMI: Windows Management Instrumentation (Windows 管理工具)( }0 q; l+ H3 k- T4 s/ z
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 * N1 o) V, |% u4 A
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。3 D+ A4 s: Y& Y' W! l) B2 ]
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 + H, l) L, Y% |# o, @

1 T  r7 p& V% b4 {--------------------------------------------------------------------------------
% l! @+ w' V  L, N! H' f/ dBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面& l$ x4 V; l* h0 Q* W

8 T6 F; D4 {/ s# P# W3 A3 a# M3 e--------------------------------------------------------------------------------4 C+ O# v) _2 s
① 初始化 COM 接口:
: z/ D/ Y# N! Q5 J; B   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
1 t$ d( R) U% x3 d  W! ?6 ]   这两个函数在 #include <comdef.h> 里面定义。" U2 b' Y- D8 ~4 v& [+ q9 k- Z
' ^. t9 i) n/ I0 d& N
② 获取访问 WMI 权限:
" m0 T9 _$ v3 a$ s1 |   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);/ d0 o) B$ k5 ?9 }" X" \8 @0 {/ u# {
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。9 W3 _# p# c1 n0 R7 W

- k$ x  ~5 F  q8 S4 h1 T* {③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:& t) I, x2 V3 }5 d* ?. m* y: [4 ^% ^
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
+ |& [0 G, W; }. }
. \& b& D# _8 C! Q; Vvoid GetWmiInfo(TStrings *lpList, WideString wsClass)1 i6 Q5 Q: C7 q
{- ?" Q" u( `/ n0 {
  IWbemLocator *pWbemLocator = NULL;
1 y& `/ \" }9 N# Y0 X' {  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
5 V4 S( K6 h' p: I   {
$ b' @( r. U7 n! E+ t4 ~     IWbemServices *pWbemServices = NULL;
( X  Z; h8 ]. X1 s     WideString wsNamespace = (L"root\\cimv2");* {# }. h% Q; l+ E# T
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)/ a+ ?9 A4 {, z$ K! u% N: N
     {0 B6 u; j5 i; L& g' I: O3 h
       IEnumWbemClassObject *pEnumClassObject = NULL;
' S( Q0 I7 T0 x# o- G4 d        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
0 A; ^+ X4 H2 |- J        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)  j. Y/ ]* ?5 a- S
        {
) t( v  k6 ^! R' B           IWbemClassObject *pClassObject = NULL;- s0 t+ s' {1 C1 M' I
          ULONG uCount = 1, uReturned;
$ \8 w" B( R* ^# _2 z! p# ?           if(pEnumClassObject->Reset() == S_OK)
% }; H# Y6 v6 K- |            {
4 Q1 \# ?; Z8 Z! t. H              int iEnumIdx = 0;( s) U9 J+ n2 N  ?
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)# X' j, n" Q7 p( }! R" z
              {' z6 p/ u& Z8 z1 `+ r
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
+ N, K& G( p# p
$ F3 c" _  `0 J8 s' p                 SAFEARRAY *pvNames = NULL;
( ~" f( Z  v! S+ K! d' w                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)" {: c8 l; z  t2 z3 A% H4 {
                 {
9 X+ P, T8 X, `0 x1 o$ A( e1 z                    long vbl, vbu;
7 R# h1 H5 E, X2 u; L& w9 T; a  I                    SafeArrayGetLBound(pvNames, 1, &vbl);4 |. S* G9 a- H6 C
                   SafeArrayGetUBound(pvNames, 1, &vbu);6 z9 C7 |3 R8 k, Q- h- d% e1 z
                   for(long idx=vbl; idx<=vbu; idx++)$ y8 t( K' @' N  W
                    {
( P2 i5 o3 H3 R5 ~+ h                       long aidx = idx;8 ^- S7 w" j  o" k8 n& {" S
                      wchar_t *wsName = 0;5 e& O5 ~& l% A( Y4 Y4 l
                      VARIANT vValue;
. F) d) Q" y1 M: {                       VariantInit(&vValue);
4 f) V7 k5 O& j3 W, F                       SafeArrayGetElement(pvNames, &aidx, &wsName);
+ `! Z5 W* e+ D: \9 {: I" l& q; q5 S$ H6 _
                      BSTR bs = SysAllocString(wsName);  |$ g- V" o8 d$ B5 C
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);7 }6 F. w  w2 }7 e) j
                      SysFreeString(bs);. a/ r: M. g2 g
+ z: m$ n, I% O$ M0 V: `: U
                      if(hRes == S_OK)$ N' M: K4 f" O
                       {
: Y$ v, a6 q- G$ a: u" x7 |& C2 _& l7 s                          AnsiString s;
" F5 L+ p, G& T9 `                          Variant v = *(Variant*)&vValue;& K% l; |8 V& Y7 G  s) J( M" |
                         if(v.IsArray())3 l+ i, z2 k- X* f- L
                          {+ V6 l( m& c6 \, e$ H1 C+ f  }
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)" p) ^# d4 ^# Y
                             {, K. ~: P& Z1 e: r
                               Variant a = v.GetElement(i);
8 a" L5 V" Z1 Z+ {; y/ d& y                                if(!s.IsEmpty()). b  W9 D& Z( c% u6 i+ w" b
                                 s+=", ";; v5 e# |2 @! J% E. v6 I9 r
                               s+=VarToStr(a);
8 Z0 N8 y3 Q% Z- r( ]                              }0 r; h5 i6 Q2 m
                          }
+ Y) n/ g7 I' m, A6 r! m$ J7 i+ N% Z                          else
' u: l' a. P% |: G                           {4 J! E: b& o. Q- k' h
                            s = VarToStr(v);0 k, h# d6 t" _
                          }
3 @# v, v6 m. n$ A                          lpList->Add(AnsiString(wsName)+"="+s);
& @/ @  K" A# P0 w2 ?, t* h1 U: {  |                        }* H. M% T! X3 p) V  S3 Y7 ~
$ r  G/ Y- D! y- h
                      VariantClear(&vValue);
3 k( O+ _0 J$ h/ a/ s0 _" w                       SysFreeString(wsName);
0 Y/ }, g/ {: j  ^* o$ ]                     }  T$ ]  \7 j8 c. W1 m
                 }
2 a+ }9 U# P9 p  d) Y& ^' u  |! {                 if(pvNames)SafeArrayDestroy(pvNames);8 X! c, X, ?( `" e
                iEnumIdx++;
% I1 B, _- o$ F7 c: k4 [# U               }
3 w1 v' @, d! _# s            }# [0 j7 V. |7 d! B
          if(pClassObject)pClassObject->Release();
7 N% m$ p! R$ g% v$ M# O         }
) r6 k. U# H' \  n        if(pEnumClassObject)pEnumClassObject->Release();
! x2 L" b, s# I! W      }# D, a4 u" Z1 [9 i- k0 z
    if(pWbemServices)pWbemServices->Release();
( P3 \& W1 y0 n( G+ N% {3 J* v; z2 P   }
1 F' B" j6 H- H/ Z" S( o1 j  if(pWbemLocator)pWbemLocator->Release();
5 f& \4 j# r1 k}" b2 ^! ]+ V' |0 A+ O6 W
//---------------------------------------------------------------------------
- b5 f! e# }8 M& L5 X# K( ^3 O: N9 p7 X# ~6 i
// 通过 WIN32_bios 获取 BIOS 信息:
! }9 V: l7 O- H7 o7 q# [void __fastcall TForm1::Button1Click(TObject *Sender)1 X) f7 _' K. G" p1 j3 n
{5 u. \2 ~% s7 {; Q% l
   Memo1->Lines->Add("================== [WIN32_bios] =================");0 ^9 S/ [3 b6 ]1 _" ]
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
* ]# B- V0 \1 I4 K3 [# o4 H7 a+ K    Memo1->Lines->Add("");
( w3 k! t8 {6 W, ~}) R, B, Y# d5 C7 T  V+ U- W; g

+ d9 f+ h( Z6 J# m8 u) _--------------------------------------------------------------------------------
$ H/ C" Y8 r5 F+ P0 q) p
) L5 o! c5 j: c: {WMI 可以访问的信息类型有:
5 G% s  p" N- \0 B   Win32_1394Controller# n5 m* v5 K; I+ |  t
  Win32_BaseBoard- a- O! i" u+ k' @
  Win32_Battery+ v! o& U& ~3 Z3 b! c
  Win32_BIOS
8 p1 @5 _; a1 ~& n   Win32_Bus
+ |4 c  e7 ]" a/ N4 w   Win32_CacheMemory$ d1 u8 Y& m6 P( b- ~1 s6 T
  Win32_CDROMDrive9 Z4 O) e& W- a( T
  Win32_CurrentProbe4 R! L  _$ c8 O2 J% p. x
  Win32_DesktopMonitor
' b/ A; Y. M$ g  X! y# e   Win32_DeviceMemoryAddress
. {1 R6 B" t9 H- X( v: d/ O   Win32_DiskDrive
! b/ }. ]& W* L( Z3 _   Win32_DisplayConfiguration
9 E3 ~& \% C9 M  f# }6 _' g9 _' d: j   Win32_DisplayControllerConfiguration( [' W4 I- a% e
  Win32_DMAChannel" d  E$ T1 L  x
  Win32_Fan
# O  m! }" D: N) {   Win32_FloppyController) s' i$ D8 V+ p1 ?
  Win32_FloppyDrive2 e3 [' A+ d+ l$ j4 X
  Win32_HeatPipe
# n) S4 W  N0 `6 |3 I+ k0 x3 O   Win32_IDEController. R! J7 i; I/ m, Z  ?0 {' h
  Win32_InfraredDevice) R4 I7 T" K! N8 c* \- z" ?4 c
  Win32_IRQResource
9 f6 U: c* j7 U7 X5 T: A, F   Win32_Keyboard
2 }0 r! ?0 |+ S: b6 h& ~5 D   Win32_MemoryArray
" D  h0 x3 ^% J: T: b   Win32_MemoryDevice4 [6 j* c% \% {+ _* b3 _$ b" c
  Win32_MotherboardDevice
! R9 W/ M  A) _* f9 n' f5 K# _   Win32_NetworkAdapter
8 C4 d( ?' t. e2 v5 T/ p& n   Win32_NetworkAdapterConfiguration: Q7 Q, R8 t9 H; g% j9 ~+ {
  Win32_OnBoardDevice9 H; v: U/ B. C; A8 J) a( r
  Win32_ParallelPort
2 o0 x" I4 y$ x1 ?5 L   Win32_PCMCIAController
( A) k: I$ u" g& g   Win32_PhysicalMemory
; v7 t, U/ R" z1 w   Win32_PhysicalMemoryArray
, J( ?  X3 \8 b: f! i   Win32_PnPEntity
6 I) b) g' u* U# r/ ~* `   Win32_PointingDevice
" H+ q, N* w! N   Win32_PortableBattery
' Z8 F; K6 \* J   Win32_PortConnector9 s1 o( m  u- G8 C0 ^% [& O, q# K
  Win32_PortResource
1 _" z' h& J9 R; R+ }. f6 h8 U   Win32_POTSModem% m! ?* }# g0 n8 T, k
  Win32_PowerManagementEvent2 M- U* Y! J/ M9 r- b9 x
  Win32_Printer; N- M& p$ ]: H3 ^
  Win32_PrinterConfiguration# g# Y; x8 o( B5 o( m: o+ D' J# b
  Win32_PrintJob
# k2 @4 a; B9 n   Win32_Processor
% K. E( Z1 `8 u) O! H   Win32_Refrigeration1 r# W( p; O4 i  F' y
  Win32_SerialPort8 q! l, l" g! }- t! O9 S! N& A
  Win32_SerialPortConfiguration
( ^! j  a- z3 I6 v; V2 m   Win32_SMBIOSMemory4 P( m# v4 N5 ~  H1 L. n7 R8 r
  Win32_SoundDevice/ p! _) g; u+ \/ f9 `9 h3 [
  Win32_SystemEnclosure0 _7 }# ^0 b) j: g7 f. T& u- R% |
  Win32_SystemMemoryResource
0 r5 T2 @0 P( y+ V   Win32_SystemSlot1 j  E3 I- {& R# n% b
  Win32_TapeDrive! M7 @2 k8 W8 E! f$ m
  Win32_TemperatureProbe
! V' X. ^% @  c, M' B   Win32_UninterruptiblePowerSupply; k9 }2 ^/ L% ^' A: s/ C! t
  Win32_USBController2 Z- _& h5 N$ m
  Win32_VideoConfiguration
2 D' y' K0 D- f5 o   Win32_VideoController& x7 {9 Q- v9 ~* v
  Win32_VoltageProbe7 [$ ]0 a6 {) D( \7 e
$ ?* v6 m: B0 z7 c: U( b' t6 @
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-6 02:38 , Processed in 0.018464 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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