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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
& ]2 R, J" ?9 z% Q* R% L$ q
, W+ E$ y9 U2 U, c) ^+ G6 M
/ m+ o$ m6 V) ^; \! J- n) r7 e--------------------------------------------------------------------------------
3 c# v3 p. Y/ WWMI: Windows Management Instrumentation (Windows 管理工具)- ]6 O% m  s4 p6 U  u3 X7 ^  ~  t
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。   T/ y( ]: E2 n8 I; v  i
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。! ~7 F- w6 w9 m: S. b2 t# O
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
' t7 Z3 j6 @) z9 t
* K# C: z2 f" W# e7 D+ K9 n--------------------------------------------------------------------------------1 B0 D2 R" i( h" P9 A
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面7 U& H! z  w: B' J

; B2 }; e/ o% p; \--------------------------------------------------------------------------------- R$ t/ d# J1 K- N4 {  f
① 初始化 COM 接口:) c6 \+ E5 X1 ]9 ]( K) U
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。+ K1 m: E7 Y* x9 `& Y& x
  这两个函数在 #include <comdef.h> 里面定义。
+ |4 R/ Z5 T; L' w/ k$ c: t
% D( j1 W2 V( J! h  E) ^② 获取访问 WMI 权限:
" c0 Y+ c5 p( @2 _7 `& L# `   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
9 Y" j2 t6 c( ~1 y4 I( j   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
8 e  j) V4 ]! A1 ~) R8 C4 n/ X$ Z/ R) U. y( T" O2 }
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
. h4 S: H- t) b7 C+ I/ }   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。  c2 ]: ~2 e- E: {' U/ b. g

' {, n1 `/ e' z2 F. W1 E% J, lvoid GetWmiInfo(TStrings *lpList, WideString wsClass)$ J3 p: D! F: \, y0 \8 i
{
0 ]3 Z6 x# i3 e  IWbemLocator *pWbemLocator = NULL;
; M; j+ i* i7 X/ z6 I( S+ h8 K  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)( W) M5 V  a7 C8 x- d
  {
" `. F* w9 T- A3 C     IWbemServices *pWbemServices = NULL;
/ z+ y; t5 @3 q$ j5 k     WideString wsNamespace = (L"root\\cimv2");
- o; U/ Q, ~% r0 }! A     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
. j% n+ h/ ^; _( }# }5 j      {+ I, A  j# s' y- @" t
       IEnumWbemClassObject *pEnumClassObject = NULL;
8 v9 W! J. M7 u- Q' ^        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;, B! J6 f! U# s2 p
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK); v: b& y; J+ p8 z  w; n$ ^5 W8 `
        {
4 R* \5 ^! _9 \  A' N+ ~           IWbemClassObject *pClassObject = NULL;
" e" E0 E3 _" k% t* ]. L; m/ k           ULONG uCount = 1, uReturned;
1 {! Z/ |& m' ^: v; Z           if(pEnumClassObject->Reset() == S_OK), C  }8 _' i' s' x
           {
1 O' l# a* J2 j! J! N* j2 W6 N              int iEnumIdx = 0;
1 d  K( r2 H& W/ g2 T  v2 B              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)9 w. t$ l  ?7 K
              {
( b  s* R- @( U8 F                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
- }6 i6 Z5 e* r  r" T& K
9 x* ?" Q) Q: v+ }( Q1 Y# S% M7 F3 S                 SAFEARRAY *pvNames = NULL;
- d8 K, R. T$ A5 x/ b6 n                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
0 u% d; s  Q/ p, [' L( ~                  {4 l9 _! B! t7 ]; W0 u/ x( Q, S
                   long vbl, vbu;
9 d2 ^2 H. o2 G9 {                    SafeArrayGetLBound(pvNames, 1, &vbl);9 r; I: B1 m3 Y, _- h
                   SafeArrayGetUBound(pvNames, 1, &vbu);% ~8 e. _' y' G6 s. g) S( I4 a
                   for(long idx=vbl; idx<=vbu; idx++)
9 q+ U, ^0 N0 H$ s/ V6 W4 d                     {. s" [" b4 E- P
                      long aidx = idx;# z$ @0 Z0 |$ U% f, l
                      wchar_t *wsName = 0;7 s3 |- K1 k+ e/ `% A
                      VARIANT vValue;
% K1 W# t& C6 W# M7 H; p+ v                       VariantInit(&vValue);' m" Z! [9 Z, d$ ~, E
                      SafeArrayGetElement(pvNames, &aidx, &wsName);1 G" C8 f. U+ F- o2 }
