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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)# d$ F/ l' B* Q' s- N2 i7 a; J+ s
3 n) r% w2 f* n3 Q

' t+ i8 c9 m2 {--------------------------------------------------------------------------------
3 h3 v& r& C4 I2 ~* i( b8 {WMI: Windows Management Instrumentation (Windows 管理工具)
& Y! b7 q- ]; ]! d9 i   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 8 P6 y' O7 ]3 B* K
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
1 z  \! O. |& S8 I' @  Q   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
+ y  d( t# Q9 u6 d, g) B$ q7 P! l; S2 Q* r2 `9 |8 r
--------------------------------------------------------------------------------& ?4 I. s  C. E/ K/ H6 C
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面4 C" L5 N$ H/ |( U4 b
2 d4 t9 v9 ]- T, s+ T
--------------------------------------------------------------------------------& S3 _" `" N5 @; f. l5 f  s6 `" v) y
① 初始化 COM 接口:
4 Y( o; Y0 E' L& m5 o: S6 Q- \   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。- m# ^% n' ?! P0 a$ N8 L0 P  _
  这两个函数在 #include <comdef.h> 里面定义。
4 z* o6 s: _& \0 @. c1 h. W8 j0 H2 i4 w& Z" [# P
② 获取访问 WMI 权限:/ C3 ]. B  q# y  @* \& G" S
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);1 b/ U5 z8 m' R/ I; Y; k; O
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
8 L3 v- @. A5 w+ H  n+ z/ ^, T- w3 Z5 \! R. l" M( I2 C
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:# j, P0 B& h" R
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
* K* J% S$ y5 B  H2 }$ \6 l: z; f4 S# E6 ~/ I5 _, R) W8 @8 j
void GetWmiInfo(TStrings *lpList, WideString wsClass)) g* A3 Y5 K  B  ]4 F2 e5 m
{/ W/ H# W/ b6 B6 T$ U' u" ^
  IWbemLocator *pWbemLocator = NULL;
+ }3 X! e7 C2 _  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 l8 H6 M. |0 S  h: }: A* h   {
" @' i0 |% C+ C' _     IWbemServices *pWbemServices = NULL;' q, O; z1 r* ^7 q: B
    WideString wsNamespace = (L"root\\cimv2");
+ a7 e6 T) G$ a0 v/ t9 K7 z     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
5 t, \4 [8 x" X5 c! c# l/ V) y( l      {; X8 ~& |4 d$ M! |& N# H
       IEnumWbemClassObject *pEnumClassObject = NULL;3 j4 b2 [1 \0 _+ O$ w) e
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
% c% k" \# j: ?3 V1 E' [* u        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
7 m7 ^/ d5 t1 }5 M! {& Z4 F" R         {0 z. K( @, ~) ?* c
          IWbemClassObject *pClassObject = NULL;
' d- M+ t1 @1 C* u& \6 J           ULONG uCount = 1, uReturned;9 ?5 Q5 S) w+ ]! _& J
          if(pEnumClassObject->Reset() == S_OK)
6 a+ ^1 I, k0 t. S            {5 a9 W" [- n# W
             int iEnumIdx = 0;
3 y9 J$ f# v7 e2 Q              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
( ?9 ]2 d* I8 A# H               {
2 Q- j9 ?# m0 ~* W9 b                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");* H0 O8 w" J1 G4 e

9 h. y" {. n, R; H. O4 _6 G' i/ ~                 SAFEARRAY *pvNames = NULL;3 d4 ^! j7 D1 {6 k
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)2 q. G0 ?; n  O$ T( a
                 {
1 m" h  F' h7 P; g# Y! s                    long vbl, vbu;
: K+ ~" p" u1 L4 ?# M1 l                    SafeArrayGetLBound(pvNames, 1, &vbl);
: d+ u7 j* c7 J3 V$ j7 N                    SafeArrayGetUBound(pvNames, 1, &vbu);: P: u4 A& W9 L2 J. h: x; C; }: p
                   for(long idx=vbl; idx<=vbu; idx++)
  ?2 u$ a2 T' j/ F3 d                     {
. ?8 i: r% \3 J9 K' t                       long aidx = idx;( U, x% b) t8 S5 w( M
                      wchar_t *wsName = 0;
2 t7 c. p4 e" v8 Y2 c& \9 U                       VARIANT vValue;) [! a$ _4 S+ Q9 T$ [: t% x' x5 U
                      VariantInit(&vValue);: S/ N* h* J4 p& m" m2 ~1 \$ o
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
/ l" {  `, A$ c' i6 W- n& U7 t: ^& x
                      BSTR bs = SysAllocString(wsName);
