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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
+ N0 A) \3 A3 E8 m" `
8 T. f, M9 b) y1 e4 k
& ^1 S! s* t. u; c, S4 o--------------------------------------------------------------------------------7 D5 W" p$ x& Q% r! S% Y$ [
WMI: Windows Management Instrumentation (Windows 管理工具)
% Z3 N' d) ?( Y, w   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ! ]$ W, d5 I( Z- z* M- j
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。& B" Z$ f  s! R, |) Y
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
+ c$ o! [+ T  d! N$ j4 x: ^) R. {( @1 ?
--------------------------------------------------------------------------------
! {+ U9 q3 r9 {! g* v$ v! X# S2 uBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面: w2 o3 A* A( j, r

2 ~6 c$ l; C/ M3 P+ B--------------------------------------------------------------------------------
" C% g' c" X8 @+ A6 |① 初始化 COM 接口:* e# b* s+ E) H1 I' Y2 L
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
$ [$ U+ |. t$ N7 _5 y   这两个函数在 #include <comdef.h> 里面定义。
, f6 ~# }, a5 B. B8 G! {1 T! N& E
! ?! |6 C& k' Z1 X② 获取访问 WMI 权限:* V: r) _$ V; F# h9 q( p- v9 }
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);( i6 r4 {: \& b6 |1 l4 S3 l: C  \3 X
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
4 n9 U2 V& b$ a& L" U5 P5 X, \! C8 h, |+ N- L
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:# y  b! X# |8 p2 }
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。4 h# f+ E4 D2 W. _8 n! z" D- E

- c+ K" h  u9 @, X' x7 @+ Jvoid GetWmiInfo(TStrings *lpList, WideString wsClass)$ Y$ l& D+ j/ A
{
; k4 Y* I. K- a* E# L  IWbemLocator *pWbemLocator = NULL;! g  o' F& O- J9 \  T
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
* N; y! M' M/ k9 J   {
% y* f3 O' s: E$ w5 L% m     IWbemServices *pWbemServices = NULL;
0 |! t  B) ^4 q. j" v$ t     WideString wsNamespace = (L"root\\cimv2");( g6 Z5 b# H( u6 L' g) w
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
: |3 [% h; U6 r( e# n- X      {
+ e. b0 `9 m( e* f        IEnumWbemClassObject *pEnumClassObject = NULL;
, e: W' u! ]3 }) |. Y: J4 d        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;5 q4 Z) R7 `; {: M) Z1 ^
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
: q+ {. L, `4 b2 h6 @1 v9 E5 `% ?         {; V& F+ Y% }- O+ s& t! @# r7 ^7 D
          IWbemClassObject *pClassObject = NULL;- ?# Q  [, B8 |/ S, ~
          ULONG uCount = 1, uReturned;
/ h) B6 b( p0 Y9 B. a           if(pEnumClassObject->Reset() == S_OK)
( }8 |! p  g) W4 N6 g$ `* h            {
/ d, ?4 q' S1 j5 t  C3 }              int iEnumIdx = 0;) U- O. M9 @8 H0 i1 c/ N+ Q$ }
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)* S; \: E8 v5 c
              {
+ `/ G; _! T! N4 Y                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
" Y) g) j, b: k6 \) M9 n
6 ?+ U4 [" Z, ?/ L- K; n1 l) b                 SAFEARRAY *pvNames = NULL;
2 Z/ J: q: B  m$ U                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
- P$ d! Z5 T% d4 O, s5 Y0 _# o                  {4 |2 g5 V1 F* f2 a8 M2 F2 Y, Y8 H
                   long vbl, vbu;5 P( X* K( y& _$ z. G; z9 [
                   SafeArrayGetLBound(pvNames, 1, &vbl);% h" x! A" d/ Y; S
                   SafeArrayGetUBound(pvNames, 1, &vbu);- o* c' p' p" P% x
                   for(long idx=vbl; idx<=vbu; idx++)% p  _( d; k7 r4 S6 B8 |- Q
                    {
. T8 B1 [* K5 R. b( {) i! X( C; @                       long aidx = idx;
( K, d, {* \- \+ @) t( s                       wchar_t *wsName = 0;
+ e( B8 k# d& Z+ ?; I! I                       VARIANT vValue;
& }" o4 [' I* U. H$ `) S                       VariantInit(&vValue);
9 r6 C* Y! F) \9 r                       SafeArrayGetElement(pvNames, &aidx, &wsName);
* t8 q, I( F. M+ r' e* a& A  ~$ ]9 Z2 j
                      BSTR bs = SysAllocString(wsName);
: n. _1 b3 F# I  Y9 X                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);8 y6 P2 b. T! [; \! ~
                      SysFreeString(bs);. h8 l: T2 S+ c2 I$ U
% e8 F4 B! F. a$ I: Z/ Q
                      if(hRes == S_OK)
! t6 l) h# d* b; ?+ q3 T                        {
$ f8 h- ?& Q4 t, i                          AnsiString s;
. s7 {8 }4 e& o& d5 h& ~+ a8 G                          Variant v = *(Variant*)&vValue;
# {' f6 |  u- v1 n5 ^2 w3 \8 q                          if(v.IsArray())
6 w9 y. r4 m; T                           {
; L2 J7 T, w  Y: o2 p                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)* B$ O8 U& a# I; A! i+ }# {! h+ o
                             {
; H: ^4 T+ ?# `# V- y& t2 I                                Variant a = v.GetElement(i);
* C& [% k* Z6 C1 D                                if(!s.IsEmpty())9 C$ I$ Q$ |! h+ O" E
                                 s+=", ";. f, i5 J* D" p# Y  e9 {
                               s+=VarToStr(a);
9 k+ s: z3 E2 U) k9 `$ w% G                              }
5 Q6 ^1 P7 z9 r" R. o                           }  ]. Q% Q4 J8 k; p0 A* c
                         else
1 L+ j7 x6 ^5 a" U3 p/ [  I                           {4 c0 A! T5 ^6 a7 Y% h
                            s = VarToStr(v);6 M; @1 u$ X6 x: I
                          }
% N6 P. S) `' G& q                          lpList->Add(AnsiString(wsName)+"="+s);
/ N+ v. s0 k0 N* }                        }
' u4 F% e0 B% U$ l+ m1 Q' Y. N& Z% u9 S1 B% T
                      VariantClear(&vValue);
: f% O% q; }* T& S, f+ W                       SysFreeString(wsName);( N& k8 Z% ^' O1 B
                    }$ u5 Q( r- l. r) s: m( y3 x% ~% ?
                 }
" s' s  j) g# D) t+ e1 b                 if(pvNames)SafeArrayDestroy(pvNames);# [1 T% o/ V/ n# `6 z6 Q
                iEnumIdx++;
; R! }0 u1 X* i% Q" w               }
$ V5 E3 h& K; d1 V0 c            }
, d) p! l3 G1 L, `1 r* y2 l           if(pClassObject)pClassObject->Release();
! U8 [1 N/ k( B: X" \$ b         }* g( @9 q( @1 b4 e$ M. E5 T  \; C
       if(pEnumClassObject)pEnumClassObject->Release();
3 U$ o3 V# R# e- d1 x      }
0 |3 B# M7 Y- I& U7 |     if(pWbemServices)pWbemServices->Release();$ p: O) L; Y5 i
  }
( |3 B& u  c1 x/ W( s# B1 {% I  if(pWbemLocator)pWbemLocator->Release();3 b5 `& S" x) O: e6 L
}
- p9 C  o" f% S//---------------------------------------------------------------------------
  m  ~3 ~. }9 A0 q4 E, T
  ]1 K. r# c+ u+ b; h" _// 通过 WIN32_bios 获取 BIOS 信息:3 j+ V. F) A5 C6 `
void __fastcall TForm1::Button1Click(TObject *Sender)
+ [5 ~4 _, y" U  h1 l$ I. A5 [{
; d. @5 T" }- k# r, N0 W; f, Y    Memo1->Lines->Add("================== [WIN32_bios] =================");
. c* D# ^2 G0 D" K3 S! |" B    GetWmiInfo(Memo1->Lines, "WIN32_bios");
9 j' f$ A; t0 W8 B  Z    Memo1->Lines->Add("");
# T3 h2 l5 B8 ?+ r0 p% M7 i}# h% n) \% A7 z1 M1 p

, L6 K2 \5 ^2 ~; p' a--------------------------------------------------------------------------------
1 [* }; c+ \) O0 v* m, `5 i. z# |1 U7 j/ Y6 _3 t
WMI 可以访问的信息类型有:% ^# n" C  X3 U# O: u6 Z; x
  Win32_1394Controller
- y: p4 c+ P  {$ X   Win32_BaseBoard
; C4 {1 E. }# F3 m   Win32_Battery
6 v9 N/ S, w( O! ]* Q" V$ E8 ~   Win32_BIOS5 c( _) \3 `2 _% B
  Win32_Bus
7 B1 c" l( `6 o' D$ X+ g5 t   Win32_CacheMemory
! ?: C  n- W$ `6 b; C! ?   Win32_CDROMDrive4 `0 K% c) }+ {* m% h7 q$ W
  Win32_CurrentProbe0 I% z/ o/ B" `' r! ]) v
  Win32_DesktopMonitor/ x3 y$ d4 z( g
  Win32_DeviceMemoryAddress
# f) k* Z& n1 D' V   Win32_DiskDrive+ f% G: ^& v9 c5 z: I- Q
  Win32_DisplayConfiguration
) g  E! S8 V+ F3 `: }5 J, W- p   Win32_DisplayControllerConfiguration
% R- R3 |# K+ o5 s, z- v: a   Win32_DMAChannel% B* F7 c( }* k/ F" z
  Win32_Fan
9 x3 |+ B. e% g, B2 C   Win32_FloppyController
6 m9 Q" ]: ^4 q- B   Win32_FloppyDrive
" k) V& I* ~; p$ u   Win32_HeatPipe7 _. Q7 K. X0 G5 ~9 h* Z1 P
  Win32_IDEController
0 }( [( n5 [- |5 e# v   Win32_InfraredDevice  b5 W# Y" F4 P) H
  Win32_IRQResource
( E8 S7 J) l/ K1 e: u2 o   Win32_Keyboard: M" @: c% D) A1 f  O& d
  Win32_MemoryArray( u7 u' o% S; u- e
  Win32_MemoryDevice
$ p; ~- \  o$ u( F( x' w: J4 t   Win32_MotherboardDevice
! A* h9 C6 c$ Y* ]   Win32_NetworkAdapter8 Y- V: T4 o: Y* t
  Win32_NetworkAdapterConfiguration
% o' k" i! t4 K! ^. U& s, O   Win32_OnBoardDevice
3 I8 X2 h3 P0 q6 e. z: o: {   Win32_ParallelPort  Q5 i( [6 `9 G9 ~( H& `
  Win32_PCMCIAController
+ g7 k8 n& ^0 v# {$ X! s   Win32_PhysicalMemory
8 Q- t8 K6 A) ?7 c   Win32_PhysicalMemoryArray. F. u8 Z, L' U& L* Z, o* f
  Win32_PnPEntity
. u" e. X) W+ P( N* k) }   Win32_PointingDevice
) z6 ?* v3 Y* \   Win32_PortableBattery1 O3 p* v7 H. m1 W0 h
  Win32_PortConnector
5 E! u# Z& i* M& z1 s8 ~3 D   Win32_PortResource
/ S0 q; N( r4 y6 y1 H1 m- L   Win32_POTSModem
2 l4 n+ j$ Y+ r) s: T   Win32_PowerManagementEvent
# n$ V3 B+ C; q6 S& T/ C0 V0 p% k   Win32_Printer
5 ]) m; l4 k6 O0 ], y   Win32_PrinterConfiguration+ d) u. E( ^7 T
  Win32_PrintJob! x  p# M$ ?* j' k8 c$ c( m
  Win32_Processor; y. l  G4 S# f$ v$ f
  Win32_Refrigeration: a, b; _. j' a) B5 ]1 q. L
  Win32_SerialPort9 E# w% }' k3 U8 \
  Win32_SerialPortConfiguration
; R" ]0 m6 X' {' @   Win32_SMBIOSMemory7 y5 n# g- i" a
  Win32_SoundDevice
1 N- l" D! `) J1 ~; P2 \, a   Win32_SystemEnclosure7 c7 G1 Z3 w  X$ a3 f+ a" }* @- e
  Win32_SystemMemoryResource4 o$ I  O8 ?3 z7 a
  Win32_SystemSlot' M0 w+ S$ z2 z
  Win32_TapeDrive9 `# |% R% L8 t1 j' {4 l9 z
  Win32_TemperatureProbe4 ~" j. h( b/ F
  Win32_UninterruptiblePowerSupply8 S# k9 |" e8 _$ s
  Win32_USBController. [; s1 ^  r7 @+ G) J$ }
  Win32_VideoConfiguration2 |& U, G/ L3 }  O5 i4 ~: V" c
  Win32_VideoController) E% M$ z4 t& o* _0 w% v
  Win32_VoltageProbe! c: s; f5 U: q1 J8 F1 f
8 p+ c% d: G2 n! o$ A! u/ U3 h: o6 r2 Q
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-26 06:22 , Processed in 0.018667 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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