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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)$ ]+ \" _# o5 a; U/ x

- ]# U5 Q+ @8 x/ f: J$ K
* f3 ]; y" C6 ]: o- g' \4 `--------------------------------------------------------------------------------
3 r1 V$ L/ c& c6 x+ _WMI: Windows Management Instrumentation (Windows 管理工具)! Q  P; E# U" D
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 6 k4 X6 V3 _2 v
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
- B& E3 L* }; E8 e& H: y   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
$ j/ |/ t6 N/ j# Z2 d
- v, U7 n0 n' @/ [! H& t--------------------------------------------------------------------------------
- x$ f: @% V4 ?$ k$ SBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
; T, v- d0 _# d7 \& m* a4 |% @2 h* V( G# K0 A, o1 X  Q* Z6 s
--------------------------------------------------------------------------------* k" u3 p: Y" j4 h/ Q- L- G& Z) f" S
① 初始化 COM 接口:
) B7 M8 k2 q7 x   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
( z3 h& M: Z& L' i) q- A   这两个函数在 #include <comdef.h> 里面定义。# C4 [8 V1 ^9 o& W( @9 w& G

- }* C9 T& W' z3 Q! ]1 a: b! v② 获取访问 WMI 权限:
% u1 I* a6 ~+ n3 m- q5 Q2 H. {   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
4 ]& T& o% b- ]8 q& M: N9 F   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
3 f/ H0 |; d+ m4 j
. n7 }8 b* n! k③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:7 @; m" l; G" g  e( o/ i8 [' u$ D
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。' c- U( s7 I: q6 K1 G( u

5 n' e1 N7 W! r$ E3 X6 Xvoid GetWmiInfo(TStrings *lpList, WideString wsClass)5 i; ], \$ o; j
{
) m& P2 _8 l1 ^/ `# N$ R  IWbemLocator *pWbemLocator = NULL;4 i' F) {9 Q, Y( H' e
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
" c3 P- b" e$ s& R! v) s8 b5 `4 Q( T   {: R! q5 R* i6 p
    IWbemServices *pWbemServices = NULL;  Y( B; g& P3 ~2 D9 h
    WideString wsNamespace = (L"root\\cimv2");* e- v9 o: Z; J1 j9 ?
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)8 \0 ?  {- v( ?8 a7 y0 }: l
     {0 A8 i7 ?" e: y
       IEnumWbemClassObject *pEnumClassObject = NULL;' x; s) V3 _4 G# }2 v2 U  g# w
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;# o3 g# w& m0 s  g3 C' I. }
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
  H/ I6 f* F3 e! ~% ^* a         {, f* }* [( T7 i5 n2 _& Y
          IWbemClassObject *pClassObject = NULL;% ^# ], Z+ [0 K. R# n
          ULONG uCount = 1, uReturned;2 U% Z' b7 C; d$ j  C; Y1 W$ K
          if(pEnumClassObject->Reset() == S_OK)
( l% z, `; j  m* F/ J4 j! m5 }            {
' l0 F( O! b+ i& f7 g              int iEnumIdx = 0;
( a" T! }+ m  a8 a; _              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
/ @; F! Y( r! x8 K, Z* i* o               {
5 I0 b0 x7 K' |3 b) y. Q- k                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");9 p: D/ \. M2 j, ~, y1 a
. d4 Y' r  e0 `
                SAFEARRAY *pvNames = NULL;
* C4 V, E' P$ ^' _                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)# i& Z( M3 ?8 j9 t3 ?  J
                 {7 B2 k) i- t  v0 y5 \) ?' Z0 o
                   long vbl, vbu;% i/ T8 N; W$ \% X7 n/ z9 q
                   SafeArrayGetLBound(pvNames, 1, &vbl);
# ^! ], m* O! x. {" Z) E                    SafeArrayGetUBound(pvNames, 1, &vbu);
2 M$ h+ L: B3 A8 r5 e3 e                    for(long idx=vbl; idx<=vbu; idx++)
3 B2 G( i+ ?9 b! m                     {
% U- v7 d: X' P                       long aidx = idx;
  v+ I. b) ]+ X0 w1 r+ X' c                       wchar_t *wsName = 0;
- x( h, ~0 O& h$ b                       VARIANT vValue;+ S" V* X+ B8 |; |" D
                      VariantInit(&vValue);3 a# x! m, m# l4 V8 m3 k% i
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
1 @( c5 B. E# X# J- k( t' [. p" B3 @" i4 h9 ~
                      BSTR bs = SysAllocString(wsName);
2 Z. u( A9 z. m. e2 h- M                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
) b8 O: n+ s* D& T; x, G: m                       SysFreeString(bs);
0 c# p) F7 C' `' @% ^4 F5 F6 p+ V' L+ ]; E
                      if(hRes == S_OK)
4 i8 S4 N  ~  i4 D! Y: ]! c                        {
* G7 f# F) ?# Y" `* ^                          AnsiString s;
" k+ V0 s0 U3 l$ n* q1 e                          Variant v = *(Variant*)&vValue;4 d$ D. [) w, `
                         if(v.IsArray())
' n  j2 k  l/ A* N" H                           {
4 C, h7 f: c9 ]0 W2 j                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)- ]/ A( K% x; c
                             {+ y' {0 o1 A2 ~" [# `6 M
                               Variant a = v.GetElement(i);
! J2 G7 F  X$ Y+ B, b3 k                                if(!s.IsEmpty())
9 c) ?( o) J1 u' n2 {5 s8 E                                  s+=", ";. L) Z- o; Z2 b
                               s+=VarToStr(a);
, ^$ U7 Y. q9 Z4 I6 }& _& v! z- v                              }0 ~9 b3 O' N6 Q8 _
                          }
) m) E8 M$ t: z  b  e, p                          else9 o7 j: A. _$ M) m7 c3 C
                          {
% C( f2 e4 H, l: D                             s = VarToStr(v);
$ ?/ y2 {) [! l# E                           }
' }( L# N2 O0 ?; ~) }3 L                          lpList->Add(AnsiString(wsName)+"="+s);
- A9 S0 h4 Y  d- R                        }
% w( {% }5 ~% }8 K: H+ ^
( t, P3 ?$ l. r                       VariantClear(&vValue);
4 J, T* Z/ w: M: M  {1 J                       SysFreeString(wsName);. ^% ^/ J1 F6 N7 r
                    }; j9 Y& U5 p5 m" C# e
                 }) B, x1 A6 ?1 x" i
                if(pvNames)SafeArrayDestroy(pvNames);  U& y6 a+ M3 Y8 S" m. q& l7 V
                iEnumIdx++;6 u; |- P. N* O8 q1 e
              }
: G, s$ i8 z# v0 j7 u( j            }% I) o; o2 A! w  U; ?
          if(pClassObject)pClassObject->Release();9 m; V, k, E% b* Z- [' D
        }8 l7 c, g9 O& O$ p' ^
       if(pEnumClassObject)pEnumClassObject->Release();6 X) ~! Y- Y8 G5 D
     }
