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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)( U& C  g5 x" O1 L* x& a

* b2 D( |9 p: f: D3 j" h' N3 x& J  R; Y
--------------------------------------------------------------------------------
" r: I; @7 A' a# {: gWMI: Windows Management Instrumentation (Windows 管理工具)1 O; r8 q3 R: Z
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
& p3 `1 L( Q2 U( F% o   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
: x# P* l) }& X5 o" E0 w5 r   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 / e3 R  x7 g$ A2 G+ {6 g2 O
! y, {; \- M" e& {
--------------------------------------------------------------------------------  C" A9 ]+ _8 u) ]- U
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面% U' z2 F) y. V; Y* D) O) q

2 J0 I4 r  s' Q9 M: ^--------------------------------------------------------------------------------9 _2 @- K% v/ w( e+ _
① 初始化 COM 接口:' |5 q  T9 L: V
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
* D; u" {8 G) [7 j   这两个函数在 #include <comdef.h> 里面定义。
8 |0 A% S$ `! v' ~* V- ]
& }+ q4 l' n9 m" ], V& o# q0 _* U+ b② 获取访问 WMI 权限:5 }. ]' \4 H' t# v% l4 O/ T
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
2 @! K% q- {% Y' W   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
3 A$ _8 F" j8 Q$ b: o. Z1 l6 m  e7 f+ V2 K4 B% j0 |6 j: s
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
# h2 J, N" R9 ~' `5 l2 [" q% ?* c   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。7 D' s8 c' _7 y) c' ^  i6 Z

, o$ m) z7 N+ ]2 ^  |! E1 T5 k5 ]void GetWmiInfo(TStrings *lpList, WideString wsClass). o9 p9 x/ Q$ H. W6 Q' T
{# \' ^* Z2 u8 l3 D- K1 o: v
  IWbemLocator *pWbemLocator = NULL;% {: b7 S, Z" ]/ t/ ~
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)6 a& w9 @* F# N
  {
; E. v8 [* k& |     IWbemServices *pWbemServices = NULL;0 N# P) z2 U$ k4 p
    WideString wsNamespace = (L"root\\cimv2");& t. N0 C2 h& `9 h6 B8 k
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)- s" d0 z& J+ p+ F+ j; z
     {
+ I. q5 e0 R+ ?3 \$ g        IEnumWbemClassObject *pEnumClassObject = NULL;
* S8 Y3 v7 ?, j1 s: W9 b        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
- x/ q  C- ?7 X, t4 W4 }        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)8 ?. p/ o( l* x7 o7 d* K1 [( m$ ~
        {0 ?7 T, U9 G5 n( G' f
          IWbemClassObject *pClassObject = NULL;) {- S. ]. u" m$ L
          ULONG uCount = 1, uReturned;
0 U+ P4 V. c5 R+ y) D' ^           if(pEnumClassObject->Reset() == S_OK)
4 O3 |2 ~5 E, W+ K            {
% w" [2 j5 A" ~4 J* Z) m1 o              int iEnumIdx = 0;
3 m; ^2 q& J" b+ x              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
  Z5 Q* ?3 B6 A# g( q1 x# R7 }& [- X               {( F# z/ F6 Z: o7 @8 ]. n
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
! n2 ~8 e5 S* f
2 k5 x8 i8 r) Q8 S6 m6 c                 SAFEARRAY *pvNames = NULL;. w9 {6 F+ d0 ]2 d" V
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)% K: s7 T. ^3 b6 f& _; R* ?
                 {
5 O  G4 F5 ^- E  t0 y  L                    long vbl, vbu;
! Z$ ^" V& w* P5 e7 m                    SafeArrayGetLBound(pvNames, 1, &vbl);
7 _# w. Z% D( K- J                    SafeArrayGetUBound(pvNames, 1, &vbu);% O5 L; H$ g' g6 q
                   for(long idx=vbl; idx<=vbu; idx++)
( @! m8 o7 j9 H: w                     {
$ F3 j; {( J: S  |0 ^                       long aidx = idx;
- ~. t0 |" M, A1 F0 ]                       wchar_t *wsName = 0;4 O# {+ W+ K8 O* a* [" x, X
                      VARIANT vValue;# L' N4 c. u6 F8 R( Q) x
                      VariantInit(&vValue);4 I: j8 p4 V8 R6 }! B% |
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
% m5 V( m( A" T+ j( W1 C$ A) v; z7 W4 \7 i
                      BSTR bs = SysAllocString(wsName);
, f5 m' U1 L( }& ~  \# Z                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);# X- `7 ~( z: c. W# R, n0 u
                      SysFreeString(bs);
3 u  k2 K7 A. f* P% S8 x. s/ O% ?' o1 n/ K$ c. y3 T; `* [. W
                      if(hRes == S_OK), J' e/ F0 g1 J1 i% |. I. R: |/ T# o/ R
                       {5 @7 B3 \7 G+ N9 [% l3 i3 ~5 l
                         AnsiString s;% h& M& @0 L0 p: D. Q
                         Variant v = *(Variant*)&vValue;
5 i6 ^6 r0 P9 k1 c+ }) [8 e8 R                          if(v.IsArray())
5 z( i& s$ f9 j; O: d                           {
; M* P" M9 K( V/ |; x. Q  o                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)! s8 R- q+ j+ r1 l; S$ L6 W# q
                             {  @) z, O6 p1 O
                               Variant a = v.GetElement(i);: Y  H3 N* I$ B8 ^! n  `' k5 A( }2 V
                               if(!s.IsEmpty())
7 D' J' _, s5 N  b                                  s+=", ";9 m' D2 p+ s, X% Z+ `
                               s+=VarToStr(a);
5 ?) s' j# v/ U0 G; ]                              }6 p& d( z  C, s! h
                          }+ Q9 C! `+ d/ h* k, s. k% I7 l
                         else& y. W( c; u5 W) n! c
                          {
  t, [+ d  f: l; h) x+ I: s                             s = VarToStr(v);
6 k$ g3 k8 k, W  A( ~                           }
4 k, v% _2 ?; U/ z$ \) M                          lpList->Add(AnsiString(wsName)+"="+s);
# R9 W1 ?+ S0 [& }  K1 }                        }
  W7 j' T0 o2 k' @* F/ I- f; u, m6 z! p) C  O
                      VariantClear(&vValue);
% T, o/ w5 R- t0 A9 M  _                       SysFreeString(wsName);  `, h3 p; l& R
                    }
- J8 Z, T* ~  ?; T% i                  }. s2 V; o2 }# t. a  W8 z4 l
                if(pvNames)SafeArrayDestroy(pvNames);4 y- j5 L! K1 n1 C1 M
                iEnumIdx++;4 r  j1 S! `, X5 o+ B2 h; y
              }
1 M6 l1 v  J/ A: z, P( _8 D' Z            }
: E- S) ]# c6 Y8 S; }0 o           if(pClassObject)pClassObject->Release();
3 l9 J3 A" s+ ?" M: A         }
/ O  |2 a) B; y4 ?) h# M  k6 h        if(pEnumClassObject)pEnumClassObject->Release();
9 ]4 Y# f4 w5 I" C$ I9 k5 Y      }& F! g; J: D: y  E5 a
    if(pWbemServices)pWbemServices->Release();
+ E" R/ m) a0 w+ `. R   }
9 r9 Q7 ?/ O' e. p  if(pWbemLocator)pWbemLocator->Release();
$ e" H0 D! |1 C9 B; @+ g7 w}3 g6 r( g5 [& k. _4 N' F  Q
//---------------------------------------------------------------------------
- [* X, p2 `; ~9 P# u8 c% p6 h- _7 I
1 [- I, D; k  Y# k+ N// 通过 WIN32_bios 获取 BIOS 信息:
8 i7 {* ]& R; rvoid __fastcall TForm1::Button1Click(TObject *Sender)
# b; v: l3 s  r& o& U{5 {9 o0 L. v# n- X% V
   Memo1->Lines->Add("================== [WIN32_bios] =================");- H# }5 _( n% J* @
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
$ |0 U1 {; C' V  \0 K' x    Memo1->Lines->Add("");
  N. T; L, N- g}6 S# P9 o# B+ e- C3 |0 R
: H/ K& {& ~* q. j
--------------------------------------------------------------------------------) }& g% z  a0 m1 |* s, T

" @1 J; K4 i1 E& a3 W8 ]  HWMI 可以访问的信息类型有:1 _/ X) f  o8 h' X0 |" D  j- K7 H9 N
  Win32_1394Controller
5 f3 D4 n# u2 t  E   Win32_BaseBoard1 l* v9 P) `' k1 |) {4 [& R
  Win32_Battery; m0 O+ d7 O6 k+ N! x7 T8 m
  Win32_BIOS
1 e; \+ ]1 s/ t. T4 i- T# a8 ^   Win32_Bus
: `2 s3 L. J  S0 c' K7 W  E   Win32_CacheMemory
! i( Z% p6 p+ ?   Win32_CDROMDrive
9 T# u9 t# `6 z$ d- m   Win32_CurrentProbe
2 V; W) c5 v" R% \8 D   Win32_DesktopMonitor
9 S5 y9 R6 I: V2 u   Win32_DeviceMemoryAddress2 o. ]5 ^0 E7 p" X# P
  Win32_DiskDrive
