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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)# o  N% C: W; a+ |
& K) Q/ F! _  I
  ]  P5 i* Y9 u1 w3 G2 x
--------------------------------------------------------------------------------
* C  y7 |7 C. L: \! v( }3 V( zWMI: Windows Management Instrumentation (Windows 管理工具)5 H# r! p) z0 }) j- W
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
; v( ^& i. m9 P$ Y   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
- }* V/ ?* A1 M/ J0 Z   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 " A1 ]/ c/ W$ o
) A# I6 L& Y9 m: E
--------------------------------------------------------------------------------4 O" V3 T  o) S. Z2 G! v& \
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面3 R, m% \% W' e% r. }% e* v5 [* B+ ?

% c* _& c' p( G7 s9 N; }--------------------------------------------------------------------------------. x: {  F* g) K+ H7 L
① 初始化 COM 接口:( {/ y+ D* W) d$ a9 X' A0 F
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
( ?9 U, t% D2 B) e& c   这两个函数在 #include <comdef.h> 里面定义。
5 S& n$ _! `2 k
5 d/ ^, Z8 B: c7 o② 获取访问 WMI 权限:* u8 D+ y5 R! ]% J3 d5 M
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
. ?8 }" T  R. K: t2 g/ _0 U   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
2 E: ^' [4 K( Q! z- o6 S" Z
$ J) H) |2 B! d" X2 a/ k  m8 J③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:5 j3 b  f" E! C  q/ D2 D$ }2 T# T
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。1 t: o+ S* i* d# x6 p

' ~- P' @1 i, _. Q' U6 Hvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
1 n2 P3 J" y8 r2 R- v{4 i0 w( J# g' g/ x# S2 `
  IWbemLocator *pWbemLocator = NULL;9 ]9 O4 k& r% v$ t- G* ?5 ^, w+ h
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)) O* ^  K* L4 m) U. Y
  {4 p+ T5 R( M0 A9 {) U
    IWbemServices *pWbemServices = NULL;( t  O$ r) e* r; D3 p" n8 o7 d8 W
    WideString wsNamespace = (L"root\\cimv2");
2 g8 m, ?' k5 o0 I0 ~     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK), P4 ?* D0 {1 u% O9 ^  n% `2 q5 ~
     {- O/ N! L! t, S1 C
       IEnumWbemClassObject *pEnumClassObject = NULL;$ f- T" \0 u5 ]: @
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
$ o! O& ]+ ~/ M2 i! i) @( N        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
( C% e5 P% k' f; ?/ x- @         {9 M: S4 K3 \; W
          IWbemClassObject *pClassObject = NULL;5 |4 G7 O3 k( Y0 c" U
          ULONG uCount = 1, uReturned;, f: F7 {; p5 W6 B, M% C# |
          if(pEnumClassObject->Reset() == S_OK)
0 P& G: r# L7 {3 m1 Y: {            {
' ~( F, s( f" F) g* A              int iEnumIdx = 0;  z7 R' ]( U9 l7 K& i$ W
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)/ z" ]' G  o, J" n# z% ?
              {( Y% @; g% P5 s+ u
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");/ D% }+ U+ T1 E
# ]+ x5 ^$ d( [1 ^& ^
                SAFEARRAY *pvNames = NULL;, ]6 U8 u5 @5 J9 _
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
" m/ U" d8 m' P$ H% l& Q5 b0 Z  o                  {
% _4 r2 u3 Z# J, `% m2 x1 v; n" v                    long vbl, vbu;4 j4 V/ }6 F+ h7 z, a/ v
                   SafeArrayGetLBound(pvNames, 1, &vbl);- k& n" `6 ~4 M- |8 d# X
                   SafeArrayGetUBound(pvNames, 1, &vbu);# H2 ^' R& @6 f) C  N
                   for(long idx=vbl; idx<=vbu; idx++). N/ \/ e1 V; ?+ N$ y
                    {' Y5 F2 `% @8 }
                      long aidx = idx;
3 ~0 d! m8 \2 Y7 u                       wchar_t *wsName = 0;" I' J& H- I3 k9 C% O* u
                      VARIANT vValue;
% U& b  w; i! o9 x4 r                       VariantInit(&vValue);
' l! V: c' p/ A                       SafeArrayGetElement(pvNames, &aidx, &wsName);
: S! D3 w- V. {- v! H& y. Z, _
) R% u' c- W9 [0 t, |                       BSTR bs = SysAllocString(wsName);
7 L) `4 }$ E% V" K                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
8 r' y" X7 X) G; ^2 J                       SysFreeString(bs);* A6 S  a" B& H1 S3 O5 q; d

- h1 q6 B" e1 M1 i0 U8 d3 [3 Y                       if(hRes == S_OK)
% O( [  r" \2 z- v                        {
. h  E% o) \& v2 g/ y# x; O6 q                          AnsiString s;
6 H$ o/ J6 d0 e& a5 C1 Z* R: }                          Variant v = *(Variant*)&vValue;
# B: d; i: C( T, {& y; L9 H                          if(v.IsArray()). W% Z' f6 q& W+ ~2 S+ x, P; C
                          {4 h) z3 }& I9 k. Y) h
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
; c) C" R$ h- c# l                              {
4 e8 Y4 X" [7 M) M: o( a' Q                                Variant a = v.GetElement(i);, R1 U" H7 J6 c) `1 P8 G4 _
                               if(!s.IsEmpty())
8 ?$ K& X" H! }& ?: y, t                                  s+=", ";) W; J$ \7 ?$ i% v5 _* H9 q5 i
                               s+=VarToStr(a);! B6 L& B1 ]% U! O1 P/ K
                             }  y" \# T) ]7 x, G6 N( \
                          }
0 W  A/ O0 ]9 e) \- n0 ~                          else, e- N. t  |6 `4 `1 [2 s5 h. D
                          {2 Y  C$ Y0 Y# {5 ]# L
                            s = VarToStr(v);
, b* N9 q; C, d8 r                           }
: C7 H  v2 T- W% H$ X! j$ F                          lpList->Add(AnsiString(wsName)+"="+s);
8 `; v6 S# Q  i) e7 x" |2 R/ I+ k6 H                        }
+ t: V: _: F& ?5 D- N9 C; m
" l+ y; V+ G# W" V                       VariantClear(&vValue);
$ F  A' A% ?6 N6 K6 b                       SysFreeString(wsName);) i) z; d$ D% ~4 A( g
                    }
) u/ O1 N2 |- C  k4 S* |                  }
/ H' I+ S$ g+ u8 O4 y                 if(pvNames)SafeArrayDestroy(pvNames);" q% @: T3 C$ v; A0 q% }
                iEnumIdx++;- f& b" W) F  D
              }
% t% t* q. W& _            }2 l  d6 [/ J) O3 p! F. s
          if(pClassObject)pClassObject->Release();
  ^/ q+ E; L- u( w         }
* u1 N! }; O4 \! c8 K        if(pEnumClassObject)pEnumClassObject->Release();2 K1 F* v$ E$ l. H! d
     }! U4 U% T4 S6 l) O! `" @) o6 |
    if(pWbemServices)pWbemServices->Release();
0 H7 _3 N# N" l: V6 \   }
! p1 `4 S: f0 J  [3 Z$ r* }/ A$ E  if(pWbemLocator)pWbemLocator->Release();
% H; j9 L& _" F. p7 v}, E. P6 l# F+ R" }0 U
//---------------------------------------------------------------------------5 S: C# F- @; g8 _5 Y, L- ^
% s5 Y- ^  m, ~8 T( C3 o
// 通过 WIN32_bios 获取 BIOS 信息:
+ F4 H# K- G/ [/ lvoid __fastcall TForm1::Button1Click(TObject *Sender)8 f; y8 _( v9 _! d0 @
{
" W% c) ^' k' B& ~# _, L9 [5 ]    Memo1->Lines->Add("================== [WIN32_bios] =================");
  a/ p. |4 v: G    GetWmiInfo(Memo1->Lines, "WIN32_bios");
9 G7 b5 _# a, q& s    Memo1->Lines->Add("");6 w4 a) ?; C/ [
}
, W7 A+ ^% o, d* o3 }& j5 B7 g3 U4 I, M( G- u3 H( y
--------------------------------------------------------------------------------
) F/ e$ H" @: l# y% ?
- u! K  b1 Z, P( iWMI 可以访问的信息类型有:* s' V& s1 F  S, w! V: l, [0 R
  Win32_1394Controller- R0 v* f9 N9 |+ O. Q
  Win32_BaseBoard0 F* e" |/ q& k) G0 l) p0 v1 G
  Win32_Battery; [0 R9 q* l8 S( {4 ^
  Win32_BIOS  Q4 p5 X0 N/ r6 W& e$ c
  Win32_Bus& C) p: F! a" N! c- F2 z; @4 z
  Win32_CacheMemory
# T4 F4 G8 V! O0 Y6 ]" `* n- o, T   Win32_CDROMDrive
+ {0 h9 s( ?9 O& d- j8 H3 \   Win32_CurrentProbe
$ ?% W* _% H+ H8 v) w   Win32_DesktopMonitor/ l5 h  j% ~7 Q3 }4 g$ S
  Win32_DeviceMemoryAddress
* u$ c. E: Y7 R4 s# w5 q* G   Win32_DiskDrive
/ @' w& @/ x0 ^8 T" j! o* i4 i   Win32_DisplayConfiguration! l$ ~* N& K0 |* B$ s& ]: G5 }
  Win32_DisplayControllerConfiguration
6 _  M6 C! [) j* e   Win32_DMAChannel$ X8 p1 Z9 R3 E
  Win32_Fan
* ]8 J) [9 G  T   Win32_FloppyController
1 s# C4 u3 ~/ I+ _. N, @   Win32_FloppyDrive* y( S. w" g/ `4 U
  Win32_HeatPipe
/ b! ?, j: v# Z8 h   Win32_IDEController
1 G- c7 H; M, z) v   Win32_InfraredDevice
/ r" X4 Y" I2 ?   Win32_IRQResource$ w  s3 n# N: I; \4 Y
  Win32_Keyboard5 i2 K+ }3 K: O8 X4 T1 N
  Win32_MemoryArray
