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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)! `) S9 k! Z3 N7 |# r. z" L+ `7 m
* b" k+ U! ~3 e" ^

/ d6 x0 O0 i1 ^) o* o--------------------------------------------------------------------------------# F0 T5 d$ {8 v8 x  l8 V, W* N
WMI: Windows Management Instrumentation (Windows 管理工具): l; V: t8 ?# Z; v
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
( L" V$ \) O# F* C, G) ?" ?. L   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
4 L2 P2 f5 L7 H& ?   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
+ y* A( }0 @0 o7 S' h* G- H4 A3 a8 n# p+ m# |# ^
--------------------------------------------------------------------------------
6 H- G0 h( J4 Y: q5 |+ v. J0 G' @BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
& o; Y) k0 r; t+ t
8 D5 `1 R! i9 p' s9 B9 B6 ^--------------------------------------------------------------------------------
. g4 y1 Y: k  |$ I7 n① 初始化 COM 接口:5 g- r$ p) @* u! m8 N7 R! A8 Y6 c
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
) [0 ~3 S# D* N  p& N- }   这两个函数在 #include <comdef.h> 里面定义。6 p9 G& R% Z# X2 K
3 u) ~# K' s8 t* W- W
② 获取访问 WMI 权限:
) g# c0 B6 c8 [) H. }2 X6 N; `   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
$ B4 \! K1 E8 v8 ]) f5 O3 F. U   如果这个函数返回 S_OK 获取权限成功, 否则为失败。$ w3 W5 g' c) [
5 X4 h; j$ }* ~% G! y6 W: T
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
% i- M: s0 x8 G" ~0 D   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。# y  L6 ?0 J7 Z6 i# L
% z2 H5 r) U/ H7 ^( f: X! a+ m
void GetWmiInfo(TStrings *lpList, WideString wsClass)- @+ H( O' @* T; Z3 K
{
2 m/ `7 _$ n: ]; `6 H  IWbemLocator *pWbemLocator = NULL;
- e* s, E) q7 C9 u8 Y3 ]$ H% U9 }3 G  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
9 O# |) s% I$ Q6 m2 _8 L/ p' F   {8 O6 L) i( ~1 n4 V" _+ [/ z! c1 `
    IWbemServices *pWbemServices = NULL;
1 L- ^. d& l$ A# Q     WideString wsNamespace = (L"root\\cimv2");
  X2 w  |# Q) J/ A" A- N     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
# ^5 K% E8 s# A+ x      {) @1 I( d* J* @2 D
       IEnumWbemClassObject *pEnumClassObject = NULL;
4 {) N! U  z9 ~3 `) d( n4 u        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;' l! y& f: T% O  ]- C0 V
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
( b, P6 A2 y3 H, l  d7 o: G9 Z2 }         {) m$ r! A* U8 m2 m
          IWbemClassObject *pClassObject = NULL;
% J0 y. \, D4 `4 U0 F. M1 r           ULONG uCount = 1, uReturned;% s+ j/ h+ ^2 Y1 C1 ?- c7 w7 ~! o
          if(pEnumClassObject->Reset() == S_OK)
$ a7 W0 z: E# [- Q# L/ |            {2 A& P; j% P' m: \. y
             int iEnumIdx = 0;: q9 Q8 I4 D3 t; ~- ~7 k; ^
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
- U6 t: j3 L* E3 K: G6 G0 ?               {
) m7 b2 c+ y0 A                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");0 V/ X  Z; V/ t% a; T' ]4 D/ Y

% ]% N1 v! M2 U  ^/ q/ E) @                 SAFEARRAY *pvNames = NULL;. D. W* Z3 G# Z0 D- }
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
0 e+ h- z# V, c/ _" W                  {
1 N2 B" L4 T5 _                    long vbl, vbu;6 Q+ F3 e! A+ m  E: K: N" ]; z
                   SafeArrayGetLBound(pvNames, 1, &vbl);/ Q7 R# ]0 R2 ~9 A
                   SafeArrayGetUBound(pvNames, 1, &vbu);
+ y* E$ u" J( j8 [. n2 X6 r                    for(long idx=vbl; idx<=vbu; idx++)
1 O1 G6 G! S. m  @                     {
3 {- U! b: r5 @                       long aidx = idx;6 C0 l+ A( P0 A/ C" \  ?
                      wchar_t *wsName = 0;
1 s* d  p3 \3 d7 I: s& e                       VARIANT vValue;
& X# E1 b. c8 V: V  {                       VariantInit(&vValue);
- G7 Y  ^& _! @                       SafeArrayGetElement(pvNames, &aidx, &wsName);
) E/ j; }) P& g/ m! A
5 n5 ~+ z; p3 b# n                       BSTR bs = SysAllocString(wsName);
$ q$ p" ~1 H2 N; x; M                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);' O6 L% ^* t; V/ T, e
                      SysFreeString(bs);