* a! g* k% w! K  H( u, V                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);7 ]* T: d: B+ ~  l0 d
                      SysFreeString(bs);
* e- |! ~3 h0 {; K: O' T
/ |# k6 q% i% A! y                       if(hRes == S_OK)
* `' d1 j. z8 J, U/ [" s* [3 {! u! c                        {
* M: z3 t# D2 N0 w5 [+ A                          AnsiString s;
/ ~) `& ]5 p% e$ R+ ?; p                          Variant v = *(Variant*)&vValue;
3 t3 ^2 r( D3 D* ^$ n$ l% E9 p' \9 k& H                          if(v.IsArray())+ S( K5 w3 S! |. H& K5 @
                          {( v- D( b0 @* V
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
) c0 X! j- O2 g1 _# F                              {$ w! B& S) \1 i% F2 v
                               Variant a = v.GetElement(i);
% k: N. p1 v; K                                if(!s.IsEmpty())
9 @. T- X) C% ]. G                                  s+=", ";
+ v& g/ G" `# p- W7 y* E7 ?! ?                                s+=VarToStr(a);
0 C6 s8 r: ^7 J3 H6 t( `                              }
: j& x- L3 [3 m4 T6 R                           }
0 Y6 o% ?( J0 a/ e                          else
  x- m1 O# r& B, P" i( J1 Q                           {& x( n$ m  d5 E2 @2 d& h
                            s = VarToStr(v);1 q/ C! p+ G$ N# A6 G% q$ E
                          }
- _/ W3 c; J8 n$ a+ v                          lpList->Add(AnsiString(wsName)+"="+s);. \: r3 F4 R7 U# |# p8 g% E: v
                       }
7 `9 A- Y; E1 z- v' R
& X( b* ]) I/ r" G                       VariantClear(&vValue);
/ m& q/ V) ]2 r% y; G7 I0 T                       SysFreeString(wsName);
! p9 }! F2 x, S( n* U                     }: x) n. O8 m2 B/ [: d$ b7 q
                 }
8 e3 }0 b/ j7 q3 x/ T3 I) C                 if(pvNames)SafeArrayDestroy(pvNames);
; N5 Z: d$ ~" p" [/ K! t                 iEnumIdx++;
! g0 y6 l* N2 Y# s4 T4 m! i& P               }% w' ?8 y3 ^, y
           }
. m' a  W* W. L6 E. T           if(pClassObject)pClassObject->Release();; r4 m" s, X; p8 f2 i/ U  S
        }
* ^1 t! D" _* Q" u        if(pEnumClassObject)pEnumClassObject->Release();9 P/ q2 f3 K. G8 x3 y
     }
4 G- }( w  Y+ E     if(pWbemServices)pWbemServices->Release();) Y- M0 F: S) K0 t6 o5 Q
  }, i7 j3 W) C1 a- A8 k
  if(pWbemLocator)pWbemLocator->Release();# L' x. |/ G6 B* d3 a4 G& S
}
. t! Y, \( x) t//---------------------------------------------------------------------------
  i6 L( N* u/ r5 @4 k) ~% M