. `/ B  d6 q% b6 _
                      BSTR bs = SysAllocString(wsName);
1 h. s4 J% |3 U# K                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);) ?% m5 \* k4 m7 q* P
                      SysFreeString(bs);
; ^# _3 V: k) }" N2 V' R  i) q( v: ~2 K1 I" N
                      if(hRes == S_OK)
# F3 Z0 l0 R5 L0 ~                        {4 Y2 k+ S+ Y+ r  \% H: [& x7 R
                         AnsiString s;, O9 F1 R7 T6 M8 v5 m- J; M
                         Variant v = *(Variant*)&vValue;
# t# ]9 G8 [! N% m" S" Z& r& `                          if(v.IsArray())4 \: n2 C% n; |% l/ D
                          {
9 D; r* T: w* O9 j- W                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
  j/ }" _1 x6 h! ^# G                              {  p$ W5 @$ ]  `! P9 C  G/ u
                               Variant a = v.GetElement(i);
5 w  \( w* e6 Y6 j, M                                if(!s.IsEmpty())) d( n) v- I# ?  p0 x+ A
                                 s+=", ";
4 Q5 \  ~2 t/ y" ^& Q                                s+=VarToStr(a);
$ u; v1 D- n9 t  V$ o, G9 C4 @! @                              }; l2 t1 H# i$ f5 j* _/ |# k
                          }8 |6 {: m1 w2 V& n) |
                         else  H1 d2 p! k6 `
                          {
/ X" Y" v6 w) k7 q5 D4 h; l, p- l                             s = VarToStr(v);1 |, z/ Y, V" @& Z- ~4 N, F- T
                          }# W0 v4 w4 @* v, k3 M7 b1 s0 {
                         lpList->Add(AnsiString(wsName)+"="+s);
) y& R, O9 c0 R" C                        }3 s: U7 i- C& m- i1 o" O
5 ]- h, x4 _/ g
                      VariantClear(&vValue);* ?. C" j% f/ J6 c  z) @# H$ A
                      SysFreeString(wsName);
6 A' L. g/ I, k, W* h: L                     }' ~3 V, ^. J* E2 m) d$ C7 k7 ]
                 }
* g/ |  b# T4 o( O6 `                 if(pvNames)SafeArrayDestroy(pvNames);
+ j5 I" z: D+ k' Z1 Q                 iEnumIdx++;6 L/ {6 n9 `' W5 t0 K  r3 U2 W
              }