( Y* e+ ~7 P) P- G& D& g( _   Win32_DisplayConfiguration
& ^# K  O- |! u" Z; V; o   Win32_DisplayControllerConfiguration
0 b, T& J- Q9 G0 n$ ?$ K   Win32_DMAChannel
" ^- {$ n% v6 R: b; ^: c   Win32_Fan: S2 S1 [8 i% X5 s6 |3 k. f
  Win32_FloppyController
, g) [9 s+ [# _   Win32_FloppyDrive( X: G) i% U; I* d) h' w
  Win32_HeatPipe! c7 d. E3 o) g. p7 r( S4 ~0 z
  Win32_IDEController
: h- c- l# p( D1 G# Y   Win32_InfraredDevice
; h! o0 w5 r0 P: C/ `   Win32_IRQResource# F, h  A9 }- S1 X7 i
  Win32_Keyboard
; h) j  ~5 n, [4 Y( h9 F- [) d   Win32_MemoryArray
6 [- L& d3 C6 T* Y" V& o* I   Win32_MemoryDevice4 z! d/ m# B! n2 |/ x$ G
  Win32_MotherboardDevice
# w+ y' W2 p. H# ~; \/ y) V* r   Win32_NetworkAdapter
, O$ y* O+ v3 `; o- Y6 R: }   Win32_NetworkAdapterConfiguration) y5 ]" {6 _+ n3 V5 C# r6 x
  Win32_OnBoardDevice