( @( Y' \# \7 ~' T// 通过 WIN32_bios 获取 BIOS 信息:
* ^; I3 [$ d0 N7 J' {% kvoid __fastcall TForm1::Button1Click(TObject *Sender)  ]' x! v& F7 j2 U7 w6 z! g7 @2 _
{
9 X5 m# u3 r) N( e    Memo1->Lines->Add("================== [WIN32_bios] =================");/ E! R1 A5 O" ]
   GetWmiInfo(Memo1->Lines, "WIN32_bios");' S/ F  }8 ~4 n! I
   Memo1->Lines->Add("");
% b. {3 J+ _2 N+ z- m7 T1 k3 F2 b, B}$ P# ?* d5 D; P' {8 k  ~6 U' o( Q
! {* o6 N8 Q/ x: c, u1 p
--------------------------------------------------------------------------------
: p# D( M1 r" M6 Y7 k1 s6 j$ s& p6 }) g% b$ ?4 R! y" t" @3 I5 d
WMI 可以访问的信息类型有:0 p7 V$ y5 P8 ], n9 u
  Win32_1394Controller2 ]  _1 M. ?4 _* z+ E4 O
  Win32_BaseBoard% q* V$ V7 V( X8 K1 P
  Win32_Battery6 P- _  O, l# L) e" D( v4 o+ y
  Win32_BIOS
* f, h6 B: H9 D( |. V7 F+ @   Win32_Bus
' v4 f2 a; Z, n4 F" h. n- J" N   Win32_CacheMemory: W+ t/ j- c4 v
  Win32_CDROMDrive& [7 Y" p, u2 A2 `5 ^/ a3 t
  Win32_CurrentProbe
9 Z# B7 [2 V# q5 \9 }   Win32_DesktopMonitor9 f2 m2 o; P$ ]9 M. c$ w
  Win32_DeviceMemoryAddress/ y' a' [# i3 I( S* P0 D6 J, ]+ I
  Win32_DiskDrive
7 z: N  `7 R8 n4 Y' c& e   Win32_DisplayConfiguration
* E  L( X( i% Y8 \/ t" @   Win32_DisplayControllerConfiguration
$ d" k2 C3 w2 v- f   Win32_DMAChannel( K0 d( H) v# C3 y" c$ m
  Win32_Fan
/ e2 x% ]3 N1 c' m4 ~3 h   Win32_FloppyController
, D8 W# L$ U5 F: A' X* Y6 d) T   Win32_FloppyDrive' a  V8 W0 V1 W& a* z
  Win32_HeatPipe: m3 F- R. G! }: v5 X6 @
  Win32_IDEController# h' H# \1 v7 X8 c" @1 D2 f4 z7 q
  Win32_InfraredDevice9 a. W, j% z+ T/ I
  Win32_IRQResource
' [& p0 m6 |  `* v   Win32_Keyboard1 _+ C+ t) z7 Q$ ^3 ]) K* e( M/ x
  Win32_MemoryArray
& x, C  n+ S$ B5 e$ r' C, {# t/ M   Win32_MemoryDevice
  B$ z/ M& j( U1 x$ T/ s   Win32_MotherboardDevice
& j2 R; T+ Y$ J6 m- `   Win32_NetworkAdapter/ \- a, u! u8 k' V$ G  R
  Win32_NetworkAdapterConfiguration( l4 w6 z  P1 j2 `$ t# O( s# [- ], r
  Win32_OnBoardDevice2 y- _' {6 r1 K
  Win32_ParallelPort
5 x: d& J) `' b   Win32_PCMCIAController3 N: w- _+ {4 c
  Win32_PhysicalMemory8 G5 Z* ]  _$ t/ U8 y( b
  Win32_PhysicalMemoryArray1 Q& L( f4 Z' B% e) q9 R
  Win32_PnPEntity  U/ b$ T0 k5 l
  Win32_PointingDevice* v  C' V. _) S4 `5 ^' M
  Win32_PortableBattery
- t" c, v; d- p3 x1 |( D   Win32_PortConnector
# D- K: R1 w: X0 E   Win32_PortResource
! [7 L2 B2 L7 q, e3 ^- y1 s6 v   Win32_POTSModem4 D( e) U5 w- W: C+ Z( K
  Win32_PowerManagementEvent
5 k: ~3 p6 [2 V+ g( S   Win32_Printer: Q+ k8 V: q0 M* E$ a/ t1 G! V
  Win32_PrinterConfiguration& F6 c. i$ O7 |0 }, u
  Win32_PrintJob
( S, P) u6 m$ l& J1 X+ K! {   Win32_Processor
# C! P  K, h2 J6 W$ i, }, K   Win32_Refrigeration
& z  V3 v" a: c3 L7 g   Win32_SerialPort- j) ^8 j5 a: s+ n8 \! Q: k
  Win32_SerialPortConfiguration
& S) I+ }. _/ [7 M  P   Win32_SMBIOSMemory
6 x( y/ B/ O7 C) t5 w   Win32_SoundDevice2 U# q; A4 y  d# [( R
  Win32_SystemEnclosure7 }2 D( C; i! c- E9 K
  Win32_SystemMemoryResource
' v2 `/ {7 M) z6 C$ u   Win32_SystemSlot
% `& o6 J. N4 d2 f   Win32_TapeDrive
' N; y) H7 M; |- j9 j   Win32_TemperatureProbe4 `! L3 C& z  z$ M
  Win32_UninterruptiblePowerSupply  q" z6 G/ X4 `% @! B# v: g
  Win32_USBController7 L; J4 {, N& W# {+ e. N% f- v, h8 L
  Win32_VideoConfiguration
& Q( h5 _) X+ a! @# x4 o   Win32_VideoController
: u4 l; w2 t& q2 g! ^   Win32_VoltageProbe7 V; t" w& H2 t1 A
5 R. K2 s4 F  n# {' {" f/ n
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-17 04:45 , Processed in 0.020876 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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