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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)4 Q" i$ h9 D9 Y  {' \

( y1 v& S% J' i4 b1 J- m" b
7 h$ z( M/ Z  v" t$ k--------------------------------------------------------------------------------
! r( W+ D5 m. @5 ?) V! @WMI: Windows Management Instrumentation (Windows 管理工具)
8 C) A- }$ G( d8 E1 s   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 , I7 L' n4 ?- d( F  A7 Q1 T
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。5 s" V+ `/ j5 b  q% b! ~
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
0 q9 x; T2 H! u+ L+ I# S2 W8 w1 S& h1 \  a6 h  ~" w5 w1 q. U' w
--------------------------------------------------------------------------------
1 q  S6 j" k+ _5 a4 Q0 f+ \" G) xBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面! M: \9 o7 X% K" x7 w

8 f8 X# m, K0 p--------------------------------------------------------------------------------" U. R3 z* G0 L- q
① 初始化 COM 接口:
; s  w0 x1 q0 h9 K8 i3 }2 C0 {   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。1 f3 _5 z6 [, u
  这两个函数在 #include <comdef.h> 里面定义。- }  D0 H3 g$ G. n
) e; F) N9 B* t: p7 @, i2 A
② 获取访问 WMI 权限:% S* N7 _& A3 t8 J
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);. H7 j' m# H+ G9 C2 O1 x
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
6 X2 C" w; M* @0 O: b4 B' B: C2 @, ?5 `# O. W- q
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
: r+ w, @- Q* y: Q& m8 e& H% N; N   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
/ \' a5 l4 l8 y# _. d6 g. d  t( b6 h9 U6 L# A
void GetWmiInfo(TStrings *lpList, WideString wsClass)
7 P# s) }, x% j) S1 |{
4 ^8 l1 `5 r) Z9 d  c7 E  IWbemLocator *pWbemLocator = NULL;+ w; r% R# g; S) a( ]7 z- ?
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
: Z4 `: |1 O  P   {4 @& N+ {9 g# A4 m+ O3 B
    IWbemServices *pWbemServices = NULL;
9 l' C/ _" v2 j. b     WideString wsNamespace = (L"root\\cimv2");  ]8 Y- |7 ^: h4 l* {
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)9 ~+ V( S3 Y# F. d; t9 a! N2 [0 Q
     {# `1 t' a7 S% e3 X
       IEnumWbemClassObject *pEnumClassObject = NULL;
7 D8 V# u. L/ {3 J" D' c- h        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;6 p9 N$ {( h( V  I' N
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)3 o. N: c& E0 x8 {; B- O' q
        {
& {' b' e- k" L6 m( D           IWbemClassObject *pClassObject = NULL;
0 l  g3 I/ A. }! f. ]           ULONG uCount = 1, uReturned;
7 S3 o- o: r" ^% s. ]$ V' w           if(pEnumClassObject->Reset() == S_OK)/ _) l. V- Z% H7 p! c( e. M) T
           {
5 t; @3 ?8 R9 q- X: T' E% {              int iEnumIdx = 0;
9 I. h' `* s" G0 s, J+ n' W              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)/ [% {8 l, L; B; q3 _
              {6 q0 a3 d8 x- ~
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");4 ]5 m9 t/ p% q* _9 m
* Z; G% Q6 a; c) _
                SAFEARRAY *pvNames = NULL;
5 N1 N# |. N2 l7 O9 Q# b                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK), |* ^0 }$ Q2 l
                 {
$ l5 ], E  s7 s" _                    long vbl, vbu;
+ M9 I* Y0 M. H/ ~9 e8 S                    SafeArrayGetLBound(pvNames, 1, &vbl);3 G; }/ K/ h6 t3 n2 X
                   SafeArrayGetUBound(pvNames, 1, &vbu);
3 k* o, \, @) N' m                    for(long idx=vbl; idx<=vbu; idx++)1 s; e' U" o  n# d5 S9 u" Z
                    {
- j' _8 ?! f1 ^7 |                       long aidx = idx;7 D. B" ?% X1 {8 L$ f
                      wchar_t *wsName = 0;
, ?( U3 c4 q1 b4 B/ ?# ?. ~5 j/ ]  k! |                       VARIANT vValue;/ N% }3 E! y' R/ Z5 L' j9 K6 K/ X
                      VariantInit(&vValue);! S6 J$ p3 |" ^
                      SafeArrayGetElement(pvNames, &aidx, &wsName);9 i8 e$ m- Y5 g- E2 s

/ F/ U. k& h/ S3 H                       BSTR bs = SysAllocString(wsName);
0 T: ^: a( p8 Z0 f+ s2 ^& D) @; N                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);  o3 d) d5 H& Q
                      SysFreeString(bs);
( ]" u9 [) _( z" `
5 a5 B4 p* s' @% H/ T: p7 x                       if(hRes == S_OK)! p2 ]2 Q2 P+ b$ l
                       {
6 w/ I8 K* o2 q& Y                          AnsiString s;) ?, u9 _) Y% K% h/ Q4 U  J* I+ c* D
                         Variant v = *(Variant*)&vValue;1 i+ {( O9 K3 x
                         if(v.IsArray())7 w# P. Z1 f8 ?4 R
                          {
8 {$ Z9 r  c! l                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)# ~# V8 q( f; C1 D
                             {
0 w* R" p' k1 g. v8 U8 S+ n                                Variant a = v.GetElement(i);6 g- ?) g: u$ m/ e
                               if(!s.IsEmpty())
4 L% p! O, W* K" P* ~                                  s+=", ";
0 f0 {9 d4 W9 v                                s+=VarToStr(a);. a% X7 k: V. Y* S2 w
                             }
& T# K% Q! A7 L- H" b" a6 P4 G7 J. E                           }) p) Z  Y6 D5 G- J0 Z
                         else
6 \5 B' h! h- F' i. E& o! F                           {
! [4 S9 i5 W& F1 c                             s = VarToStr(v);# G, {3 W* \  L/ _$ o- ^
                          }
$ v% i2 u. }" ^0 H, i7 {0 U+ p                          lpList->Add(AnsiString(wsName)+"="+s);, ?$ ?' Q, Y7 j1 R4 H0 {$ d
                       }
0 J- a( r9 p. Q1 x! n* V2 T! ~3 P& s. t
                      VariantClear(&vValue);# J8 N6 d2 a, L  R! I& K( a2 g
                      SysFreeString(wsName);
% E- i) p' R1 P8 b; f. A% t: V                     }% d% E* A5 a: r/ k
                 }9 n  n0 S# M, ?' O( V
                if(pvNames)SafeArrayDestroy(pvNames);1 @, o# p/ W  r( Y" m* p
                iEnumIdx++;
: N* ]) [! |3 Q  k* V+ Q  e               }+ c% }- e1 L$ t: L5 o  z6 X
           }9 ~! B. B& F" g- H
          if(pClassObject)pClassObject->Release();; n. @3 s3 ^! s( ^. S
        }5 d+ y0 X( t' U2 |9 P
       if(pEnumClassObject)pEnumClassObject->Release();/ V+ R- t% Q5 t: O  _5 H1 y
     }2 A# r+ i, b" V6 O, }! y
    if(pWbemServices)pWbemServices->Release();
' ~/ `" z) z" c! N4 y& v   }
# H7 e& O$ i4 ^  if(pWbemLocator)pWbemLocator->Release();
; l, h6 d1 i# L0 I( k}
0 `" C& }0 S5 e* V- h" O//---------------------------------------------------------------------------
, G. D$ T) ^6 S2 h2 u, D; T
7 k: H/ }2 w- s( b// 通过 WIN32_bios 获取 BIOS 信息:
6 p; b3 p: _( I: l6 Avoid __fastcall TForm1::Button1Click(TObject *Sender)9 Y, g$ l" o2 R2 [3 C* F
{. e  C" B7 E8 [6 D
   Memo1->Lines->Add("================== [WIN32_bios] =================");
& ^) M2 F! [1 ]9 y( w/ x    GetWmiInfo(Memo1->Lines, "WIN32_bios");
* G7 @$ k+ j/ Y" a& Z' ]    Memo1->Lines->Add("");
5 |" [$ n, X  x}
- b- c- D0 l- d9 e, x0 Z% b( V) _& s1 d; |$ k. B5 B/ Z
--------------------------------------------------------------------------------
1 L# z( V" x7 t8 u* \
# `1 M* I8 N% \* k4 D. _WMI 可以访问的信息类型有:
$ m, {& w7 T2 E. |- {   Win32_1394Controller
4 }1 c0 S) s+ ^- I   Win32_BaseBoard9 m+ [8 O6 u; u
  Win32_Battery
1 x- s* p" d7 ^. K9 {  _   Win32_BIOS
+ O' i  [; ]* Q9 a) l   Win32_Bus
5 L; t. V" w  q/ X. i9 F! |   Win32_CacheMemory+ [, a2 Q1 m" V$ U7 I
  Win32_CDROMDrive
5 o& G/ r& Y  C9 ~+ B  A   Win32_CurrentProbe+ T8 j% c$ j) ~9 \2 x
  Win32_DesktopMonitor; U! [0 m6 T% w3 H) p: ~
  Win32_DeviceMemoryAddress7 u/ {$ F, I. s! X3 R7 x/ m* v
  Win32_DiskDrive
% d) ]- Y3 W$ H# c0 v   Win32_DisplayConfiguration( x- H5 `1 w4 T7 {4 g
  Win32_DisplayControllerConfiguration6 G. V4 T& b$ _, G! Z5 s
  Win32_DMAChannel
! m) \" Q9 _: @   Win32_Fan3 z4 j5 Q. q5 x- V, e
  Win32_FloppyController; _: J1 W# z* }9 C$ L
  Win32_FloppyDrive  B  z7 S3 A& L; V
  Win32_HeatPipe# p! x5 ~' ~7 B5 X
  Win32_IDEController
