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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
7 ]4 M  n1 T2 K& t+ R6 F, t2 G& X% L" i; F) t- O' Q

+ _: B2 L) M% z+ r' [: S0 H--------------------------------------------------------------------------------
9 O: P& L- D+ Q' c/ Q3 f3 HWMI: Windows Management Instrumentation (Windows 管理工具)# v7 \3 M. }3 E2 J! o- u) U
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
0 A9 l2 ]6 @+ X2 a& V   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
2 c6 p4 g8 b& }5 O5 O! R) p0 S   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 9 Z1 J2 F5 [+ X

7 I  G- t0 j! o- H, Z$ c--------------------------------------------------------------------------------
0 H  I# s. X+ ?. a. C7 C( uBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
( |. B$ Z% d- H$ \" w' l7 e, P6 \% N7 j
--------------------------------------------------------------------------------
4 j+ Q" i7 r! {# y, s! o① 初始化 COM 接口:
" G/ z0 _' L) O2 X( `   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。+ f3 A; l; a3 A) O$ Q, N3 M
  这两个函数在 #include <comdef.h> 里面定义。
4 i* d) V1 {& ^+ s5 ]+ `
+ t4 U# J# E9 J$ C② 获取访问 WMI 权限:
. Q  B5 P8 r0 P# f# \   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
2 g. \+ J/ V- p7 f) q, j   如果这个函数返回 S_OK 获取权限成功, 否则为失败。9 Q5 d9 [, m& N) g+ {6 e' D

7 I9 u, \2 O( T3 }③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:" F) a7 R3 O- Q  G8 u
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
" }& ~+ p' J7 c& y9 w( Y2 z5 ]; {% H8 j
void GetWmiInfo(TStrings *lpList, WideString wsClass)2 ]4 Z/ @* V1 A/ D! F
{
3 |) y0 T" h; `( v: B/ }  IWbemLocator *pWbemLocator = NULL;
3 p: v/ V" q$ u, J  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
/ t/ m4 y; F3 u" |) X   {+ I2 I: E2 f6 f2 T5 W
    IWbemServices *pWbemServices = NULL;1 |1 u) d! G" }) X! `
    WideString wsNamespace = (L"root\\cimv2");% Y1 o' P( O6 E2 I6 U" H" m
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
* j" b, x  R" B. g- h      {) ^3 l9 w& T0 n* Y
       IEnumWbemClassObject *pEnumClassObject = NULL;
  h+ y; P( z8 S* ~) k7 t6 J6 w7 l& c        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;0 v) b! F( X4 ^! P* e( C
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)2 E" s1 A4 @& m) r# w6 m
        {
! K- A% l- b$ N           IWbemClassObject *pClassObject = NULL;
8 D' ?) I! x$ k           ULONG uCount = 1, uReturned;
. f& I8 U( I# N; j7 W6 b4 H* k1 Y           if(pEnumClassObject->Reset() == S_OK)8 l% T& p+ T& U* ^
           {
; V& R1 f2 i# l  ]3 w              int iEnumIdx = 0;, B% B' S; a- w! [3 s: W
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)' {+ R* h+ A% ?% D0 q
              {2 f9 w) J2 e4 T9 }
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
, G1 W* b1 x6 [# Z2 C- f, n. K. @5 ]& M" T
                SAFEARRAY *pvNames = NULL;. [( c( X# @. c9 [" r
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
9 \7 r7 l; {! J0 a' n                  {
$ I5 k. U: O7 A9 a                    long vbl, vbu;
+ u; d; J! p- {8 N                    SafeArrayGetLBound(pvNames, 1, &vbl);- I  m  y0 Q  ?
                   SafeArrayGetUBound(pvNames, 1, &vbu);5 y0 s* P& j8 j* v* K4 M4 x1 g
                   for(long idx=vbl; idx<=vbu; idx++)
  E4 z! m3 h5 v                     {
! f7 f$ ~; T$ v7 O- l$ Q  @                       long aidx = idx;
& k9 c0 v/ j. a9 l8 l; u& I                       wchar_t *wsName = 0;
: z6 P/ a0 d0 B5 H: b; ?2 v- p2 I                       VARIANT vValue;3 O. K6 X9 I( A% ~8 p
                      VariantInit(&vValue);! ^/ X1 ~7 ?3 o/ e* D
                      SafeArrayGetElement(pvNames, &aidx, &wsName);( l5 c  G2 y4 N& }# W( B

& b2 M! d+ }5 D* T                       BSTR bs = SysAllocString(wsName);
' ?8 o- y5 R) a( y- K                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
2 m' e( ?4 A1 a4 n3 N                       SysFreeString(bs);- J: {* t/ f" c
# e8 `; t* W" K" I9 E, y* V7 B
                      if(hRes == S_OK)
7 P$ S- V2 ~. _  Q$ X  g) ?+ `                        {; M2 r! D* H" Q
                         AnsiString s;8 K& B% }& c' d' T2 s9 X$ W6 U
                         Variant v = *(Variant*)&vValue;; M3 A1 q4 F0 V8 q9 \( T
                         if(v.IsArray())
2 ]2 M6 \% c. M! ?- H                           {
+ y) ~2 z, ~3 `% U/ j& O; Z# x8 H                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
- h3 ^3 L) m' \/ a+ c: I. r                              {" Z- e7 F+ p+ ^- _7 ~2 u
                               Variant a = v.GetElement(i);
# f' @) h/ y. L% H: o                                if(!s.IsEmpty())' }, }8 L5 S2 z+ {3 D' T* H: Q
                                 s+=", ";. {# O7 b9 w- G
                               s+=VarToStr(a);
' v' K9 _0 J4 p! U7 k4 X                              }' ]* E( m  {& w
                          }
: c  u+ g6 l! J* l4 \) H                          else9 t/ p6 W- e/ m( c* |8 t( T* W
                          {
8 M) K0 w* W% [2 o( F+ j                             s = VarToStr(v);9 d% j2 ?5 I4 P! }5 \
                          }" `. M* t0 F; j0 x$ ?
                         lpList->Add(AnsiString(wsName)+"="+s);0 f8 C1 z. [7 O* ^# c7 w' q5 [
                       }
7 J+ _1 Q0 Y# I. |2 i, _9 H7 \# Z7 O: f. t
                      VariantClear(&vValue);
' Q. {7 V9 t& \9 V- T                       SysFreeString(wsName);7 D  O2 f  O+ N, P
                    }
% ?2 g- _0 W/ l( @* j5 D9 P                  }
1 @! J3 k  C9 U/ x; d) ?                 if(pvNames)SafeArrayDestroy(pvNames);
9 [+ l) k  Y8 M0 E; Z                 iEnumIdx++;
2 f& p# `( }/ M9 ?" B9 T# x" g               }
* T, j# X+ t6 V0 S& L6 [            }) g1 u! A/ `/ v: X4 q
          if(pClassObject)pClassObject->Release();$ y  g# f& ^8 v
        }7 a7 t+ \! t8 \1 l
       if(pEnumClassObject)pEnumClassObject->Release();4 K/ }0 G" {; ?. O* P: D
     }5 F% G+ j! n' n/ A5 ~0 R/ Q6 X
    if(pWbemServices)pWbemServices->Release();
' n2 {3 V  S( e# U% [) E/ _   }
  x+ f* b& u4 k9 J: e3 w$ I# J6 z. \  if(pWbemLocator)pWbemLocator->Release();
4 b. \8 u" L- v1 p}
8 t% p4 z7 e) q; U* |//---------------------------------------------------------------------------
7 t8 n- j1 d: z
- Y% f" W, H2 ]2 u7 C. U// 通过 WIN32_bios 获取 BIOS 信息:% j; Q$ y# P: @0 W: y
void __fastcall TForm1::Button1Click(TObject *Sender). d' M0 k: a% H- D
{
  x3 J; s9 X6 D6 ]; U    Memo1->Lines->Add("================== [WIN32_bios] =================");9 G  ?8 p% E) [) y3 F1 X
   GetWmiInfo(Memo1->Lines, "WIN32_bios");. ]  D# G0 ~6 g
   Memo1->Lines->Add("");
