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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
$ D! O4 R! ^& f* z3 U7 e
7 r, M6 G, F! \( k# e8 _0 g/ T/ z# n6 D
--------------------------------------------------------------------------------
0 D7 \* Q* B. y' }WMI: Windows Management Instrumentation (Windows 管理工具)
# q$ c* J* L- r/ k' e   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 7 E: `! ^% M" w. o" d
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。/ I3 c) J4 K8 h% c4 q- m5 D
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 2 G- r' Z6 ^0 h9 t3 X6 g$ T
1 h0 {( |' l% F" `+ F
--------------------------------------------------------------------------------
7 Q2 D' X* E1 `BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
, B4 c# o% ~6 @
7 O, m7 R9 `8 f--------------------------------------------------------------------------------: }" }/ m* [9 x. i, R& N
① 初始化 COM 接口:# e3 h$ l0 _. p# K8 f( U
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。( ?, X8 P& D+ O5 F2 i& C4 c+ W
  这两个函数在 #include <comdef.h> 里面定义。) r6 p, a& ~% d+ V/ _
/ w  j7 n* E& d- g5 f1 w
② 获取访问 WMI 权限:+ v6 x! h# V; i4 r% n- d" T( t$ f
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
; [, |* F1 Y- _( ^   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
7 P+ r& n4 h% O5 W; @3 t" H: @  Z' I, x6 _7 |
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:, `- r9 `* L1 \" }2 e
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。' W- M8 n: V0 m0 q+ Q

9 h6 {' U2 h$ x- kvoid GetWmiInfo(TStrings *lpList, WideString wsClass)* [# v3 p8 i6 ?1 I4 b
{
3 G. b9 t4 m7 G6 i& Z  IWbemLocator *pWbemLocator = NULL;
, I5 U4 F0 B0 U; E3 ]; L  M  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK); H2 ?& i5 n, |. L& o
  {
; S0 N: r0 s( E$ K     IWbemServices *pWbemServices = NULL;
& {0 C$ N! v5 \% F     WideString wsNamespace = (L"root\\cimv2");
# @9 ?' F! A0 P; U$ R1 i1 F     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)9 `7 y! [! J5 S, I+ p, ]5 `
     {
9 Q" ?, \1 Z2 Q$ g, Q        IEnumWbemClassObject *pEnumClassObject = NULL;! T9 ?, j! R% j
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
6 I4 o/ @& p: O! A; M        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
( D+ E2 Q4 w7 A% G         {
; G) ?3 V7 l, D% ^6 l' S           IWbemClassObject *pClassObject = NULL;
2 W6 y, @$ `5 v6 \           ULONG uCount = 1, uReturned;
9 Z# E& _1 e# t1 E2 X+ @           if(pEnumClassObject->Reset() == S_OK)" b$ R, w8 B4 d$ y# ?" t0 o& q, T2 m
           {
2 k5 Y7 d1 m: g3 C0 H) w$ E              int iEnumIdx = 0;+ [1 U9 D6 r0 n- ?! v( p
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)! f2 c! @; z4 e( E9 L$ Z) B
              {  p- G) o: e' a0 A' D- c6 p
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
, `2 m2 j$ w% Z5 w& H. P
6 p" j3 Y5 `3 O" A9 h( X                 SAFEARRAY *pvNames = NULL;( q9 T  `6 ^* h7 ^
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
$ m8 s2 O7 F% K, k( H# r1 C  ?                  {( `# g1 u7 D! m3 u8 F3 U
                   long vbl, vbu;
1 ?6 N" N9 s+ Y! B) ~                    SafeArrayGetLBound(pvNames, 1, &vbl);
- x9 v3 C9 T0 b( h" h                    SafeArrayGetUBound(pvNames, 1, &vbu);
# l6 K" v& i5 h/ H, m3 b' p- X3 f                    for(long idx=vbl; idx<=vbu; idx++)% X3 o9 V" Z: ]$ h
                    {
" L2 f/ U+ C. u* w  A7 V                       long aidx = idx;7 W: q: y  Y$ X$ B
                      wchar_t *wsName = 0;
; M. R( }9 R( j! w" L* o% J                       VARIANT vValue;* w4 U! g  ]; T6 \9 D
                      VariantInit(&vValue);
: |+ a5 Z3 }, G8 [0 G/ f2 ]                       SafeArrayGetElement(pvNames, &aidx, &wsName);
( q# O: L5 Q* H7 }
$ V6 Z1 w6 X. a9 D4 ]                       BSTR bs = SysAllocString(wsName);
5 E0 {9 J& E# U& @8 f: X                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);( V: Z9 f3 u7 s! [- D) b1 R
                      SysFreeString(bs);( j/ Y9 f( z; n) P% X

# Z4 I. H9 P. W. w                       if(hRes == S_OK)5 S% \+ k. x6 j
                       {4 n1 @& M" v: j; c# y- J# M: K
                         AnsiString s;
" F1 q" b  |% f4 \! m; ~                          Variant v = *(Variant*)&vValue;7 p' V. T; G- J  R4 t7 u/ b9 A
                         if(v.IsArray())
* s7 r, B) {4 h8 N  \7 B+ Y                           {4 z: {4 C* ~: T$ V' M2 u- `
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)- k: W& _8 |3 V$ Q! A+ X5 P1 j
                             {
7 z6 C( G% Y( T9 a, V0 J* ~1 ~& Z                                Variant a = v.GetElement(i);+ s  Q; P3 \' `9 I5 m0 ?, N& J
                               if(!s.IsEmpty())
; d' W- N5 m# H1 O; T3 P                                  s+=", ";- W! _/ j1 p) M' j! J. {: I
                               s+=VarToStr(a);
( P; j& k5 Z+ y5 s8 D" |$ F                              }
! \# c# k) e1 q                           }
2 n/ m1 a& F' T1 J6 W7 [7 g6 I. Y' K/ }                          else
5 L5 z) A7 }4 `! z2 }# j4 i# i8 z                           {
$ U) f5 |2 }& _8 t                             s = VarToStr(v);7 e" m1 l8 u0 s0 b; N
                          }
- L; e" W1 r( l                          lpList->Add(AnsiString(wsName)+"="+s);5 ]: i4 x* @3 ~. J2 |/ F* _, x. e
                       }2 p% y+ w% B5 k( E' ^" P

4 J1 F% n4 j9 `                       VariantClear(&vValue);7 r6 \* I( p+ [6 t4 s: |5 [$ I( O1 F
                      SysFreeString(wsName);
1 {# x7 P2 D# _7 X, x( S                     }; O! u* ]; h9 H; s' f' @+ a% ]
                 }: k+ E/ I/ [  U( s+ h0 U3 k6 E* m
                if(pvNames)SafeArrayDestroy(pvNames);* k/ }+ E7 z* h5 z4 b
                iEnumIdx++;
7 c4 k7 {% b% I) L* H               }) @3 W* s; u" j" n7 f! G1 }- o
           }) c1 C' I. {' r
          if(pClassObject)pClassObject->Release();
. R1 g6 g# E( S         }
/ {: b$ A* s4 F& y1 G        if(pEnumClassObject)pEnumClassObject->Release();
3 E! j; Y2 i& Z" W4 |      }+ o1 C* _+ S+ e' G( N  D
    if(pWbemServices)pWbemServices->Release();
. n* W9 e) C6 M! p/ ?6 ]! B   }1 c3 `$ a! d5 m3 }; h/ g
  if(pWbemLocator)pWbemLocator->Release();
3 W1 }4 @1 L1 _/ {2 P! T}- ^5 y: y2 M0 l# r/ Z
//---------------------------------------------------------------------------
/ l. O4 S: x: q% M+ [# H
8 f: H) |" ^# W4 |" j// 通过 WIN32_bios 获取 BIOS 信息:
: _! w4 b: Z# I( J- Xvoid __fastcall TForm1::Button1Click(TObject *Sender)& Q/ {& d9 J3 D, K, O
{
! [4 M7 T! U$ t  s- C    Memo1->Lines->Add("================== [WIN32_bios] =================");: P2 ]. E. y; W2 r3 Z; }0 S
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
4 s+ v+ I% a8 H2 n0 |    Memo1->Lines->Add("");( R1 w8 i* e4 {- A
}
0 T, k& g( E1 _8 `" `% v. a2 i
: L1 i9 O& u9 w1 o' g5 ^--------------------------------------------------------------------------------1 G% V2 A% v& a

  g, @- D5 C! Q! h  QWMI 可以访问的信息类型有:
1 N1 l! e" p9 s) ^   Win32_1394Controller4 j' Q% V6 i9 D2 Y: z1 ]; t
  Win32_BaseBoard1 u4 @8 U8 E: n  t* H& T) h+ s9 ^
  Win32_Battery' u' N7 V6 F8 k# e8 ^% g
  Win32_BIOS
: `$ C# n2 u# s   Win32_Bus% o% Q7 F  H, h+ d5 k' Y
  Win32_CacheMemory. n8 t- t9 w! G1 n' s  q# y: l8 A% }
  Win32_CDROMDrive
. b8 O$ x" R  ^5 M9 r( d. o   Win32_CurrentProbe! l, Z7 f% r* Y& a/ K; f
  Win32_DesktopMonitor
% Q2 H5 i8 U4 N1 w- L   Win32_DeviceMemoryAddress, u( d, }% }/ @/ B
  Win32_DiskDrive8 {* s" Z$ V) T* a4 F3 ^
  Win32_DisplayConfiguration4 k/ P% h* t; p
  Win32_DisplayControllerConfiguration- e2 u" b4 v7 `
  Win32_DMAChannel7 ~' L4 G+ z$ |
  Win32_Fan) t, N: A% \+ r# \* U' j
  Win32_FloppyController
& E) M! G- X( M  N   Win32_FloppyDrive
1 }8 c) y. g9 r7 L! w# m' u' m   Win32_HeatPipe
  o1 l5 D3 W& [8 W+ K4 b5 Q) U   Win32_IDEController
0 T' ~" j# d* S0 |$ N* }   Win32_InfraredDevice3 k! _2 @1 Z5 l  R
  Win32_IRQResource
- Z' b6 d1 V  Z+ S9 U/ ?  k" L   Win32_Keyboard
8 s, F4 r% q  T, j+ v. Y6 `1 y. \   Win32_MemoryArray& |6 h0 N  h4 \
  Win32_MemoryDevice2 ^% r+ j+ F( b! u+ h! V5 a- y
  Win32_MotherboardDevice
# U3 p8 e0 f, r" k   Win32_NetworkAdapter4 Y6 K8 x) }/ W) R, z+ r& Y1 A& M
  Win32_NetworkAdapterConfiguration. M; B# q# C1 o7 u3 z
  Win32_OnBoardDevice6 I+ N1 b- h6 j& X
  Win32_ParallelPort- {* G0 I3 a* A) N( J5 H, E- U
  Win32_PCMCIAController
) g! \* q& e/ l7 \- c" u, L   Win32_PhysicalMemory
' X7 f( R! T& y  b   Win32_PhysicalMemoryArray
6 N: \7 I! Y& u# t: g   Win32_PnPEntity2 c. h! t4 }- L2 I0 V
  Win32_PointingDevice
1 s: ]% S, ?1 U% I2 a1 _9 @' _   Win32_PortableBattery4 j2 M0 b- }. X& W; u# C0 Y# S  _% i
  Win32_PortConnector
3 P5 c/ L: U, W+ x" N( O0 I% u   Win32_PortResource
6 x% V/ b9 B4 ^" k$ a+ _2 @* F   Win32_POTSModem, U7 ?& A0 ]& k; O6 k) X- e3 @
  Win32_PowerManagementEvent
- Y: T9 d1 q+ k8 [% G   Win32_Printer% l. Q8 ]) l' |$ \6 C3 A! N
  Win32_PrinterConfiguration4 l. r* J. f6 E, {' n: q
  Win32_PrintJob
6 H  W. N3 g6 p2 p( Q6 a2 C5 L" V   Win32_Processor
4 u6 w. a: Q/ Z: u- {! f   Win32_Refrigeration
5 m) ]5 H5 {# R# N; r   Win32_SerialPort; u& h# {' v6 y. m8 s/ p
  Win32_SerialPortConfiguration3 h- |: k/ I. L. b/ [8 J/ Z
  Win32_SMBIOSMemory0 S+ a1 O4 I7 _1 j
  Win32_SoundDevice! V% ?% V, H1 ~1 @! V* k3 S' [
  Win32_SystemEnclosure
  _8 l% e% n' w: W   Win32_SystemMemoryResource! p+ E& v& t5 \
  Win32_SystemSlot" j+ r- S) F9 O8 G: B
  Win32_TapeDrive3 M+ x  i; a( F/ ^1 o! ^: @. v# `
  Win32_TemperatureProbe
9 s( D- h6 ~0 J7 g3 P   Win32_UninterruptiblePowerSupply; a" w$ {4 ]; N, I3 F
  Win32_USBController
% `' t$ n% T& G! u   Win32_VideoConfiguration
7 c9 G3 `# A5 b$ w   Win32_VideoController
4 O8 v5 g8 h" V/ N5 z& M  w   Win32_VoltageProbe3 I5 k& `/ Y! _
& y$ a+ ?3 [" V  a7 z2 y9 g! r* Z
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-2 01:18 , Processed in 0.020023 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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