/ V/ G; j% k0 ~: |: A# d2 d     if(pWbemServices)pWbemServices->Release();# K# X8 A9 L0 K! R( r0 H
  }
9 I/ P- s7 x1 D  if(pWbemLocator)pWbemLocator->Release();
- J9 x4 X' s- g5 d, \3 Y}
( Q7 _; C4 Z0 i5 S3 o4 ]4 T2 A//---------------------------------------------------------------------------$ n3 [) G4 z1 W2 C# ]8 e
- ]; ^( I5 a+ m6 k" x8 }7 o
// 通过 WIN32_bios 获取 BIOS 信息:
4 V! ~1 h+ D1 k3 E4 J- dvoid __fastcall TForm1::Button1Click(TObject *Sender)9 t" B8 A1 [9 F) N. I: X' M; v
{
8 y& f4 A, z6 W) Z; k    Memo1->Lines->Add("================== [WIN32_bios] =================");8 _6 D. C+ X6 Q2 {) c
   GetWmiInfo(Memo1->Lines, "WIN32_bios");! L9 l: W0 B+ ^, \
   Memo1->Lines->Add("");
2 I  y- v7 |& G* ?7 `}, b* d0 m. T3 _7 O0 y$ n9 c- i* o
. W+ c2 I  e$ @; ?  g+ Q3 V
--------------------------------------------------------------------------------  x8 P- t  L, g; C# ~  ]
. ?3 b4 s4 M6 G5 k
WMI 可以访问的信息类型有:8 [. b% M5 a) N! x4 |- v/ o
  Win32_1394Controller
( Q. l3 ?  u- z1 n. `4 Q" C9 ?   Win32_BaseBoard
! |$ d. s: W" Z5 t   Win32_Battery) \! d1 O* G! w4 [6 d
  Win32_BIOS- F& F0 J! j/ K% e9 t
  Win32_Bus
' C. G- K- X% L# c7 s5 S) _   Win32_CacheMemory
" X: |4 s* f* e8 X5 J3 y' e   Win32_CDROMDrive
/ p0 ^' U$ h. W   Win32_CurrentProbe. }6 i( L0 x6 @  b8 k* ?
  Win32_DesktopMonitor
3 O9 p+ `- q% f2 q' S' o" r. w   Win32_DeviceMemoryAddress8 F3 a6 x$ w) o' A" L
  Win32_DiskDrive5 f) Y. [; ~- J5 b# G$ C2 X
  Win32_DisplayConfiguration
5 R8 V# p. u. f( x" @0 i- Q% ~0 g   Win32_DisplayControllerConfiguration, w  O5 y6 D2 g! W+ Y
  Win32_DMAChannel- f7 L  X* M; ?7 Y
  Win32_Fan) W) O& W4 B# _) s' |
  Win32_FloppyController& o4 J0 g4 N8 l6 i7 W+ f3 y
  Win32_FloppyDrive
: h4 b; W' W$ ?% J   Win32_HeatPipe
! F! B& B* i, j2 Y$ _& y$ p8 o6 U2 C   Win32_IDEController2 D( Z2 w% G! g
  Win32_InfraredDevice
. N. |1 P# Q9 [0 z   Win32_IRQResource; F0 C0 {8 ~0 f$ A6 y7 ]
  Win32_Keyboard
- f! l# v2 ]: }   Win32_MemoryArray
8 |' e3 |8 z# U" {   Win32_MemoryDevice1 Y, }1 M0 b" x; _4 ?. p
  Win32_MotherboardDevice7 n1 W# A5 _  A" l" c- Q7 I
  Win32_NetworkAdapter, p# d* v3 ?, k% E+ a8 D
  Win32_NetworkAdapterConfiguration
& ^! W/ i. Y' h! Z  }% {   Win32_OnBoardDevice: r/ X# @! s1 K* D
  Win32_ParallelPort6 S$ a: z; e: C8 \6 O
  Win32_PCMCIAController
, z8 e0 L9 y# W# a   Win32_PhysicalMemory5 D. E5 H* e$ b9 R3 J  z0 j
  Win32_PhysicalMemoryArray1 ^/ f& ~8 @# f
  Win32_PnPEntity
. e, F& h! [8 U* a4 E+ k   Win32_PointingDevice
$ c! [2 g% k) @; N2 r6 [/ S! Z   Win32_PortableBattery; C2 v; A4 n; N9 N; c' ^
  Win32_PortConnector
) R6 l+ t: Y; ^# e: x   Win32_PortResource2 Q; ?$ G5 ?' B& _2 ?
  Win32_POTSModem
3 [" l+ j/ F/ S1 V   Win32_PowerManagementEvent
" M' K+ ?& a. H( I7 z$ M, M9 v   Win32_Printer9 r5 s9 s9 |0 {4 f$ |1 F
  Win32_PrinterConfiguration. [% Y4 y) E% N0 _+ C$ i4 i
  Win32_PrintJob
6 O4 u% k2 c7 S6 U, o3 M   Win32_Processor, x" K" B, v, ^7 w0 [8 D) |# J
  Win32_Refrigeration- g' y; ?: R4 j. j- p" ]
  Win32_SerialPort
1 t5 M/ Q. R9 |" ^. h7 T6 k0 m/ ?/ n6 t   Win32_SerialPortConfiguration
" m! m* R% I8 r  v* ~   Win32_SMBIOSMemory, G& n& E' V+ ^2 U  ?6 l
  Win32_SoundDevice
6 R8 H1 h; p4 O   Win32_SystemEnclosure
5 e- k3 v8 M1 ^4 b, J) j" G   Win32_SystemMemoryResource. z. w% ^) J8 x: K9 _
  Win32_SystemSlot
7 k' Y( p+ f* R/ n8 r) e. X  C   Win32_TapeDrive! D- _) M2 D! L. m
  Win32_TemperatureProbe
% C8 d9 M+ E! f! f1 P4 C   Win32_UninterruptiblePowerSupply4 a" \( G1 ~# m& R1 m# y
  Win32_USBController
2 r' ~( y% F, d- Z5 o. F: m, O# K6 @, |   Win32_VideoConfiguration
$ _! d  s2 x8 u& v   Win32_VideoController
$ a3 u7 L6 R4 L  C- i: j   Win32_VoltageProbe
+ o3 B; x6 w) g) b: l: |* ]5 t- ?5 m2 H" Y. ?2 G3 r% l6 E
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-6 08:25 , Processed in 0.018976 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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