0 S5 g$ F( T: F: \4 U* u2 D1 d) K8 N) v
                      if(hRes == S_OK)8 m6 M% [, s3 e( P) M( K
                       {
2 ~! J5 A6 x* n2 L/ p                          AnsiString s;% J# a6 c5 W1 j6 k1 B
                         Variant v = *(Variant*)&vValue;5 L+ B) F) b3 G. |. J6 C" L; @
                         if(v.IsArray())
$ l- b1 V2 j0 Y) o- x& ^9 C                           {
2 V! t1 j9 u/ ?! e) @+ @                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++); E; F4 N! _+ n% }% o1 F. P& u
                             {
% n2 C$ F: j, p5 `                                Variant a = v.GetElement(i);
$ t9 e# {' ]; d                                if(!s.IsEmpty())6 v4 d! m2 l0 ^; L; m+ c$ E6 _
                                 s+=", ";
* I5 F' u# j0 \' y* K, t3 _' G                                s+=VarToStr(a);
% O0 e6 z/ ~+ A, P2 C                              }
, a" \: j: h. @0 y# h                           }
' }! {' C% U4 D9 @! v- c                          else
5 J5 e/ c5 s5 _; D" K$ q8 ?! P                           {9 }( r. l$ Q2 i" F" j% I' h) l
                            s = VarToStr(v);
% d8 u5 e$ Y) A3 s                           }* P, w( Q( {9 _2 U
                         lpList->Add(AnsiString(wsName)+"="+s);/ S& Y& Z1 Y5 E; M
                       }# p( D: G8 a& B+ @' \5 ]. j

* R. `3 v' _" E: a: Y; P4 f3 j; E                       VariantClear(&vValue);% g& z3 O% V' ]: v( `# V
                      SysFreeString(wsName);+ U' M1 a$ v. i- `: z/ L6 H& e
                    }$ D+ b+ L' s* C
                 }
