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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者). @. z6 _; \6 I: P

* \% |, ~3 u6 f- s$ W/ e* t( n7 y
--------------------------------------------------------------------------------
& ]2 `  f3 r; j% A3 h* q6 i! qWMI: Windows Management Instrumentation (Windows 管理工具)
" M" _6 s# k6 g0 V- o3 j: O' t   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 / V: S( p8 H- Q# i+ A! N
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
8 e" V$ Y! F- ?: [1 \7 i8 }   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
# |# v1 _5 [. z2 ~  P8 x9 M: j: m; T0 T8 _% E- N
--------------------------------------------------------------------------------8 L# `- o: ^: ~* s# f% s
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面8 O' H  ~7 E, M) i: a* }

1 ^4 B" k; O2 R1 `. y--------------------------------------------------------------------------------
% |6 j* E5 Z/ C① 初始化 COM 接口:! E+ @. }: p3 ^; H2 {
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。1 ]3 a3 f7 W; l6 z) }
  这两个函数在 #include <comdef.h> 里面定义。, m7 u' P9 p6 g' e3 _- u2 Z
4 U% X+ D$ l# w7 W# ^
② 获取访问 WMI 权限:: C; N! `# [+ s( t1 N
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
( l8 B% D2 ]( I- n* I, x+ Y   如果这个函数返回 S_OK 获取权限成功, 否则为失败。$ R* f9 `" x# a2 W/ Q" `7 m

& w, P# x1 a& k# p③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
9 L$ l1 |, s* A; z$ E   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
  f/ o" {! }) d- d/ p& }( j
' {  |5 y6 R: f( v- D& J( J" X. lvoid GetWmiInfo(TStrings *lpList, WideString wsClass)1 S. x/ N% u$ u# U
{! ]6 G" v* Y6 q& I: H" x
  IWbemLocator *pWbemLocator = NULL;
; x! L( v+ Q# i* D  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
6 H* x- j2 o4 ]  I   {
) \9 s/ c4 M1 t; ~, k( Q3 t2 n% j8 N     IWbemServices *pWbemServices = NULL;
2 _: z4 S* j; p/ N     WideString wsNamespace = (L"root\\cimv2");3 ^& i( l) \$ ~6 f& c7 r
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
3 E, E9 H; I% D0 q4 ]5 b, \6 [      {& s/ |3 O0 I2 ]9 c/ ?+ ]
       IEnumWbemClassObject *pEnumClassObject = NULL;
1 @$ {2 K5 `4 J! Q& f( I        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;" k/ G9 w0 y+ i
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)2 Y; G" q; n, H% U( M
        {' V3 K8 {( H5 J
          IWbemClassObject *pClassObject = NULL;
: z( y$ M. ^& O           ULONG uCount = 1, uReturned;
& w# d! k, ~* ?* P( `4 s           if(pEnumClassObject->Reset() == S_OK)5 H% s1 p, b; O/ i' ^0 T
           {  ]7 U; p, ?5 ^% Y1 g
             int iEnumIdx = 0;
" {9 I0 r' F/ f" J. M# {2 B5 ?3 U              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)5 m. e/ u5 D. B" ~) O) G
              {
: e* L8 j& G* L$ r, h+ v                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");! {& L# u* W# f! P3 @/ f4 J" \
4 F1 R6 g8 d6 p: n
                SAFEARRAY *pvNames = NULL;
% M& C8 x3 F) J5 q9 e                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
, r1 W8 O& K0 _6 w                  {/ P' c* A$ l, {4 t5 c/ D$ f6 I" h
                   long vbl, vbu;- n5 M- `) E6 g9 c
                   SafeArrayGetLBound(pvNames, 1, &vbl);
4 Q  M* W- j4 ^* L/ n4 [0 N                    SafeArrayGetUBound(pvNames, 1, &vbu);8 l; y( U' ^% ?: W% k/ a- b
                   for(long idx=vbl; idx<=vbu; idx++)
' J2 F" J* j% P5 d& i1 F  ]8 k                     {3 X( E: k& L3 N" |
                      long aidx = idx;1 l. u3 l) F3 p
                      wchar_t *wsName = 0;
3 B; K3 U& e! q! p2 f% a, g                       VARIANT vValue;0 {, I# I7 w- v% v6 a8 o- _
                      VariantInit(&vValue);, H4 H& @7 C; t; P
                      SafeArrayGetElement(pvNames, &aidx, &wsName);) ~! Y. I3 y* ^
( U1 S  @4 _( W2 O0 }
                      BSTR bs = SysAllocString(wsName);9 Z6 l5 R. R  B3 s
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);1 Z: z: j! u" x. |# F
                      SysFreeString(bs);
  L* ]  Q3 J) T3 |
6 f/ {4 o* x3 o: I) k9 P                       if(hRes == S_OK): ~( x( [/ d7 q3 ?- Z1 t: {
                       {
1 A2 ]5 {5 ?! p) U, V# k" i5 `/ p& i" a                          AnsiString s;) E- M; l+ Y$ y! r
                         Variant v = *(Variant*)&vValue;, q8 Z& L4 `6 `4 }- d* z
                         if(v.IsArray())# p9 [  Q* W# b! T
                          {: k+ r% l5 m. M! j4 w0 ~
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
5 U* A6 ]# T' u  U                              {) d: V5 d* B8 |2 C
                               Variant a = v.GetElement(i);
. r9 l% a, |- x  g0 E                                if(!s.IsEmpty())
1 I/ f9 L' N' c- J" ~                                  s+=", ";
0 E/ c* z& o, `                                s+=VarToStr(a);
: X6 p! N& o# ~                              }/ N2 r' W* y7 Z
                          }2 ^  X4 s' ~; v) S) B5 D- |
                         else" a4 O* {1 m! R2 |
                          {1 u% j' l+ ]! i0 e
                            s = VarToStr(v);! @3 s# k; J7 Q' I- ?- n
                          }
8 l* x, o- M& Z                          lpList->Add(AnsiString(wsName)+"="+s);
2 O% G6 U. e0 V, B2 o# m                        }
: C$ w2 B: v( y8 u: o) o, {& {8 T1 T" a+ i1 ]3 c; ~
                      VariantClear(&vValue);
+ O" a3 b( ?( W' D& s                       SysFreeString(wsName);
4 a7 Y4 f$ S4 t* U! o7 U4 q- B  n( w                     }( ^* g  ]( B5 @0 i1 |/ I7 U
                 }
" \4 X; Y4 ^. P$ F                 if(pvNames)SafeArrayDestroy(pvNames);
. [0 d1 e6 S2 F! _8 ?                 iEnumIdx++;4 E) U# k6 q0 m! f7 Y' r/ o/ u9 F0 w$ Q
              }
4 w! }( k# h! U& i: Y            }
2 M- q. d+ F# l8 e; O, R! o           if(pClassObject)pClassObject->Release();% z4 v) e; o4 W, a  V' j% z5 m
        }
8 U5 [+ |# |; `, I' [% k* F        if(pEnumClassObject)pEnumClassObject->Release();
/ N# U/ M! g: C! i+ P5 [      }! ?- W- E* b4 a; l) o) P5 C9 F
    if(pWbemServices)pWbemServices->Release();
8 L" e: m2 M, t1 Y& G$ _   }- O# j7 A2 l* v: R1 a& X
  if(pWbemLocator)pWbemLocator->Release();
% ~0 ^! B5 z3 [- s}
; }9 F3 Q* \: z) [! c8 w//---------------------------------------------------------------------------+ A8 I2 `. b  ]
0 D! v: |* X& e+ n
// 通过 WIN32_bios 获取 BIOS 信息:. Y+ q% d/ |2 u; S4 o( }( |2 P
void __fastcall TForm1::Button1Click(TObject *Sender)2 M9 g- p% A7 M  h: N
{
+ x' @: N9 r8 Y2 e9 ~    Memo1->Lines->Add("================== [WIN32_bios] =================");$ S1 ~; g* [3 j
   GetWmiInfo(Memo1->Lines, "WIN32_bios");% M. j5 s& b0 Z% Q
   Memo1->Lines->Add("");
; r$ A' N) k' S}
" |* f0 p. ~6 M: X3 |" R% B6 T, X+ n" g( a( j
--------------------------------------------------------------------------------
( z, g4 V8 W4 L9 `
/ L9 ?6 g& j" K; b9 g, d9 CWMI 可以访问的信息类型有:# P/ a, i5 y$ R' }% A
  Win32_1394Controller
0 y& c) V( l+ x, T   Win32_BaseBoard4 k$ [+ }# Q1 W) `8 f5 f
  Win32_Battery, s( C' p1 x* F8 {3 m( ~
  Win32_BIOS& Q' a* R# p# @& X; @
  Win32_Bus
; u# U& ~( g: `- d* _: J) K) _   Win32_CacheMemory0 Z9 L, C, P& Z# e6 {: Q( x+ C8 c
  Win32_CDROMDrive
# `% ^1 S' l* N8 f0 |   Win32_CurrentProbe
5 M# F8 E0 }5 d! x9 Y! {, k8 u8 Z+ d# `   Win32_DesktopMonitor& O- [' J4 K1 L! {- ~) F7 L3 F
  Win32_DeviceMemoryAddress9 k' |0 N7 A5 \5 E% W3 V/ l
  Win32_DiskDrive* y0 ~. Z7 K. c; e( d, q
  Win32_DisplayConfiguration
6 @% r( M2 @' c   Win32_DisplayControllerConfiguration/ L& f. q! K" |' f9 v, x
  Win32_DMAChannel, w6 M) c$ D8 u5 E
  Win32_Fan) l3 A0 @: o) J/ u
  Win32_FloppyController3 M# R1 Y  [- a
  Win32_FloppyDrive
4 q; Y' ~! I  D8 ?% W5 y: N   Win32_HeatPipe
: f! e5 r2 B6 |. l   Win32_IDEController
1 R5 v# A: b( a0 A+ E   Win32_InfraredDevice
1 I' V+ }% v. W/ t: L: r7 D   Win32_IRQResource
; k+ M9 j3 {6 h   Win32_Keyboard) `- c2 v% i$ c* K& n
  Win32_MemoryArray
+ ]" a" C( f7 ?% r: B# e( n3 e0 G   Win32_MemoryDevice9 I( ]% a. h7 R5 K2 [
  Win32_MotherboardDevice4 L2 E3 K( n: {" f* ~8 D
  Win32_NetworkAdapter- |4 A" B! o1 y# ]# e9 m# {
  Win32_NetworkAdapterConfiguration% r1 `& x, J8 |: ~; R7 K( ?0 Q5 Y
  Win32_OnBoardDevice
) u" `! D! X# k9 t% i1 C* l' U   Win32_ParallelPort
2 p0 w% P( I+ u/ \. N8 ]   Win32_PCMCIAController
+ B2 V+ Q6 J+ \" o+ o. v( P1 V4 N0 d   Win32_PhysicalMemory) _& x+ I2 b9 @8 |" z+ n0 ?% P
  Win32_PhysicalMemoryArray
& Y- a! m2 r: p. Q8 }( S) b0 x   Win32_PnPEntity
, \) ]. ^- t$ T8 ?( _: T* Y   Win32_PointingDevice
9 A: @! v; t' I. ^   Win32_PortableBattery; f7 @2 ]& Q# Y/ N0 `; o' \
  Win32_PortConnector
6 Y  I. S! C7 b' F   Win32_PortResource( h  d: Z; w" B  w# K7 ~. r1 ~+ O" C
  Win32_POTSModem
& v" e. `% ]4 H3 ]3 Q5 v   Win32_PowerManagementEvent
" P# ~8 A: w3 }3 X) r   Win32_Printer
, q/ P# R2 \4 [$ O   Win32_PrinterConfiguration: V( e' ^% `1 [0 @- K9 w5 P8 e6 U* }
  Win32_PrintJob
. |+ `9 @7 F6 q9 w   Win32_Processor
0 ~0 _' ?# ?. b$ G$ c   Win32_Refrigeration) U8 W! G. t; z; I+ U, {% s
  Win32_SerialPort$ |. B! M! ~* X8 T  {, t, {
  Win32_SerialPortConfiguration. M. P6 z, t- N7 r' f, O
  Win32_SMBIOSMemory
9 @$ Q4 p. X2 p# y( L  O$ v. x% e   Win32_SoundDevice! i5 p# _4 n* _' X6 T4 [) R, U1 C
  Win32_SystemEnclosure2 Q! M7 l6 i8 C" ~/ P6 C
  Win32_SystemMemoryResource5 |/ v# \5 e) W; o1 u, ^8 {9 z
  Win32_SystemSlot3 u. T  I4 k, h' ^% T6 k" ?
  Win32_TapeDrive
# P+ C5 E4 `) j+ Q' T   Win32_TemperatureProbe% b0 R9 L" t% {+ }7 \3 n
  Win32_UninterruptiblePowerSupply2 `0 h. k# u" W( T) @2 G2 m1 X, Z0 V$ h
  Win32_USBController
& {" d- O& ^' m! E   Win32_VideoConfiguration2 J; C" E/ f" }" c* `1 W
  Win32_VideoController
4 \! p8 h( f" u   Win32_VoltageProbe- {( K/ W% ?' k& t$ ]
/ E" [) x( U* j) X; J8 D: K
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-21 17:30 , Processed in 0.020756 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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