$ j3 b- j# E1 J9 q   Win32_MemoryDevice
) `8 O* D+ k; \- d' x! l   Win32_MotherboardDevice
# N. C! R8 d. b% B/ A   Win32_NetworkAdapter
7 F6 m9 B2 E$ l* N( ]% B/ Q, w& W   Win32_NetworkAdapterConfiguration4 ?  H0 G2 Y: A
  Win32_OnBoardDevice
0 i4 m. X5 A, `2 m   Win32_ParallelPort
7 `- u. t$ ]1 H$ U5 |# j( D' B6 k4 Z; c   Win32_PCMCIAController
9 m8 j# i5 }  m% @* R3 P' ?   Win32_PhysicalMemory
2 ~2 J, R! X9 g' \/ l) j  a   Win32_PhysicalMemoryArray
! b- |+ N+ i" ~4 f7 D   Win32_PnPEntity
/ x) n$ R  M1 c% ?   Win32_PointingDevice  o; C8 d; V$ I$ ~, ~. _
  Win32_PortableBattery, h& ~. G9 R3 F+ `7 r! E0 \
  Win32_PortConnector3 S" e) z" s$ U! \/ t. l
  Win32_PortResource
4 x5 I5 }9 w4 Y9 g. g! j! g1 J   Win32_POTSModem
# g: L* P$ o2 [- n4 }   Win32_PowerManagementEvent
1 j' |+ T3 l  u" n   Win32_Printer0 x% R4 K8 q  z) T, R) K& n- Y
  Win32_PrinterConfiguration
