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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)3 @) z# R  e; L/ I4 T7 ?) c

* @3 T& l) V0 n8 S) F. l
1 [, ]1 _  K3 b9 @/ P--------------------------------------------------------------------------------
) h2 K0 S0 v3 f$ M: d0 F: ]WMI: Windows Management Instrumentation (Windows 管理工具)4 b9 W: p! q# H5 s/ p- J
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 " c0 F' O, v: i& e3 q2 ]
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。: h0 j4 o- r2 R! T& b& y
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
+ r# [5 R2 P! n, E& H& r! `" L/ q1 n9 f% F4 l
--------------------------------------------------------------------------------
" @3 Z1 U0 o- k6 Z/ FBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
, O$ E/ s% k9 N$ P3 h8 [0 I* ^6 n5 e) V2 j  B
--------------------------------------------------------------------------------
% b, E9 K: B) x* R, t① 初始化 COM 接口:6 b* h2 a& v5 c5 e% l7 O( }
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。" W+ [' l, f, H+ E+ b: g
  这两个函数在 #include <comdef.h> 里面定义。
* N9 L7 f9 J  w" Y. O* B1 k* i* i- z
② 获取访问 WMI 权限:
, l% ^+ A. b9 U6 M, N   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);: ?$ @: B3 s& {2 ~% E# R1 K5 B) A
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
# u) k! w; f3 k+ z
. j6 n4 W7 V' Y4 L- [' F5 u③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
5 ]3 ^" [+ P5 K7 J+ m# C: P8 }   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。$ O: K  m! h" k& m+ e
! n8 {/ M) v& ]0 X* m+ o0 d
void GetWmiInfo(TStrings *lpList, WideString wsClass)# ?# ^) q; }( B! O  H' i( q
{
/ g( v- t/ j0 T- a  IWbemLocator *pWbemLocator = NULL;, H2 W- e) p/ H% U
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)4 Y4 g. E' M: N& O  M
  {/ S4 x$ b1 w0 z; i. l5 h
    IWbemServices *pWbemServices = NULL;) Q' v4 B3 w- h% b; W% V! @* O
    WideString wsNamespace = (L"root\\cimv2");
$ ?% L, X5 Z5 M6 F7 F     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
: H; W% J1 w3 h      {( w& C0 Q9 G# s) g2 M& `$ R
       IEnumWbemClassObject *pEnumClassObject = NULL;% L0 Y6 ]( I2 f& j0 T0 ~& G9 a
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
7 G4 y: F2 S5 N7 [, C, y6 k        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)/ E# N! ]; V6 s- o7 R0 [0 p
        {- Z  V! W' W, _; `/ |% W' Y8 {
          IWbemClassObject *pClassObject = NULL;
. A  _; q3 i) w# A7 H2 t           ULONG uCount = 1, uReturned;; e6 y4 V( N6 M: H/ }( G3 K/ }' f7 L
          if(pEnumClassObject->Reset() == S_OK)
+ w& R$ A, V7 L7 Y! L% Y# W1 r6 J            {
- H. E) [  f2 K! c( Y. `& c              int iEnumIdx = 0;2 M. D: t+ O2 L" f6 b7 N
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)) T$ T% x# C  [( x# n4 j
              {
4 B9 [0 U: l6 {* L1 ?                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
2 |/ H9 \  ?/ F1 w+ o; p, E6 u2 `- _. }" E; n/ X/ W  L1 C
                SAFEARRAY *pvNames = NULL;
, W, h! Q  J3 E% O' r                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
' [( t( z5 B1 t8 X- L% W% ?                  {
. n# |* j' |/ l3 X2 ~                    long vbl, vbu;3 x- s# C& I8 r! l2 C8 s; R  Y
                   SafeArrayGetLBound(pvNames, 1, &vbl);
+ C5 ]7 {* X2 d5 E: K9 l1 s$ l                    SafeArrayGetUBound(pvNames, 1, &vbu);
) }0 i0 g0 s0 x6 a: ]                    for(long idx=vbl; idx<=vbu; idx++)
, p$ k; ^, k5 w- L3 K& b! w2 t                     {
7 z# R0 f! e3 N; f* \! L                       long aidx = idx;- E0 V" B# K. a$ F3 |
                      wchar_t *wsName = 0;
) _. `/ k* L* h8 f. t/ t                       VARIANT vValue;, \8 \" T+ F8 G
                      VariantInit(&vValue);( Z# W0 j- S% S- B
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
$ d- x8 E2 S& ]0 g
1 o# q) R. X4 z9 e5 O1 M                       BSTR bs = SysAllocString(wsName);
2 O( e7 d4 W! t5 Z* s- q                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);/ T! h* e; H4 G3 b: X3 ]- f  z
                      SysFreeString(bs);
0 w% z2 P2 ]  V* V
% U( I( |7 a$ \; |( ^6 I                       if(hRes == S_OK)% g0 }: G9 ~) s2 r' f
                       {
; N" U2 @- I; u6 ^3 a. I7 B                          AnsiString s;
8 _; c( t) P- e- a! ^  l                          Variant v = *(Variant*)&vValue;- o: a/ e. v) w- o1 T+ `
                         if(v.IsArray())) l. s6 N& o( D! G5 M; O
                          {! z/ \) L0 |/ Y7 P
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
" N) [& p7 _+ n: k0 Q: {                              {
" |0 f7 X$ D/ X( ?& G                                Variant a = v.GetElement(i);" m2 @' S: S  W: p  P7 N
                               if(!s.IsEmpty())
8 k& M" h; ]3 [' |8 b8 ]. {                                  s+=", ";
$ N' i: c! u8 c0 _' ?9 Z                                s+=VarToStr(a);
3 L& |* i0 e7 _( b% G                              }
, q. b1 M3 y4 a* q+ ^2 G* [$ G                           }  B$ B; ^5 M: I
                         else
3 T- H8 S: I+ ^8 N! W1 B, c, _                           {
5 m# N; k# T+ h7 @8 p: X                             s = VarToStr(v);; `. E) K3 i( X1 I
                          }
& i5 S5 V% o: [* ~                          lpList->Add(AnsiString(wsName)+"="+s);( W) b# m; K4 F" a3 O( ^
                       }
3 O  G  ~% U: E: E" U. ?' k8 C
  h+ i" \2 _4 U# c. K8 N( s$ C. O9 Q                       VariantClear(&vValue);
6 o: a* K# _8 s- }' f                       SysFreeString(wsName);
6 {1 B  G. h- x: t  h  Z4 Q                     }7 ^1 m/ i5 K* ^9 x$ F
                 }5 ^8 v  k  e$ F9 @
                if(pvNames)SafeArrayDestroy(pvNames);2 X& t" |9 V* d
                iEnumIdx++;