/ U2 O- A5 P2 H4 V$ o0 C- r   Win32_InfraredDevice
6 P$ A+ p$ y7 I6 |   Win32_IRQResource: A; n. X8 i0 f7 c0 T& j# r
  Win32_Keyboard* _+ \# Z' i) x$ a" c% ?
  Win32_MemoryArray8 y: R& n  {' U1 u1 Q
  Win32_MemoryDevice7 t+ C& f4 f; y7 P* F6 n( g  W
  Win32_MotherboardDevice
9 D) D# A) F# c+ X+ D   Win32_NetworkAdapter
% D8 L3 m3 v: s$ Q9 v8 C   Win32_NetworkAdapterConfiguration& U$ V+ [+ _6 _! ^9 i3 Z
  Win32_OnBoardDevice
4 o$ S- o) z9 D" ]' H   Win32_ParallelPort
2 ]2 @1 m2 _& f0 a6 L! s   Win32_PCMCIAController+ P, S, W4 k. h9 G+ |3 x3 }& z
  Win32_PhysicalMemory% b$ J( T' G$ D# @' }
  Win32_PhysicalMemoryArray( d- x& p/ P9 g
  Win32_PnPEntity9 n/ G! x' A% {, x& z0 P
  Win32_PointingDevice' m9 a3 N) W5 s2 \3 j" d
  Win32_PortableBattery1 j8 ?2 R4 f: c1 O
  Win32_PortConnector
3 v. ^+ v) |( c1 u. p% R   Win32_PortResource9 w3 ], h- y9 c, D, N1 M- z
  Win32_POTSModem$ J2 ~2 ?6 B0 V( T
  Win32_PowerManagementEvent5 K; u+ H) n( E; D7 |1 L  f5 u
  Win32_Printer
, G! Y3 A8 V/ u6 ^9 ~1 l, Z1 t7 ^# Z   Win32_PrinterConfiguration
) k" H* B; K1 \; s9 \3 U4 l1 Z9 O/ W   Win32_PrintJob4 _# g- s; s& x6 A
  Win32_Processor