7 Z" C! \5 n' Z7 Y" i! B   Win32_PrintJob0 g4 y; A6 q" R) q, V
  Win32_Processor# C6 G  [; G, @! G1 T+ u0 |
  Win32_Refrigeration: N2 u. W$ S4 ^. Z8 |
  Win32_SerialPort
0 r( F: B& z. i* g: c3 x7 I: V   Win32_SerialPortConfiguration
5 u/ C! W- X6 V7 x- d6 X   Win32_SMBIOSMemory& V" O  T) l  l
  Win32_SoundDevice. E6 s3 C$ x; i1 G( L
  Win32_SystemEnclosure4 o& n. o: ?6 e  b
  Win32_SystemMemoryResource, H# }) V4 u5 V7 [) d. R
  Win32_SystemSlot
  }+ i2 M1 Y3 t& |- O% s   Win32_TapeDrive- q# n9 s  d8 X' t" B0 _# m
  Win32_TemperatureProbe
4 c' Z, Y4 ^' O, f/ Q4 [   Win32_UninterruptiblePowerSupply9 T1 O  R3 E3 H- Z" ^6 A5 h
  Win32_USBController
" t7 m! m4 Y7 ?) `# O   Win32_VideoConfiguration
+ l8 d& c  ]( r& z1 I   Win32_VideoController+ U1 f3 V  ~8 ]1 w* M" T8 }* ]
  Win32_VoltageProbe
1 ~4 V( M: n8 K4 N. I% T
- B9 s! b7 `5 I6 I( X" o/ e以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-23 17:56 , Processed in 0.018134 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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