& c  c$ Z/ d( C6 C4 p- V   Win32_ParallelPort
6 a  ~- P6 I9 z1 g3 U   Win32_PCMCIAController; p% G$ T  G6 Y, A9 o* }; K
  Win32_PhysicalMemory
1 b  @, _* c3 D+ S   Win32_PhysicalMemoryArray
$ O7 `2 Q8 e' \2 R# |8 T   Win32_PnPEntity
: D! _2 p  D. N1 x   Win32_PointingDevice
7 ?9 [8 p5 d% D1 N" I' O) T   Win32_PortableBattery2 g9 w4 [6 b9 L( q; d  G# \5 s; \
  Win32_PortConnector
% `" a, t/ X! _' o7 Q6 G- L   Win32_PortResource, f- K) L$ V. N: M6 T, v/ j0 U2 h
  Win32_POTSModem
" U" s, w$ f8 C9 `9 g: ^   Win32_PowerManagementEvent5 q* s4 \9 b7 w# M
  Win32_Printer% b* T& Y  l* ~# v1 M5 ]
  Win32_PrinterConfiguration8 j* V* T$ e$ t, v
  Win32_PrintJob
1 r. E/ {* J( |! J   Win32_Processor$ ?7 T4 t6 S; z7 |- u9 C4 W
  Win32_Refrigeration3 z0 {7 l6 n. X: `; M+ L+ y
  Win32_SerialPort. S0 \+ X& o4 u8 R: l
  Win32_SerialPortConfiguration
& o: _; R1 w% y7 |   Win32_SMBIOSMemory# {% J5 W1 U1 s4 n. g% F8 h# Y
  Win32_SoundDevice
5 p- C- o8 R' J$ h   Win32_SystemEnclosure
8 ~& m4 X; y2 ?' B   Win32_SystemMemoryResource
2 M1 g# H! I9 k& L6 r7 o( q   Win32_SystemSlot# a- y2 M; G2 p' i& E
  Win32_TapeDrive
. c' s% ]8 p8 X# |% Z6 z, Z   Win32_TemperatureProbe6 p! E, e3 r# i5 c' M5 g, }
  Win32_UninterruptiblePowerSupply( c$ T$ w" W4 [7 |  `
  Win32_USBController* C# v2 W& F9 ^6 M
  Win32_VideoConfiguration" O7 h4 z- p7 C
  Win32_VideoController; z8 o+ \" ]1 C3 G  O* g: y& {
  Win32_VoltageProbe# Q' ~7 d# Z: o7 v0 b

& j( g2 p: ]3 |5 B6 Z6 C% [% z以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-26 19:51 , Processed in 0.022980 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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