2 M; B, z: F: c, {}
0 ^) L7 e; Q) _, Y6 i' i5 E5 l" d$ x/ F, |# b9 W7 |! e: `8 @4 p
--------------------------------------------------------------------------------5 E5 R% d+ ~' x0 j$ a  R
# y& T# m* v( q: i
WMI 可以访问的信息类型有:
: b' z; T6 ~3 o# _" V3 W   Win32_1394Controller
  Y4 h- z9 L9 W" n( c7 h   Win32_BaseBoard
0 l9 V, l8 x5 x. G, m  m. n: A   Win32_Battery; U: Z( A" R- k5 J# F0 Q0 \
  Win32_BIOS/ R. Q  E& X& M3 U9 G4 |2 ?
  Win32_Bus* {7 V6 d" Y. V+ q" j
  Win32_CacheMemory! f2 `* b2 V8 P3 `
  Win32_CDROMDrive
0 ^4 W2 J( L' q- B9 u; N# R   Win32_CurrentProbe
( p1 q# T8 d6 I/ `) Z& |8 N( }   Win32_DesktopMonitor0 @$ W7 W# i  {5 J8 v" `. c  n
  Win32_DeviceMemoryAddress. }4 |  O) T; \8 }2 Q
  Win32_DiskDrive
+ c. X6 v9 H2 O   Win32_DisplayConfiguration0 ^* u! q, c* H' ^* p
  Win32_DisplayControllerConfiguration9 t" p4 F! O% b6 i9 J! V  F
  Win32_DMAChannel4 T- w7 ^1 Q4 O' |
  Win32_Fan6 q5 o& `8 `7 E" l- B6 t
  Win32_FloppyController
: L. u: o( ]5 [0 C" D; Y. J   Win32_FloppyDrive
" q/ ~8 d8 `6 H3 D6 T+ R6 F: P   Win32_HeatPipe
& M) ~) A3 _6 \. B. ~   Win32_IDEController
( o2 B/ m! X$ @! ^/ G# H* d  t   Win32_InfraredDevice
, |' J# i' J6 M% i+ Z) Y  l   Win32_IRQResource
$ N2 p1 t# ~$ N( z   Win32_Keyboard* {# Y8 I; i1 L( d# e- R
  Win32_MemoryArray