5 g8 _5 @/ H( ^5 I- C/ R  V9 ?               }! M$ A3 c9 V0 P
           }8 _& j. N' H9 {8 L  V
          if(pClassObject)pClassObject->Release();
$ w% q/ y. K2 e5 K8 O         }
' X/ ?' b( e& `) T2 {        if(pEnumClassObject)pEnumClassObject->Release();+ g! V1 Y( t7 z2 n, D4 h5 q
     }, X% d+ _% p% j+ [% J
    if(pWbemServices)pWbemServices->Release();/ G; }8 h+ }4 L6 X
  }+ W  L- t3 r( ~- s& h( r. u
  if(pWbemLocator)pWbemLocator->Release();4 K% U8 P, c( w4 n5 s
}
2 M$ X* h; t2 D. h* q& U//---------------------------------------------------------------------------; T$ {( a2 \9 p- r4 B

9 x: S9 E  N/ p/ y& _// 通过 WIN32_bios 获取 BIOS 信息:
) V# C9 j0 H/ m3 }3 F7 ?void __fastcall TForm1::Button1Click(TObject *Sender)
9 Q/ |. k6 E! V{$ {- u" m$ L2 o& X" R$ t
   Memo1->Lines->Add("================== [WIN32_bios] =================");
* B' V; x& [& v/ g) o    GetWmiInfo(Memo1->Lines, "WIN32_bios");. u, r; p) h  u( {
   Memo1->Lines->Add("");" `% R7 `# f' P
}
, p/ n5 E3 x$ ?8 @' z) v) s- L. D4 ~: l# N5 M. m
--------------------------------------------------------------------------------/ u7 U2 M2 z5 d6 i- C0 r3 H

! h% Y2 H  c# q# eWMI 可以访问的信息类型有:* q& o* i8 d* @( X3 B: n% d
  Win32_1394Controller1 q1 v- s6 u4 Q: U9 c
  Win32_BaseBoard! Q% ]+ F$ a7 e$ L0 m4 l
  Win32_Battery
0 D6 `$ Z( n5 t0 u0 _8 r, j   Win32_BIOS( }+ \( q7 B' l$ Z
  Win32_Bus
3 I- D( t2 L9 q/ ^* r   Win32_CacheMemory( F: x7 E5 I$ H. t: p/ b3 N
  Win32_CDROMDrive. L- \- q, z0 O2 m; u) V
  Win32_CurrentProbe
5 K2 m4 Z1 B8 D; Y+ I! y8 y   Win32_DesktopMonitor! S% W" ?: y, F3 j, F
  Win32_DeviceMemoryAddress/ T; A" W  i- y, N3 G: a8 m+ V9 Q
  Win32_DiskDrive
; m! q# O  @" f1 T) `   Win32_DisplayConfiguration4 N6 j# Q0 Y' l5 x4 l7 y6 d: h
  Win32_DisplayControllerConfiguration
, P# X/ Y; m* p1 q' o  g# l# y* K   Win32_DMAChannel
6 @/ q" Y3 }6 b  x) ^- L   Win32_Fan, l: z& m* Z" W* f) h0 P" Q' N! E
  Win32_FloppyController
5 T# r* }% ~' h! S/ I+ B  `   Win32_FloppyDrive1 g8 i3 ?0 K6 Z5 ~) x* Q$ n
  Win32_HeatPipe% d8 E' d6 g4 V( J
  Win32_IDEController" j: C" W/ a2 G( F9 ~8 A" R
  Win32_InfraredDevice) g* R, j8 D, T" m; ~, B5 k
  Win32_IRQResource
3 u  q) t; k- k2 O   Win32_Keyboard+ U+ \1 O! _; A: k! F. J
  Win32_MemoryArray9 c1 B# i3 S# h' ^
  Win32_MemoryDevice2 z, H) z% A; V5 U& ]
  Win32_MotherboardDevice