2 t1 P$ V  U9 {                 if(pvNames)SafeArrayDestroy(pvNames);# c, C9 O3 m3 K, t5 T' J, Z* ~
                iEnumIdx++;8 {+ k! p! U. O+ k
              }
% l4 `4 X3 P* v5 f3 j% ?- _& a            }
! Y: r: j7 K7 o$ t. N           if(pClassObject)pClassObject->Release();
8 a/ i) j  _% J2 q( E% s         }: U0 y2 b: ]/ l
       if(pEnumClassObject)pEnumClassObject->Release();
. Y* v/ Q& c: w3 P2 z) i      }0 j. G5 L6 Q7 A. H8 `9 O: n
    if(pWbemServices)pWbemServices->Release();
* v" u- c% r3 v8 _2 N* `   }3 S! o4 g3 ^3 R. z5 q3 Q$ P
  if(pWbemLocator)pWbemLocator->Release();
% O! X/ Y/ S* O9 f# k0 u}
4 j! i* r  C3 P5 a. a//---------------------------------------------------------------------------9 M" N" F( o" Y5 {: `+ i- h
2 g1 Y7 a% _% q+ L
// 通过 WIN32_bios 获取 BIOS 信息:
. J3 B4 L, h. W+ {/ K' Dvoid __fastcall TForm1::Button1Click(TObject *Sender)/ @1 v3 S# }  I. U7 s
{
' m0 a! u! @0 ^0 ~    Memo1->Lines->Add("================== [WIN32_bios] =================");
$ y5 M5 O* e: o6 L2 U' w    GetWmiInfo(Memo1->Lines, "WIN32_bios");
; M7 n9 \% G8 w    Memo1->Lines->Add("");% d5 r6 K/ c5 H& d
}
( V* y) c7 X8 [
$ m# V% u+ V$ }1 `7 l( I--------------------------------------------------------------------------------
- O( r7 B. W' D. E3 l  E4 e) i' H+ k- W, O; w# I, e& A3 A
WMI 可以访问的信息类型有:
9 n+ c/ r. \6 _, y+ h( H   Win32_1394Controller  [; S0 N9 t3 b
  Win32_BaseBoard( d! G# m" e# L/ H0 s: m# {8 Y
  Win32_Battery$ ?7 u1 H! q4 X2 r! k& a  i9 h
  Win32_BIOS: N: Q8 L5 p" l
  Win32_Bus4 G7 S2 h: S# l9 @$ r+ w
  Win32_CacheMemory# M% ?( }: G+ J2 o; @* @3 s
  Win32_CDROMDrive
' i9 a+ u0 j: G" F8 Z! F   Win32_CurrentProbe
) E- S! T( x% l5 X; Y   Win32_DesktopMonitor0 H% _5 Z& n3 E9 B' \
  Win32_DeviceMemoryAddress
, ^" X" h$ e# G2 a* x0 {   Win32_DiskDrive. s- g0 h' p0 r) d
  Win32_DisplayConfiguration# f' T* B' r8 {- s! |# R
  Win32_DisplayControllerConfiguration5 R# `  t" Y# F) R# z7 W8 a+ X
  Win32_DMAChannel! {9 H1 F, y, }: |
  Win32_Fan1 A0 t) w0 W( ?0 `2 h! J; ]5 E
  Win32_FloppyController
8 v; ?. M' g& Y' v3 S8 l# {1 ?   Win32_FloppyDrive
* u# S1 w; c2 J: n1 j% V& @: F/ q& X   Win32_HeatPipe! f% T" p4 z9 z+ X# V5 c" B. j
  Win32_IDEController! W( l) t" s; t- L1 k" V4 B. P
  Win32_InfraredDevice
, u# t+ M5 F% L4 ^7 T   Win32_IRQResource4 [0 ~' I# F0 {" r; T) J. s+ @
  Win32_Keyboard
- J! B. \- k% n, W4 {2 p" H$ T   Win32_MemoryArray" M, O3 ^+ h6 {  b) f
  Win32_MemoryDevice! g, A+ g; S3 O( I- G* F( M# r4 y
  Win32_MotherboardDevice8 z+ o$ S4 H: b6 N2 P5 \8 }1 }" o
  Win32_NetworkAdapter+ x% {# i% ]6 Z7 \
  Win32_NetworkAdapterConfiguration9 H% B* x, p+ e0 m* L$ N
  Win32_OnBoardDevice
/ J0 _. J; C7 _6 E( a  b   Win32_ParallelPort* G' t+ ~' D+ f& A; n6 Y
  Win32_PCMCIAController7 q: \8 @% ]: A! m6 H3 t+ W
  Win32_PhysicalMemory/ v+ u7 L9 d! W; }1 D9 o# R
  Win32_PhysicalMemoryArray
1 Z, P0 M3 C+ k; k5 u: N! w9 V( h   Win32_PnPEntity
9 l5 Q* [& o7 G1 E   Win32_PointingDevice6 v* a3 K2 ]- D2 C  j( O) z4 ~
  Win32_PortableBattery( V! a7 l: ]; r: p# C
  Win32_PortConnector) l3 R# d( H# X! U. J$ {5 u. }
  Win32_PortResource. ]8 r' |$ L) W7 x
  Win32_POTSModem
1 {% ~. L: L$ [3 {2 t# _" A1 g1 N   Win32_PowerManagementEvent. _7 ^# m& F8 I1 n
  Win32_Printer
; x, D' Y0 J8 G6 Y   Win32_PrinterConfiguration
6 q( u4 j, r+ h4 T* N7 j( E   Win32_PrintJob
( O. R' Z. [- G9 g) x  J  @   Win32_Processor) L% ^1 }; Y* \. ~: x
  Win32_Refrigeration! v$ |( v2 W& K* Q
  Win32_SerialPort
4 I1 E4 E% }4 K   Win32_SerialPortConfiguration7 }/ I% E1 k6 A2 D- \
  Win32_SMBIOSMemory, w0 @) c1 s; \8 ^( }. W
  Win32_SoundDevice
) b/ q$ ?! o7 E   Win32_SystemEnclosure  ?/ g) V9 g6 T6 n! m8 k
  Win32_SystemMemoryResource
2 G* Q3 C+ \  A* W  q% H   Win32_SystemSlot
' E3 O4 o  a' e- A' j   Win32_TapeDrive
' P4 h9 J; U5 ?   Win32_TemperatureProbe
& o/ t! U4 T6 o   Win32_UninterruptiblePowerSupply
0 D* C6 c8 h$ x; w: S& z   Win32_USBController+ a' V) V! h: n& ~
  Win32_VideoConfiguration
, J) l; U/ ~, d( p- g   Win32_VideoController
6 t* O4 V. I0 r7 ?( O1 ]   Win32_VoltageProbe
5 J. C+ f( D6 E8 F; D5 m1 X* l5 c2 o, ^
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-1 17:33 , Processed in 0.018181 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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