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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
# {3 B( v! J4 z- v3 [* U& n# F" S3 V- L1 w. K

7 H8 T) F: j/ p+ x4 ~5 Q; a4 Q--------------------------------------------------------------------------------7 M4 w& m; i: o
WMI: Windows Management Instrumentation (Windows 管理工具)
: ?% l# i* M4 M( h9 U9 E% d   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
5 D/ E1 _8 z1 m7 ?( C" X   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
- ~; H6 s+ }* t; @4 V) H7 {3 Y   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 * z" P& X6 E! `9 J

6 }% i! X. Y6 o6 k--------------------------------------------------------------------------------
4 a! k* m2 P' A4 R+ W# Q" M3 Z% p# LBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
2 H# q5 [7 _! @$ ?) Z% l0 a- {; B7 v0 G
--------------------------------------------------------------------------------
1 a1 G1 t* C' b( w0 G① 初始化 COM 接口:: t# X3 K7 ^% [
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。: f2 q, s, O) {0 a3 Q
  这两个函数在 #include <comdef.h> 里面定义。. U3 U8 A7 s4 D3 t2 [' n

" H8 r3 `8 ?1 N, M② 获取访问 WMI 权限:0 ]( B) E$ G( j, l$ i
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
- K4 o# B  Z" g6 f   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
1 a0 N/ e3 Z5 E+ f9 e3 C
: F) x2 G& R* ?) U③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:1 z8 y) X' j3 l. E8 s! y7 F
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
% Z" k( w0 \8 x9 `6 c8 _  Z! X/ y- h8 y- w: c
void GetWmiInfo(TStrings *lpList, WideString wsClass)4 |% q  R  f; C* P2 B
{
- m+ m$ h" ]; X- S( @( p* M  IWbemLocator *pWbemLocator = NULL;
0 N  d: P% Y) b5 N  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
/ D. j( @: V) ~0 D9 |8 r   {& x* Q$ ?% H, y" C% Q$ K, T0 _
    IWbemServices *pWbemServices = NULL;
* P1 }. T" G' \/ O' |) N     WideString wsNamespace = (L"root\\cimv2");% U3 e% E4 Q- C. Q! ~4 U
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
% d" W; c, F0 V; H+ y% L3 E+ _4 M) r      {
8 A, e: p- Z  c        IEnumWbemClassObject *pEnumClassObject = NULL;
: R6 W3 D- b  h$ g% g        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
6 n" d. @! I, Z. U7 K; [        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
1 l. j" ]" [8 ]: }. r2 L         {
8 n# i. N, Y: ~2 n4 L5 x* G$ `5 F           IWbemClassObject *pClassObject = NULL;9 ~1 R) h" N8 p
          ULONG uCount = 1, uReturned;
/ S! b- O7 E: x           if(pEnumClassObject->Reset() == S_OK)
4 U6 [5 g4 W7 `  U8 b" V. R            {8 \3 G. d7 {- R
             int iEnumIdx = 0;9 `# s8 ~5 m: h& P0 H
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)# j  c6 j% M& R1 K" g
              {3 O) J- O4 t) R$ S% F6 b- B
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");* H9 l; w' N6 X% d! X6 h. Z
4 I! k( F; i) F# W% j7 J0 T0 i
                SAFEARRAY *pvNames = NULL;9 r4 K' H& z' b; f6 Z  t) P; @: R
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
7 z5 G- T  u7 W" ?0 M                  {9 V/ H2 {% v7 d; D3 F/ i
                   long vbl, vbu;
