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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)1 \4 |) D5 T( U% P- r( F

: d8 {8 t; J) u( o1 H& b7 O
6 w5 }7 [2 Z, m$ W; k--------------------------------------------------------------------------------
5 w1 U) G! B- A( W2 l7 ]WMI: Windows Management Instrumentation (Windows 管理工具)9 y2 A7 J$ W; k0 \/ f/ x
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 : K; E, ~+ a" A
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
2 W; D# h* o) ?# j   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
2 G3 t2 f0 B; Y9 X* ], W1 T, B: Z- Z4 P1 K  M: q3 L6 G* J
--------------------------------------------------------------------------------
& D& X5 z. _3 Y( I# B4 s7 tBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
* K1 ?) V3 ~- I+ y3 |1 F; O" s" v: O$ P- ?9 x0 S+ K
--------------------------------------------------------------------------------  [: C+ Z" J$ [+ X! \6 t! T
① 初始化 COM 接口:
6 p6 I1 p) f% H( S- b6 X9 U; A" Q) d   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。  l1 {" A' x( |& Y: t  D* x
  这两个函数在 #include <comdef.h> 里面定义。! K% x$ Q- U& v+ d! u& y; ]

3 D9 `: c  n0 j: _" J② 获取访问 WMI 权限:
+ w- z; n+ G) I7 N' x0 F   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);( g. J+ a3 w; D, h1 A0 T. p8 m" A
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。+ @# i5 V2 J) _6 i, |

1 ^# o6 s! D: A7 L0 L1 T③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:4 k) X* i( H* x5 @- C: U. r
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
8 Z" L# F0 p6 ~# p
; h  _( `9 S  U' s/ x2 pvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
# {' _5 A' C! g. }) ?3 @{
4 ]0 n$ C( R* R+ _+ v  IWbemLocator *pWbemLocator = NULL;+ F  B6 y' j+ V, `
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)) s3 v# O* B. O& @
  {" F. \, X! e* L
    IWbemServices *pWbemServices = NULL;
5 M; [, Z4 {. h) y# z! M: V     WideString wsNamespace = (L"root\\cimv2");4 H* V, B8 P0 E# z" Y) @2 w
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
- D7 _# N/ @6 H: l# |      {' [, g2 L/ p6 C0 `7 o( n) d9 ~( K
       IEnumWbemClassObject *pEnumClassObject = NULL;$ T# o* ^% E  {$ [+ r% V" z! `
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;7 Z- p1 j; t& D3 r7 C* j- O
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
* o& C  z  q7 t         {7 q% C" K+ Q1 U
          IWbemClassObject *pClassObject = NULL;# j1 h# E' k; B0 c1 q# P. P
          ULONG uCount = 1, uReturned;
0 Y7 Y! E4 `. o# H5 ?! i& r           if(pEnumClassObject->Reset() == S_OK)  `' H  u2 W2 l
           {% \7 n' H% u9 y0 W/ ]2 k
             int iEnumIdx = 0;) K# N+ ~" q2 s4 Y* t7 `
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
5 H" y% x7 C6 p" [/ A0 i               {
$ S  l; B5 ]0 C' }2 N  J+ w                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
+ X$ e4 T3 b8 u5 J- _" c
. H; H% @; A+ R/ C/ `2 o5 J                 SAFEARRAY *pvNames = NULL;
+ X$ Y% c$ Q6 i3 [                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
$ C0 h3 W# ]5 w9 @                  {
3 \0 W  I% V2 e* B* J% v; L                    long vbl, vbu;; n- S) B6 S! X7 h0 A3 A2 _8 V
                   SafeArrayGetLBound(pvNames, 1, &vbl);
. R; y% P( s) b) R! V' G                    SafeArrayGetUBound(pvNames, 1, &vbu);/ q; A$ S# ^6 ^" k/ |( U7 Y
                   for(long idx=vbl; idx<=vbu; idx++)
2 `8 v: T9 a9 [) c# {* `                     {
) S& K1 T8 _' ^9 i& e0 V% |9 v                       long aidx = idx;
* a! A0 G, h. F3 P+ p                       wchar_t *wsName = 0;; X9 y) L& D% x: r1 G
                      VARIANT vValue;' P' c% H& g. r) {/ \
                      VariantInit(&vValue);1 W) f8 O& u- C; t7 B1 }
                      SafeArrayGetElement(pvNames, &aidx, &wsName);  s) L8 T( Z' n6 G! ]
$ L+ \3 E9 z: {
                      BSTR bs = SysAllocString(wsName);
) X  z9 p/ w% {4 n' R+ X4 p                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);) |% t0 D8 u& T" c1 [% d
                      SysFreeString(bs);
7 V# a+ Z0 a2 A  ^: ?: {5 O1 g+ s$ f$ y. q: ?7 U# \
                      if(hRes == S_OK)
. w0 d4 l4 z* y7 T- @( U7 ^2 g                        {6 a. G' N' _: a
                         AnsiString s;
3 V  [* }8 C+ [' ]4 n+ R" k* R                          Variant v = *(Variant*)&vValue;
: L3 }2 [9 M9 X4 R, o* i                          if(v.IsArray())
  b6 @0 c: q, A+ ]- d& w6 `7 q. [) M                           {
$ M0 [- U/ A) |9 i                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
- M1 O3 w1 [, Z$ ^                              {
% w" D! c3 C; r' ?7 }                                Variant a = v.GetElement(i);
8 y4 M2 B; i" M7 u, ]9 U3 O                                if(!s.IsEmpty())) |) g: Z, W8 y6 J  y, F$ A3 |/ \
                                 s+=", ";  @9 J4 s6 z# h
                               s+=VarToStr(a);
3 f! N% ]: f5 u: S, V                              }
& s; ^' t: I- _% s: P* {                           }
7 d  v8 X# M* \+ z6 m! q" h6 r                          else" u* \: ^9 i4 m5 S' V2 Q0 t# m
                          {
9 W% I+ [9 C4 p) |+ X6 |/ V                             s = VarToStr(v);
+ [4 ]: w5 F: |( X/ S+ Y                           }
6 w9 c0 T) A2 w: h7 k  O                          lpList->Add(AnsiString(wsName)+"="+s);
$ m1 S" j8 [2 e. p/ k4 w9 P                        }2 }2 Q1 B/ ~* i

5 l( y) @& \5 M: U+ M9 L5 r2 P2 {# P                       VariantClear(&vValue);8 i: R: q9 C( h+ v: d" |, {( H
                      SysFreeString(wsName);3 J" C2 e* ]2 B) \4 Z0 q# U' z
                    }
# Q! _3 S& t! [6 m0 w                  }
% \6 K# A; k: z- o' G( s                 if(pvNames)SafeArrayDestroy(pvNames);$ V4 {( `" I2 \5 U, B8 G: z
                iEnumIdx++;. f$ o. N# l  ~! F
              }
4 R+ T; X$ c3 Y$ n            }* V$ i. K; D0 E6 _" S. y& x1 f  I, D
          if(pClassObject)pClassObject->Release();( Q3 c* n2 ?" |6 P# M: s
        }
3 W6 X3 X6 z" o3 |/ l6 V, _" L        if(pEnumClassObject)pEnumClassObject->Release();
* ^' c- o0 s- q4 Q      }8 l4 P8 S# Z, m
    if(pWbemServices)pWbemServices->Release();1 B: a6 a, R0 k, `: ]
  }) d: G3 F+ ^, \" P% T3 N% q
  if(pWbemLocator)pWbemLocator->Release();' M4 r0 ~- y+ v& d* e
}
% a2 v; P7 g3 G//---------------------------------------------------------------------------
1 e0 o/ D3 Q! l0 x* z/ B: @- Y6 r$ y
// 通过 WIN32_bios 获取 BIOS 信息:
) M0 C% A/ w6 T: g& }/ S3 H# Qvoid __fastcall TForm1::Button1Click(TObject *Sender)" n+ G1 I( L7 `& _7 x% w
{
$ u1 Q$ {# X5 k7 {+ A    Memo1->Lines->Add("================== [WIN32_bios] =================");
$ f7 Y1 ?; Q& x. r    GetWmiInfo(Memo1->Lines, "WIN32_bios");
; V* y5 X* Y3 M7 F) @2 N# N    Memo1->Lines->Add("");
3 E8 K+ j7 C9 e5 H}. E0 G+ A1 V+ E$ j
- l4 k  w3 B6 \/ T4 h' T
--------------------------------------------------------------------------------+ O7 P+ E. `0 r2 s4 H" K& \0 K
) i- a- R* a) M& g& |
WMI 可以访问的信息类型有:
0 D2 Z3 V0 a6 X  L   Win32_1394Controller: w9 k5 S. {6 j! \1 A9 O! f7 j
  Win32_BaseBoard3 O3 R+ E3 y! k6 [7 y- ]) \; s
  Win32_Battery5 W) v- n# x  n; c
  Win32_BIOS
' ]. G7 t# g: D+ Y0 Q   Win32_Bus' t9 m* v5 [; U! M' \
  Win32_CacheMemory
1 O% ?; F; v& S5 ]2 L   Win32_CDROMDrive/ f# t- ]* p# g5 x$ i+ d' Z( e& C
  Win32_CurrentProbe# [9 A, U" ^  o, d) M# p+ q
  Win32_DesktopMonitor
; m0 g$ `3 F' F+ p8 D   Win32_DeviceMemoryAddress3 s- p, E* v( J' Y7 X3 d
  Win32_DiskDrive5 w; G7 g- I2 z( O) T& P
  Win32_DisplayConfiguration* ^1 U8 ?( h/ s  ^) U
  Win32_DisplayControllerConfiguration
0 ~2 `( l; X, _/ R   Win32_DMAChannel
7 @; S+ _% x7 \' S) G   Win32_Fan
  n: B+ G' Z/ V! m. C8 u- X- Q! R- T   Win32_FloppyController$ A# @4 P+ E- W- W/ W. i+ m( r
  Win32_FloppyDrive, w" o% N. u  }8 S; B% J
  Win32_HeatPipe3 z" W( `( n  K! g- T" X
  Win32_IDEController) C/ {& l3 U! C+ y) K) m# J
  Win32_InfraredDevice
& E2 }8 y( {) [# D   Win32_IRQResource
+ o: x) r5 j5 {! l  c' o   Win32_Keyboard
2 E2 X" a+ T7 ?' l   Win32_MemoryArray: d7 B, v2 F4 }7 @1 h, t+ v+ {% Z2 N
  Win32_MemoryDevice
6 _5 H7 m3 s! l   Win32_MotherboardDevice
" E# V9 Z! v# Y' y+ @   Win32_NetworkAdapter) I; ]" k6 S6 w2 w* A; k
  Win32_NetworkAdapterConfiguration
- W6 b& F* F0 t, \* P- a6 s& n' x) Q   Win32_OnBoardDevice/ A* M4 A; V; ~- e
  Win32_ParallelPort
5 i' z- e& d! w* c- I   Win32_PCMCIAController
, B  t  b  |, l2 E. r/ l8 p( \; f9 Y   Win32_PhysicalMemory
$ N0 L$ _9 U7 Q: v: L9 L' Z   Win32_PhysicalMemoryArray
$ h. _" \/ F+ m  U- x   Win32_PnPEntity
, Q7 i  {5 V) s5 p8 x. _* b) [5 p+ P   Win32_PointingDevice4 O" ?% u0 J6 ]3 {! P& k+ T; y
  Win32_PortableBattery: m- L, `4 y' i% ?5 s
  Win32_PortConnector# i( Q0 D! Q1 i( ~
  Win32_PortResource
; b0 [: {7 T' \# \   Win32_POTSModem2 }/ B/ S/ j2 l( h2 y4 J: O
  Win32_PowerManagementEvent* O/ A5 u/ p6 O2 `0 @1 r
  Win32_Printer
: z, _; M5 l/ C: `: x   Win32_PrinterConfiguration1 x4 b! k6 f0 `1 v
  Win32_PrintJob
- A- t: B$ {0 p$ X$ X9 ?   Win32_Processor
& v3 K' b5 T% P1 g# r8 Y0 ^   Win32_Refrigeration3 E9 s9 g* B& E. y1 s3 \: G; {  K
  Win32_SerialPort8 y/ A* t  b* h+ g* W
  Win32_SerialPortConfiguration2 G) Q. z( @& X2 \' S4 Y
  Win32_SMBIOSMemory0 Y& y# k2 s7 k" A0 R, [! w: d
  Win32_SoundDevice
% Q( F) F6 G. {0 V   Win32_SystemEnclosure. h/ o% U) O6 A1 V
  Win32_SystemMemoryResource
* `$ w* B2 m' f   Win32_SystemSlot$ T  j* h$ X9 G' m
  Win32_TapeDrive
3 E+ T0 I; V! Q; N* [2 x2 S9 S   Win32_TemperatureProbe
' e% l0 ]  L2 j3 p   Win32_UninterruptiblePowerSupply' B( K5 q; _0 z6 ?: o& @5 }
  Win32_USBController
& M5 ^$ Z1 H' d& u  ]   Win32_VideoConfiguration
7 t) W- S/ V& h   Win32_VideoController
, ?" @$ A7 K, X   Win32_VoltageProbe
6 X7 B+ @! ~8 o. g) v% P/ c+ x+ d
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-20 01:15 , Processed in 0.018628 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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