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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)$ x5 F3 \- E# W/ u; o. c; L8 X$ P9 K
* j- Z  C5 n$ ?2 }7 j2 c5 Z8 ]: t

$ g/ I3 T, ]* a, B5 B5 B--------------------------------------------------------------------------------
; E0 S# F& D8 R, B" v$ X, iWMI: Windows Management Instrumentation (Windows 管理工具)3 Y& M1 v8 M8 B0 i: g5 S( y
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 7 L% |1 G! k7 s
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
9 Y' o- b$ F- {, @2 A' ]3 q   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
  A' X6 d5 S6 t0 Y0 M0 C6 r! U5 N  c3 n+ N
--------------------------------------------------------------------------------
7 n, c' ~6 ^# c& t1 I6 m; ~BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面, V3 D  `) W) C6 w

0 `7 q/ Q# g  b# s--------------------------------------------------------------------------------! l: Y/ ?5 \( j% {; H
① 初始化 COM 接口:
6 \" h8 S2 @; P   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。1 w" b% _3 S' _: l; ~9 A, R2 _' s
  这两个函数在 #include <comdef.h> 里面定义。
5 D. X- {( ^2 t3 R: Z$ \5 F! y5 x; o4 W. @, p; E- o  K
② 获取访问 WMI 权限:
" o6 ~( _) ]8 h6 y# W8 t* X8 L   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);' R" v8 y- E# y' e0 l; N' L4 B) x7 ^
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
: k3 g7 i- O/ H$ e) Y5 b$ N1 F
$ l6 i1 \8 w4 I7 x( Z③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
6 y4 h2 n9 |+ [   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。, F9 D7 F6 t) @4 ?
+ `4 v2 K/ b0 A) Y6 D) Q
void GetWmiInfo(TStrings *lpList, WideString wsClass)  z- g* m& z# l; V. g$ `; t
{- {3 p# u7 ~7 `( a
  IWbemLocator *pWbemLocator = NULL;
( S0 y2 Z$ P' o/ }. S  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)' a4 ~, p. S4 R
  {8 r; X* K4 F9 Z- Z
    IWbemServices *pWbemServices = NULL;  j/ ?( G$ s2 D: b
    WideString wsNamespace = (L"root\\cimv2");/ s: Z, i9 |8 `4 v! c" \: ^
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
+ u" f% _8 Y8 l0 q5 N2 I; Q      {
3 I+ U& Z  Z! V' g        IEnumWbemClassObject *pEnumClassObject = NULL;
( [; e4 N% W' v        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;9 L2 X0 R+ M) d9 h+ c/ C1 n2 z
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)0 u0 Z* B  S( [& X. ^0 l
        {& Y3 A, B0 `( z! f: v
          IWbemClassObject *pClassObject = NULL;
2 g  T3 }- m' G) l           ULONG uCount = 1, uReturned;
3 m0 Y5 F; H5 S" d) q           if(pEnumClassObject->Reset() == S_OK)
1 i0 k- Y, C1 J% [% p1 X- d            {! ]9 I* b* y  `2 Z) ?3 _+ k
             int iEnumIdx = 0;7 B7 i$ h: q5 |4 B8 H7 b9 X
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
/ w% B  G: R3 i  m- I; X               {
9 S! D3 z. [: B. K                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
% e7 y7 A/ v. h( w2 |* E" {. a8 Y5 Y
! v! M, p& _; f7 ?6 d3 n4 _0 U5 A; K                 SAFEARRAY *pvNames = NULL;0 q9 f3 G- A& r8 B+ {
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
6 \% `1 f+ e% v4 A                  {4 q( u( k/ H! ~0 V
                   long vbl, vbu;
% v# g! V; A9 _, t5 A                    SafeArrayGetLBound(pvNames, 1, &vbl);% i* s- ]7 R' r9 f  W
                   SafeArrayGetUBound(pvNames, 1, &vbu);; c( q, b* u! O6 y0 v4 s( ~$ t
                   for(long idx=vbl; idx<=vbu; idx++)
- z3 y  X$ |. I6 _0 N                     {& d% S( c9 \* c8 W8 q( B
                      long aidx = idx;
: ]3 `" Y6 r) R- q' Q1 x                       wchar_t *wsName = 0;4 s; k1 V$ N$ x6 x
                      VARIANT vValue;
+ |$ R5 u$ T  W% z% W" K& }9 z                       VariantInit(&vValue);7 U" G0 K5 Y9 f- w+ H0 f, _  i- q
                      SafeArrayGetElement(pvNames, &aidx, &wsName);$ V# G* Q0 z4 ~1 C9 L" T+ C" o# n

1 t, `. B$ C% X* B: |9 |0 h$ P                       BSTR bs = SysAllocString(wsName);9 W5 p: g" W- [- r
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);4 t- b! S! W, ?( g
                      SysFreeString(bs);5 f9 W: i, J0 T: k6 n

; r$ _8 b: M$ p5 J                       if(hRes == S_OK)4 M+ p$ |! w+ Z6 `$ ]5 F
                       {0 ?! ^0 M( K) f6 k: C& S' u$ }& d+ q
                         AnsiString s;
2 E4 M3 p: ?5 S: V3 v                          Variant v = *(Variant*)&vValue;
" T# M; _6 {& L8 m8 I3 K3 @                          if(v.IsArray()); W% |/ S9 p( W- I2 |% \
                          {
; s3 C: ?4 P9 L: v8 Y                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
! z& d: G. N: \  a% A. o6 b$ Q                              {  @) z: }( a# r9 Y  B
                               Variant a = v.GetElement(i);
+ }) A) x5 `( n" m9 U1 V5 I                                if(!s.IsEmpty())
, K8 ^5 x9 C8 y$ q+ [  u. G  J                                  s+=", ";( H# l6 P8 i  M3 P$ F$ y
                               s+=VarToStr(a);
2 V" K* F. G0 L- G                              }
% [. m5 d8 P  K! g# y                           }! ^6 {5 F, I# F* b( t3 ^& c( \
                         else
; p' |6 [) x( f* n0 H) s3 F, l                           {& C& q8 |" N- n, g
                            s = VarToStr(v);. r& R- r* |; D" b& w
                          }/ W+ n: f/ J& I& ]) U8 l
                         lpList->Add(AnsiString(wsName)+"="+s);
5 _& A) h6 l# i5 @& W4 @4 B                        }9 O( q' I8 G. \  s* L) ~
9 B4 D9 ^$ _1 }$ l! v# P* P- F
                      VariantClear(&vValue);
  f0 B1 }0 o/ Z  o( f% v5 \                       SysFreeString(wsName);' J6 |( V* O0 K
                    }; F/ F* P% h- n" L8 u: l$ v5 o
                 }
* U. g, J* x9 C+ p( Y# U. o4 T                 if(pvNames)SafeArrayDestroy(pvNames);% m8 f( V2 _0 f( a) L! a/ Y
                iEnumIdx++;
& t% i! T1 k/ j/ W' V, M- @               }
# o  B9 D( }" W, n5 s% }% q& a5 a            }
" v9 U6 c+ R, t5 C! N5 }           if(pClassObject)pClassObject->Release();
# @2 m! @  }! h  [- O% G         }
% g/ x& t: X4 W) W7 {2 r        if(pEnumClassObject)pEnumClassObject->Release();
# ~8 H/ ^* g3 Y/ ~; p' D- i& j      }' g' |4 J* {' ~1 {1 w
    if(pWbemServices)pWbemServices->Release();. K! ], Y( a( A3 ]
  }! b0 d9 I( p- A& w
  if(pWbemLocator)pWbemLocator->Release();
- I( @0 p. N5 |# [/ h$ d6 M}- A* v/ Q8 G' e0 c& D6 F
//---------------------------------------------------------------------------
# K9 l/ o# P- q9 ^9 K/ _- g- Y
9 E5 R! N4 l8 |  {" ]// 通过 WIN32_bios 获取 BIOS 信息:
# d( k) D6 f5 c: h. T+ Z; x* Gvoid __fastcall TForm1::Button1Click(TObject *Sender)( R/ [' k5 ]# Y2 F9 L% z- }( o
{) O( v! P7 d/ J  S$ p/ R
   Memo1->Lines->Add("================== [WIN32_bios] =================");
% c9 ]2 F% w9 }2 i6 v$ F  D9 \: p9 I    GetWmiInfo(Memo1->Lines, "WIN32_bios");
4 b' v7 T* ^9 P% U1 Y    Memo1->Lines->Add("");* ]7 H# h+ N- G& o+ @
}
! X7 h) n! L6 O" M6 u6 ?+ P& h/ |) p: h$ h
--------------------------------------------------------------------------------! z. @$ u0 E6 Z8 M$ c/ P: M, k
! U( l; s& l. G0 l
WMI 可以访问的信息类型有:8 }% O/ [$ T- z5 g1 |4 L
  Win32_1394Controller
3 ~; p( t. Y9 e3 ]   Win32_BaseBoard
# n6 o$ ^6 i2 B6 W   Win32_Battery
+ Q4 R$ J  v- o% b   Win32_BIOS
, r8 g8 R  ?7 e8 h( b   Win32_Bus
* ~& M  S( V) Z" e8 _   Win32_CacheMemory6 `* Q. c; d0 g5 k; o& P  n
  Win32_CDROMDrive; Z4 c* T7 T  u& v
  Win32_CurrentProbe
  O" @& `9 p7 `& X# n   Win32_DesktopMonitor
0 f8 w" {/ n% A3 J   Win32_DeviceMemoryAddress
8 G2 f# p8 @; [) o. i# [: T' b   Win32_DiskDrive
& i6 t3 B* e  ~   Win32_DisplayConfiguration
) F, d5 p  V% x  Q   Win32_DisplayControllerConfiguration% h: M) R, ]* v( i
  Win32_DMAChannel
/ E0 a5 E$ K) C   Win32_Fan
8 j2 k" I9 ^7 @7 |. o+ Q- P* a   Win32_FloppyController- B% ]9 Z0 G  m% l
  Win32_FloppyDrive
; Y9 l+ m6 h* U' U: @4 U9 M, b   Win32_HeatPipe
( E& ]+ i6 \% W; ~# M9 ~# u   Win32_IDEController
0 ]  L1 e+ |, C- o5 G" _8 x2 z   Win32_InfraredDevice
4 |! j; f5 ?. N2 I( Z" i7 l   Win32_IRQResource- T! B, r$ q$ K9 \
  Win32_Keyboard. k: }3 e7 y5 z" B4 s
  Win32_MemoryArray$ o5 ?3 b" k0 q2 l$ g" U
  Win32_MemoryDevice6 [! Z' t% A* O& F/ I
  Win32_MotherboardDevice0 o. o: r3 f) i
  Win32_NetworkAdapter
; n9 K# `2 X( n3 c- ?+ A; V   Win32_NetworkAdapterConfiguration& M8 J: G0 L3 c; p: }
  Win32_OnBoardDevice6 V; H0 X5 \/ [
  Win32_ParallelPort- V! R' z/ X* R+ B" M4 C( P! w
  Win32_PCMCIAController
* M, z2 _' t; o+ h. }3 R0 x5 F   Win32_PhysicalMemory  A. L3 c- ~2 X$ ?
  Win32_PhysicalMemoryArray
) ]: c% a( n2 z# |. f" i   Win32_PnPEntity
. Z: V3 y2 _  p4 G- M- [; X   Win32_PointingDevice3 v+ C9 m5 ^/ U) _7 o
  Win32_PortableBattery. H# l* m. n) G0 k8 n) [, c" H, ]
  Win32_PortConnector
! w% x" M: z( g   Win32_PortResource
5 \2 ~3 z% N* L3 a/ z   Win32_POTSModem9 _/ T# D: L' R- `1 z  u
  Win32_PowerManagementEvent! y" G" w9 j/ m, ?& Q. [
  Win32_Printer
( H9 b/ |5 R$ s" W! l. I   Win32_PrinterConfiguration: s7 T  f, v+ k: o' r7 j
  Win32_PrintJob
) l% ^% p3 d4 F7 O   Win32_Processor# N" Y5 O. p2 Y7 r
  Win32_Refrigeration
: `; M' q& P2 |   Win32_SerialPort
6 h# `& J$ W1 `0 r- ^; q   Win32_SerialPortConfiguration6 m: h+ {/ D  |- Z3 B
  Win32_SMBIOSMemory8 L* I3 k: v. r
  Win32_SoundDevice7 ^4 n2 p' r) G1 B" _: B7 |7 D
  Win32_SystemEnclosure
% }9 i: J9 l" @  q5 S  A* d   Win32_SystemMemoryResource
5 y: b# |  ?% H8 J4 M) g/ w   Win32_SystemSlot
7 F" P9 L- b& Q6 a( w5 `   Win32_TapeDrive) L8 J4 H* s/ _6 }
  Win32_TemperatureProbe
$ Z+ L% f6 t* P" f   Win32_UninterruptiblePowerSupply/ x, s5 y3 o2 E, r  v' P4 U
  Win32_USBController
4 V. l, I2 t) \! N( T2 @. [   Win32_VideoConfiguration8 C* c% s0 h9 n
  Win32_VideoController
+ `! ^% ?, U' v! L. ]! k, \" m  Q   Win32_VoltageProbe: T/ n1 v1 }1 o( w5 `2 u: E
' L+ w! c( e# {
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-7 07:51 , Processed in 0.017420 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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