# A. J. ]3 F; P/ g                    SafeArrayGetLBound(pvNames, 1, &vbl);
; I6 Q: k! |" v; N+ j                    SafeArrayGetUBound(pvNames, 1, &vbu);) R6 k# R1 @" E: _6 i4 a! x
                   for(long idx=vbl; idx<=vbu; idx++)) Z# v, P( s4 e
                    {
7 M. c$ T/ J! i                       long aidx = idx;
8 S  g9 \9 C$ a4 [                       wchar_t *wsName = 0;7 g9 B" s  e! ?! s/ L8 S, [
                      VARIANT vValue;
0 P6 g  L# e8 n1 O                       VariantInit(&vValue);$ @" w- M2 p2 P
                      SafeArrayGetElement(pvNames, &aidx, &wsName);4 Z. t" ~0 C8 h- s9 x' Y: U+ X+ R
: t0 M* d& o/ Y) D/ v7 V( m
                      BSTR bs = SysAllocString(wsName);+ _+ ^/ m3 \* ]0 h; s' X! h
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
, n* h3 n% M& L                       SysFreeString(bs);
- z/ [, N5 E1 P. V' y6 B- v9 M( O; @7 `0 R6 d1 y. J
                      if(hRes == S_OK)( }* Z: j+ D8 S5 _9 c! g5 [
                       {; X  @0 b0 R$ m' M
                         AnsiString s;2 E0 O. |0 w$ b; v3 _  E
                         Variant v = *(Variant*)&vValue;6 O1 `2 w: _9 R" d
                         if(v.IsArray())2 t: n2 A9 S: r/ v( G' v$ O) U- P
                          {
$ U3 i$ v) [4 u- M0 T! ~                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
1 B% S) ~2 G0 O; u                              {" w. M7 y6 x$ L: D. [
                               Variant a = v.GetElement(i);! ]2 \/ @" ]* p: T
                               if(!s.IsEmpty())
4 Z- P7 U4 h8 R6 x# Z* p                                  s+=", ";
: c# f# m0 n/ i' w8 {# l& s                                s+=VarToStr(a);
/ M- e4 F) Z: N7 C                              }
& e1 n& b+ M% k1 \4 \                           }
3 D# V9 Y# v$ M2 t5 u9 m5 L" C2 u                          else
* c$ U' V: @" L                           {
# u- K' i5 x# J1 A& Y, D                             s = VarToStr(v);
! X5 j: A3 s' C) A9 N. O. ~, L                           }
+ v$ K) o) X) t: M: C7 g7 \                          lpList->Add(AnsiString(wsName)+"="+s);
. J0 Z; p/ D- ?; E. B+ ]                        }! T  t; s0 y' S! `% i5 i

+ a' B. X! L0 w- e( [) N                       VariantClear(&vValue);
3 V- u+ F9 J7 ~/ p9 z/ e3 Q                       SysFreeString(wsName);% \; V4 J+ `. w. C$ m8 j
                    }& ~% ?; Z: ?4 l; d5 v6 Y
                 }
( \2 L& q3 R1 X* }2 E) p                 if(pvNames)SafeArrayDestroy(pvNames);
6 B6 B# N/ Y; @# f* k' G. d8 H, ]                 iEnumIdx++;$ s$ J  @* t8 M  y" r0 G
              }9 d7 v9 z4 v' s5 W
           }! K6 W. O+ K! p" G. h
          if(pClassObject)pClassObject->Release();
# ~/ K- ~* U" }0 j- Y         }
4 p* e. \& X0 b# d. v2 ~  ?( B9 W        if(pEnumClassObject)pEnumClassObject->Release();
0 l: Y4 q; k6 l# Y      }
: I0 q0 [0 X( B1 n1 W6 o5 P1 x3 ~     if(pWbemServices)pWbemServices->Release();7 M5 h1 k) _7 C  e0 W: u+ a/ K7 I
  }
1 t; G' `! s& J# J3 I0 \6 \  if(pWbemLocator)pWbemLocator->Release();" Z9 a6 c. j/ O: b% W
}* m2 j, q2 E* e/ v
//---------------------------------------------------------------------------+ n' @# |7 S$ R7 h+ n

4 P( ]% d1 O, G// 通过 WIN32_bios 获取 BIOS 信息:' f9 i6 ?0 P- ]& Q$ R
void __fastcall TForm1::Button1Click(TObject *Sender)
$ Q8 s6 P, t* N/ v) [{
9 |  v  U4 T( E1 r6 ^    Memo1->Lines->Add("================== [WIN32_bios] =================");% L& R" u- }9 ?5 D, L* L7 m* M
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
. n& Z: S, r% _* J1 i    Memo1->Lines->Add("");
/ ?1 }5 w. w( A4 p" ~}% s8 G+ |5 {  q
# ?+ N$ K" U0 D* u
--------------------------------------------------------------------------------- b+ T6 P0 t# z6 o: w% k! V
  H6 ^: u6 w! G& b  Z0 j
WMI 可以访问的信息类型有:, a5 k* I! J% p. m2 Q
  Win32_1394Controller- g- X' h: a$ d& t; {
  Win32_BaseBoard' A" |4 E$ o4 d8 R+ r$ t0 M
  Win32_Battery
  Y  }) S4 \: G- E* d# L   Win32_BIOS) v1 ]3 A0 q" a7 O7 O
  Win32_Bus
) C& R  w; i. ~5 o) [0 c   Win32_CacheMemory: T2 t5 S- W, J. F! ]! m
  Win32_CDROMDrive
* u& N7 m- @+ B' ~" s) I9 Z   Win32_CurrentProbe8 M2 M4 L* E& P$ Y, s
  Win32_DesktopMonitor
: @4 N% r: I8 @1 O1 i   Win32_DeviceMemoryAddress
+ P" C) l$ s! O  \   Win32_DiskDrive
9 O# }) |( D, V0 W1 a, e+ F   Win32_DisplayConfiguration( I8 N; A0 m5 E) T2 Q& S
  Win32_DisplayControllerConfiguration$ F2 U# K/ f1 }( T& p# r
  Win32_DMAChannel
& `# B1 Q( p  y/ P# H3 ^6 i   Win32_Fan7 ^2 q/ ?& x1 F# Z( a
  Win32_FloppyController
" C0 l( [7 s0 ~9 J0 {8 H* [5 M   Win32_FloppyDrive" o# J! X$ S3 g$ M( Y- a( s) P
  Win32_HeatPipe
0 @. L: V% g- n6 }8 G5 N   Win32_IDEController
, r8 T) C' ^5 A3 n6 ^. b   Win32_InfraredDevice
( t9 |) i: J, a7 W   Win32_IRQResource0 E  N. ]. {# j' t. _
  Win32_Keyboard
9 ?' ~  t, m4 {/ f' _   Win32_MemoryArray
$ B+ L9 t1 Z. h  Z2 Q   Win32_MemoryDevice
7 O: a8 `& d& C3 ^' @% T   Win32_MotherboardDevice+ U. \2 m: O  B+ D- m; R
  Win32_NetworkAdapter1 ]. b1 y) g% ~4 m* I( a0 I% ?
  Win32_NetworkAdapterConfiguration! f  S! w3 c# x4 v$ _) c, d
  Win32_OnBoardDevice
% Y6 r8 F: Y+ }) U% v   Win32_ParallelPort  d7 X1 W7 R' T# I  O1 D
  Win32_PCMCIAController# w0 p" A5 f! \! M1 M" `' N
  Win32_PhysicalMemory4 A3 L, v  G4 J; |. K" d
  Win32_PhysicalMemoryArray% j, C9 f# ?3 ~8 M6 `! |2 a
  Win32_PnPEntity+ z* R. I; r$ o3 J$ k9 g
  Win32_PointingDevice+ b. y0 x" A3 s  V$ d0 I: F/ _
  Win32_PortableBattery