9 A/ X% Q% _, W8 N- o   Win32_NetworkAdapter5 b- k3 K" `5 }7 Z
  Win32_NetworkAdapterConfiguration! d+ Z9 w4 d" B6 W) w" f! a
  Win32_OnBoardDevice
; {5 P8 a$ u' M4 C" J% z, ^   Win32_ParallelPort& O2 k/ L7 g  ]# O( Z- I: x
  Win32_PCMCIAController
( B% u5 \5 ]: B2 h  v. M/ Z   Win32_PhysicalMemory
8 T1 v1 _/ D+ I* Z' \% t* N   Win32_PhysicalMemoryArray+ n3 P6 {$ {6 u) s
  Win32_PnPEntity
) i( L, k8 a1 r, f   Win32_PointingDevice
. i. ~6 D+ y' @% Z& c' s$ U! F- s   Win32_PortableBattery& r" F( z4 G# H6 p
  Win32_PortConnector' q5 Q( q* R7 [& K7 n! `7 L
  Win32_PortResource
; i' Y  Q/ E: h& \  D   Win32_POTSModem  f: o- w+ L* l- A
  Win32_PowerManagementEvent2 o2 X7 b1 x& D/ }
  Win32_Printer0 K' R! v, A+ v, u  K8 ^
  Win32_PrinterConfiguration
; G* l& g# f% e* V2 Q8 Z( R   Win32_PrintJob
4 o1 {- J# C& I1 S7 ?1 |  y   Win32_Processor# [7 S* n5 a; U* ^; y' ]
  Win32_Refrigeration
! X4 L4 j: ?* n) r   Win32_SerialPort. O! v; \3 Y& \7 J8 C1 N
  Win32_SerialPortConfiguration
- u8 n9 e! r% ]   Win32_SMBIOSMemory
9 \* }* C3 H, H/ Z   Win32_SoundDevice$ u0 `+ m9 U, c: R3 o# P, U3 l6 _
  Win32_SystemEnclosure& T6 m& T/ r% B
  Win32_SystemMemoryResource! _' C2 B+ F* h+ W
  Win32_SystemSlot2 }" m+ L- q/ }+ @
  Win32_TapeDrive
. T- ?/ W# G- ?" |% n   Win32_TemperatureProbe$ Q9 s9 l0 _4 m- {9 I6 h
  Win32_UninterruptiblePowerSupply# [% z0 D0 y7 A# K8 G7 ?
  Win32_USBController  ~7 m4 P# P; ?0 g. c8 b
  Win32_VideoConfiguration
4 ]8 P/ p# T& E4 V9 M   Win32_VideoController; q$ c3 [( F( g
  Win32_VoltageProbe; U  o: K* O$ n3 b2 y/ X1 P) w* r
# w) ^6 A+ x/ U* q# ]1 V/ z7 e+ m3 x
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-15 08:39 , Processed in 0.017780 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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