" o# O! O. p5 a( Y3 K6 j/ m   Win32_MemoryDevice
; f2 L% s" w+ B% @5 `& ?4 q, P   Win32_MotherboardDevice
/ e8 S: }2 b2 [' q9 z& W   Win32_NetworkAdapter+ Z! h  ?/ I+ p6 K) p7 d) f
  Win32_NetworkAdapterConfiguration. s% ?8 u, T) w$ c) w3 `. o
  Win32_OnBoardDevice2 X. O  ~' N2 f1 G
  Win32_ParallelPort
2 K* X( l! [4 K  M$ w   Win32_PCMCIAController
$ \& N' h5 i% v* I   Win32_PhysicalMemory. d4 J, u8 D- M3 a, ^$ i
  Win32_PhysicalMemoryArray
, h) {. K* j/ J1 [- T2 K. O3 ^   Win32_PnPEntity
4 _; r/ y, g5 b7 D. k   Win32_PointingDevice* A  ^4 [7 e+ t" e2 d. w- E
  Win32_PortableBattery
4 P% U' P0 d$ {% |  u& p3 j   Win32_PortConnector
5 X$ t# u9 L2 U! D3 |1 G+ _1 ~   Win32_PortResource
/ v7 o0 a" D9 j: |   Win32_POTSModem& g* S( o& C+ G: m5 S4 _4 m
  Win32_PowerManagementEvent
  F; |, r7 ~2 ?. h8 C   Win32_Printer$ \' I2 z+ q0 O
  Win32_PrinterConfiguration4 q& A3 q2 r" h+ W% I5 [
  Win32_PrintJob
7 d" A- o; F3 q   Win32_Processor
2 g0 Z7 ~- V- p; i. G0 ^   Win32_Refrigeration0 z+ [9 p3 ?1 Y: ]7 G9 m
  Win32_SerialPort
4 u/ G" c# p0 H; E   Win32_SerialPortConfiguration
8 s3 s6 F, V" W/ I4 h1 K! ]6 ^   Win32_SMBIOSMemory
9 c" ], ?/ C! E/ t   Win32_SoundDevice
& o- g! R: G# Z8 f7 Q: J   Win32_SystemEnclosure$ m1 i  w& S. J3 k6 R) w4 O4 a
  Win32_SystemMemoryResource7 z$ _( U. ~- n8 f
  Win32_SystemSlot+ ]$ `% k" v5 z6 E; o" I, f) X
  Win32_TapeDrive/ P) c: x1 o. M8 D  X; ?
  Win32_TemperatureProbe6 `6 U$ Z8 z2 j3 A# j
  Win32_UninterruptiblePowerSupply
0 }; n1 U8 B" v   Win32_USBController0 B# ]2 u3 ]) S2 y# [6 O
  Win32_VideoConfiguration
. b  k2 u# B1 u3 Y   Win32_VideoController% |/ g; i& I$ e0 e- b
  Win32_VoltageProbe
+ S( B' v8 l% C: y2 T) ?/ Z$ {" V$ Q; r& y
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-25 08:18 , Processed in 0.019627 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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