8 X. N! t- M2 E   Win32_PortConnector* m' L' J% b) a4 ]' o  o
  Win32_PortResource
" V" w) ~7 a6 W3 V, {+ ~0 M   Win32_POTSModem
9 t% `6 z8 L" e; Q# [   Win32_PowerManagementEvent
; |  Z( l4 b+ p  `/ k   Win32_Printer7 P7 I8 q, m$ V6 b
  Win32_PrinterConfiguration7 u; S  r! q  L3 C' D& ~
  Win32_PrintJob1 {4 A" n. R. B' v9 r5 V  E
  Win32_Processor! v3 b3 i$ Y0 c9 b/ ]4 @2 o8 F2 m7 q
  Win32_Refrigeration8 p6 h1 u6 @" J( R5 @: `3 F
  Win32_SerialPort
9 |$ G! s* }$ ?) c. \5 g/ F) u   Win32_SerialPortConfiguration2 Q1 ?1 v) p* Z& W" [$ b- R
  Win32_SMBIOSMemory* c, y/ L" L+ ]
  Win32_SoundDevice0 q  M" g! i1 q! C4 e( J) k6 @( F& p
  Win32_SystemEnclosure
5 Q9 _7 i# u  d& {* r   Win32_SystemMemoryResource
+ z4 v2 _$ H9 u! Z/ Q# R! r   Win32_SystemSlot4 ?2 b( W& f4 n$ H- d: ~) X5 a9 Z
  Win32_TapeDrive; w6 _1 n- `" E1 x& j
  Win32_TemperatureProbe' R9 ^: ?* t$ f. P0 N5 E
  Win32_UninterruptiblePowerSupply' y/ ~6 n4 L8 `; a' |- F
  Win32_USBController* |! J2 S6 f; U1 X
  Win32_VideoConfiguration$ [1 z. i% E) a: L( B
  Win32_VideoController& P& N8 Q+ \  n  k
  Win32_VoltageProbe' W* |: d( P7 _, o$ `
0 W  t4 W- a" [) ~
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-19 22:25 , Processed in 0.020266 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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