/ S" d( F2 Z$ Q2 \: ]# r; M; D* G. h. E            }
5 R3 v& N" ?' J& \- a3 h           if(pClassObject)pClassObject->Release();
1 o6 ~" D$ q9 p* c0 Q  t         }) h6 E4 p7 Y3 y% b
       if(pEnumClassObject)pEnumClassObject->Release();; C& m3 i* d; w3 P
     }1 W+ x7 `7 h6 m* o( J, G) l; x7 N+ D
    if(pWbemServices)pWbemServices->Release();
; b0 C  U. r# J   }
3 a( x" }2 m: G" _  if(pWbemLocator)pWbemLocator->Release();
& V  F+ d1 }( R% Z}9 v& |4 b4 [1 V& r1 a
//---------------------------------------------------------------------------
3 T  l3 o5 \7 k' u# T) b
' M, C# l: H9 ?8 x7 V$ i// 通过 WIN32_bios 获取 BIOS 信息:
- {4 |( G  O2 Z" q+ @void __fastcall TForm1::Button1Click(TObject *Sender)1 E8 `$ s" \5 m7 d1 C3 \# I, j- ^
{2 r/ t. [: G/ i! W9 u7 z2 w( R$ m
   Memo1->Lines->Add("================== [WIN32_bios] =================");
, w: R0 Z" Z2 ~$ ~1 E) z    GetWmiInfo(Memo1->Lines, "WIN32_bios");8 w' i5 d$ F8 Q
   Memo1->Lines->Add("");
2 l% {8 r1 }0 J" o  @}) g% u  J4 C5 ~9 y4 `3 |
# [4 Q, i0 P7 f$ l3 |0 C
--------------------------------------------------------------------------------
+ N0 a- F; a" l/ u. \8 W- k) T. J* s( [1 k/ K, V
WMI 可以访问的信息类型有:
0 S$ G* V/ b9 Q& v) Z) h* P   Win32_1394Controller
& t6 H  v5 b5 X, P# E   Win32_BaseBoard" }% ~. B6 O( c# I
  Win32_Battery$ A; b0 o/ U! D( m: H& {
  Win32_BIOS
) P1 q- Q6 x0 g$ J, k+ g   Win32_Bus
9 W  S0 T6 J& l( q   Win32_CacheMemory
- G' w5 D3 X+ p5 X   Win32_CDROMDrive
0 f; B& ^1 z8 ]$ M7 f+ U4 c   Win32_CurrentProbe' |$ ]( H/ `. ^
  Win32_DesktopMonitor
4 ^( r# G# S; a7 C) J! e) N2 V) Q   Win32_DeviceMemoryAddress
1 @$ Q3 z7 ^1 p: i# j   Win32_DiskDrive; b! Q  n9 V% Y% K! e# G
  Win32_DisplayConfiguration
$ O9 n6 U( }7 M$ o; }5 J9 ]   Win32_DisplayControllerConfiguration
! @6 a- w- U7 T4 H1 o8 ^7 [. n$ D   Win32_DMAChannel
# B- ]! H( r3 Z- N$ Z   Win32_Fan; I7 R7 L) E5 }# G
  Win32_FloppyController
. F: ^; _$ s( A3 z8 c, V   Win32_FloppyDrive
6 z/ Q( r# O. w# Z% g1 Z( o8 M   Win32_HeatPipe1 b5 p+ \$ [) H: Q0 h1 D
  Win32_IDEController/ f& f0 K* |8 B6 K; T" C( _
  Win32_InfraredDevice
( l8 K$ @1 O. {6 z3 Q9 [   Win32_IRQResource
  p+ ]+ T) b6 l6 v  S4 m0 n  t   Win32_Keyboard
1 ]1 @8 ^& e/ x/ |/ t6 O   Win32_MemoryArray& k; S3 {5 z  Y/ J
  Win32_MemoryDevice8 n; U) j+ o. ]" Y9 I6 q7 t
  Win32_MotherboardDevice. V4 u  b& U, h* u+ s+ q* g
  Win32_NetworkAdapter
8 _: p7 L+ P7 M6 X/ p   Win32_NetworkAdapterConfiguration
. Q5 V  J& L! v  e   Win32_OnBoardDevice! I) t. G# N! ^7 @, U  z( {6 c
  Win32_ParallelPort
  w6 x5 d1 ?) q1 Z3 ]   Win32_PCMCIAController5 `' l2 Y! U6 |$ A* t+ x. i
  Win32_PhysicalMemory/ l3 |" y7 E' I- D+ f) L9 @) L7 ?
  Win32_PhysicalMemoryArray; `2 U# n. q- p- K6 k6 B, s
  Win32_PnPEntity- S" |9 s$ t. A
  Win32_PointingDevice
: y& a, p% L& T' h5 |: v5 }   Win32_PortableBattery7 H; k5 V  k3 z! s7 @+ s) ~& W
  Win32_PortConnector+ M) I1 }3 u5 Z  ?
  Win32_PortResource
. m4 _# }5 \3 ^   Win32_POTSModem) z& h  S* i5 z
  Win32_PowerManagementEvent7 S% \7 J2 I+ A) c: k
  Win32_Printer
5 }3 p% C) ?2 H, j   Win32_PrinterConfiguration
5 o! V# S/ C' \' f/ T! ^4 n, H   Win32_PrintJob  ]  `2 F- H- A' T; t; T$ Y) a. O
  Win32_Processor
& Q, X' L/ T& S$ X1 g   Win32_Refrigeration2 p1 Z% J+ P" }& X6 u2 x( |
  Win32_SerialPort5 p& E% W4 ~( U! A0 Z1 [, Z
  Win32_SerialPortConfiguration- W8 m1 @( g# q7 K4 z
  Win32_SMBIOSMemory
7 N1 `. A4 {, d   Win32_SoundDevice2 O! f' N# @8 T- {1 b6 A/ H
  Win32_SystemEnclosure
  S( s! U/ X" K' s; D   Win32_SystemMemoryResource
) A5 g5 D2 N4 y   Win32_SystemSlot* Q$ i0 Z6 W' o4 t& E) g
  Win32_TapeDrive: v3 B1 m5 ~: y. E, i1 W
  Win32_TemperatureProbe3 e( m* _% h$ R1 _; M0 @) M
  Win32_UninterruptiblePowerSupply
6 o, h+ r1 `. x2 {0 |: p8 \. f   Win32_USBController
. S0 U2 ?- b3 h: d' {5 [& E   Win32_VideoConfiguration: F. P9 w8 H8 B0 ~  U+ _
  Win32_VideoController
" p9 V  ?# c: F. y   Win32_VoltageProbe
! O: }' [7 Y: Y! P" x
1 ^$ e. o( ~: n8 c2 j) P以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-28 13:21 , Processed in 0.021463 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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