0 ~3 o: g5 e% q- s   Win32_Refrigeration
, Q/ |& z/ K& i7 k   Win32_SerialPort
9 t! |2 N3 q2 h; p   Win32_SerialPortConfiguration
, E. c, M, G; g8 w1 n+ J   Win32_SMBIOSMemory3 k' i* |1 q, {- H9 D. T& l5 m
  Win32_SoundDevice9 I7 a0 ~) q% d) W
  Win32_SystemEnclosure9 B0 ], |: J$ B3 |/ H* _- j' C- m
  Win32_SystemMemoryResource  E; {: f% I+ e, c5 e4 E
  Win32_SystemSlot* {! ]% C! C, |; e& f
  Win32_TapeDrive
( b/ T3 K# C( n/ R) a# d' H" l  [+ T6 {   Win32_TemperatureProbe* e7 L# J2 \3 u. E0 L6 K
  Win32_UninterruptiblePowerSupply
4 n$ U9 t8 T9 F   Win32_USBController8 @7 V. [8 O/ |* Z% u& P; s
  Win32_VideoConfiguration2 I1 ]2 i$ Z/ r% i
  Win32_VideoController+ f5 y) l' P( ?
  Win32_VoltageProbe6 o) y; P$ L# S! e7 V; H3 ^
) p+ @. C- l; |- c' g
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-19 00:09 , Processed in 0.018572 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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