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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)) V: [2 T3 i# w1 C

- C" @& c9 |% a$ h, f  c; ~5 G; z' l$ `9 T
--------------------------------------------------------------------------------
) @3 H; H9 `* m; h5 M6 x9 sWMI: Windows Management Instrumentation (Windows 管理工具)
# e" A9 K4 J! {' Q7 I3 S! D5 K   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 : ^8 k# X! C) X3 E( ^5 u, b/ k4 |
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。# W) v6 n; ]" j! f/ R
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 : V9 T9 a% v# q7 ]7 T" P+ ]  m

5 h$ {& u6 w1 a; x! ^4 V# k--------------------------------------------------------------------------------
. a1 c+ J$ f. j0 ~% cBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
' q) g: g% Z1 p0 a; E5 m8 _% C+ q+ ]3 i. g8 q0 U8 {
--------------------------------------------------------------------------------
" O1 M* m" D2 S2 V) ?5 }: a. I7 V① 初始化 COM 接口:" h* s. q; D; F7 o. G
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
9 Q8 f3 D4 O8 E   这两个函数在 #include <comdef.h> 里面定义。
/ z* C* T) l' f8 _2 u  a, W3 p
4 Z! W. ^0 s7 s4 B* X② 获取访问 WMI 权限:7 m7 `# g' r0 m% L
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);8 K0 @# g  e4 x% l7 X3 i
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
6 W; f7 C1 C+ P# `, y9 r5 h' R8 d7 A/ Q
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
2 N; ~4 [" s6 X+ f8 T/ y$ V   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
! A( D; O! v& ]4 E! n
; n( j& D) \: S- B$ j7 {8 @void GetWmiInfo(TStrings *lpList, WideString wsClass)* L( F( U3 \# g) H* m
{/ A2 C' r5 k9 S% f
  IWbemLocator *pWbemLocator = NULL;
4 R& `; n1 d! R# W  F  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)& d/ ?7 q1 f* m  l
  {+ Q* N3 [. \) ?4 `8 G, j
    IWbemServices *pWbemServices = NULL;
0 l* I/ G6 W6 m2 d; m; G9 O6 y8 u     WideString wsNamespace = (L"root\\cimv2");% c  T8 \& C& m) C; V+ H* r
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
7 g2 R( T' E" t' Y8 Q% a2 R5 z      {
% i+ n, }$ d; H: ^0 a2 ?9 L: k        IEnumWbemClassObject *pEnumClassObject = NULL;2 I' o+ ?. N! s; _. b
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;. d; z* q+ P6 T+ O3 H
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)# I# @8 ^; G; ~' z# }$ {
        {
2 W0 r$ p5 Y& N           IWbemClassObject *pClassObject = NULL;
' G( `" b6 Q* b, L& V( o           ULONG uCount = 1, uReturned;4 U* H9 R& q2 P! y. J$ k
          if(pEnumClassObject->Reset() == S_OK)
; `0 a# a; ~. H! |            {6 b( K6 M! E$ Q* ^6 A& @
             int iEnumIdx = 0;% m) n( ^* K0 V
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)! M* I4 B7 v) w8 h( d8 C& k
              {
- N. ^+ h2 a8 d( T                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");+ c+ R/ y. O; I$ t+ h0 N/ n
9 j! \) ^- G( j! Y/ ?6 w
                SAFEARRAY *pvNames = NULL;; w! N( z  O" t# ~1 k
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
7 H! }2 J- f2 r                  {8 j* h: Y3 U7 H7 O
                   long vbl, vbu;' |$ ?/ @4 e9 _& `! j6 c& j  {" l
                   SafeArrayGetLBound(pvNames, 1, &vbl);: i! _6 _1 {1 s1 f4 J; B+ {
                   SafeArrayGetUBound(pvNames, 1, &vbu);
6 L( W5 [! y. h7 z; D, B5 o                    for(long idx=vbl; idx<=vbu; idx++)
! m$ l% P9 a) H3 e% M. [- `+ f                     {
, Y# Z* l( C3 r5 L3 ]                       long aidx = idx;
" R2 f; ]2 b! x/ X! c+ y' e! {                       wchar_t *wsName = 0;' J' R8 ^0 Q) p, Y) L
                      VARIANT vValue;5 d& y1 p, R9 Q; f! L
                      VariantInit(&vValue);; A0 e  U1 K  Z/ S. T
                      SafeArrayGetElement(pvNames, &aidx, &wsName);% ?; ]. Y' [# {

% ]( @  [7 `5 [/ U- ~4 N5 h+ y                       BSTR bs = SysAllocString(wsName);
3 ^' L$ ^4 `9 ~! y1 @* J# v                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);5 y6 F: D! V$ v
                      SysFreeString(bs);* I/ v5 _, g2 m: s! J, _' ?
  X5 Q0 |# p7 s
                      if(hRes == S_OK)4 ~1 L# W; H, H; s7 `" A  u# U, e8 `9 j
                       {# x, D8 d: e* r! X& W3 J! u
                         AnsiString s;( K2 O4 ^3 }" D4 u
                         Variant v = *(Variant*)&vValue;
* h: M( ?0 ]2 e- s                          if(v.IsArray())% ^- ~1 n( Z$ Y' q, P
                          {' }4 R0 M5 |# k1 s
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
1 y4 V9 h; k2 Y6 a1 V8 }                              {
/ r2 k7 A  q" s8 c+ x* j' h$ m- l) M                                Variant a = v.GetElement(i);
' o, }8 e6 j* T& K) q, O  j$ C, |                                if(!s.IsEmpty())
: \& b5 N- Z. V3 e+ J! T                                  s+=", ";$ u1 o1 K- [/ _' O3 J! k
                               s+=VarToStr(a);: O6 O# G, `( V+ B8 ]
                             }2 b1 n2 O. Y  [- L" j: Y- j
                          }
7 I& n  a" M/ ^6 z6 z                          else
4 u$ j7 U+ l  t; O  x- I                           {
4 H6 R! c2 [. S* O: D9 B                             s = VarToStr(v);
. H4 w# Z, I4 `$ u; D" q$ X8 g                           }
- Q+ t" H- K. M! Z                          lpList->Add(AnsiString(wsName)+"="+s);
. A5 R! [7 O. T, g: J2 \3 o, N) O                        }
. N: S/ }4 B; H# o
) ^/ |, \2 [! ^/ [6 I0 E: ?                       VariantClear(&vValue);
3 l9 v1 z" Q) h                       SysFreeString(wsName);% Z( g" _, J; w3 v: ~
                    }6 ^0 r/ R/ ^# p& M
                 }/ T/ F, G6 A. l* v' L9 ]
                if(pvNames)SafeArrayDestroy(pvNames);& f% c% X$ o1 Q; O; ~
                iEnumIdx++;
% D, L4 b* E/ `9 z: r: Z+ h               }3 \: f, M( d( J2 \$ N
           }
- v4 e; _! p/ I7 {           if(pClassObject)pClassObject->Release();
: r' C7 a* P  u& Z" X, A- l# v* A) C* S         }
; ]0 n0 d# J  G+ L3 g' k8 G        if(pEnumClassObject)pEnumClassObject->Release();
1 I: _  I) Q1 A      }8 H& i+ R9 w) P: V0 ]% e
    if(pWbemServices)pWbemServices->Release();
! A3 C' _4 N0 c5 L  ?  \   }
. V+ m- M: \+ \  if(pWbemLocator)pWbemLocator->Release();
% b1 ~9 s; _9 z) f3 V! O}, V' z0 p3 L! Y  d
//---------------------------------------------------------------------------
$ @& q& D3 P4 a  X) V: u/ |! X( d# t! `; F
// 通过 WIN32_bios 获取 BIOS 信息:, a8 Z! M% x( h0 x! S
void __fastcall TForm1::Button1Click(TObject *Sender)2 w+ J, O% a/ n: Y; D
{
! k1 w: X  a; v" J: ~+ r    Memo1->Lines->Add("================== [WIN32_bios] =================");( o% c8 d& g- {& B. m
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
/ U7 z5 y4 d- a7 F- @0 a' Z3 R    Memo1->Lines->Add("");; G! n( b9 {' E* ^% T# q
}% O) q/ H- c( p3 u8 y- U

2 C# Q2 P1 R( c0 S- Y--------------------------------------------------------------------------------
0 u. Q+ z% X, P) x
4 f: a/ W0 W& _0 GWMI 可以访问的信息类型有:, V( S$ R7 w& L3 ^  o6 r' X8 B4 R
  Win32_1394Controller% h0 z) H) F' J0 C
  Win32_BaseBoard
! ?# K; r2 ~1 f- o   Win32_Battery
# O+ z) f1 u8 e" Y: }; K: V3 m   Win32_BIOS
; D- M* V" i! q. g1 j   Win32_Bus
- k/ D! _9 `6 q/ a" g+ Z   Win32_CacheMemory
3 {3 `9 f- C+ L8 ~% f6 J! _( {8 j+ o   Win32_CDROMDrive
" R) z' Y! ]5 c/ a, L# z0 e+ k   Win32_CurrentProbe
% M' D' u2 n# t. R. g   Win32_DesktopMonitor% a! s! o! }4 n; C
  Win32_DeviceMemoryAddress
9 F. ]+ a  g. d# c1 [+ ^+ j   Win32_DiskDrive
- f3 m3 l$ w1 q2 o2 z* H! i% v   Win32_DisplayConfiguration- r' a: i+ p) J5 b9 j$ q' P+ p* ^/ e$ U
  Win32_DisplayControllerConfiguration
- J" d6 x; d" d3 n   Win32_DMAChannel; k+ T7 ?" F. ]% a) v* r. G0 q5 B
  Win32_Fan7 n7 A$ ~! f8 j! z9 t* ~6 d8 E
  Win32_FloppyController
* g7 H' c! ^# r9 z/ K" H   Win32_FloppyDrive. S( j8 Z- O# ]. F4 y( ^% y6 G
  Win32_HeatPipe: G3 [# ?! s; m9 s. D& W
  Win32_IDEController
; S1 O/ h9 C! [, r1 L3 J   Win32_InfraredDevice" x1 k6 Q# C1 l+ I) l1 z
  Win32_IRQResource
* o2 U" ~- F, [) I9 d   Win32_Keyboard
* ?; m2 n0 x3 B  h" L. h1 \% g   Win32_MemoryArray
9 C4 F# U. @4 K" _" P. q   Win32_MemoryDevice
5 j1 r7 [, W" H; Z# _. w* S% F   Win32_MotherboardDevice7 G! X7 V9 k/ f8 J7 }
  Win32_NetworkAdapter
4 Q- t+ S- q5 o+ q2 ~   Win32_NetworkAdapterConfiguration0 _0 M0 e* w, U9 `
  Win32_OnBoardDevice, \7 [; f$ h- z9 @+ K+ q
  Win32_ParallelPort
# [. ?0 @  U3 X3 ?# z+ z   Win32_PCMCIAController
' Y+ j* ^* D% S5 Q- ^$ ?   Win32_PhysicalMemory
; {$ V# w4 h9 s. P2 Y0 F, q$ ]   Win32_PhysicalMemoryArray' U- X4 W# H% a( n2 S# }& h& j9 |
  Win32_PnPEntity, V% y/ I5 E$ ?. i' y
  Win32_PointingDevice" H/ |$ S8 W& d" n1 H2 Y
  Win32_PortableBattery
6 n  H" [, O# E  V   Win32_PortConnector5 m" |' e0 y6 c8 ~. e. p2 F# Z
  Win32_PortResource" u8 Y# K+ ]4 R  C8 a6 c) ^% H; @
  Win32_POTSModem" q: M0 O5 W! \. H6 M! M. W
  Win32_PowerManagementEvent5 H' Z. ?1 c5 T4 B& W% W! E
  Win32_Printer' b# S2 e* {0 ^; G# q! W6 U- l+ o
  Win32_PrinterConfiguration% e) v, k" i) W, l  ^# U! ^
  Win32_PrintJob
' Y& S$ b# E; q/ W  S* ^7 K, X- q   Win32_Processor+ i- S* E! }% {( p9 m) E; H$ j
  Win32_Refrigeration
% ?4 e9 ~4 j6 W- X" b# e  U+ t   Win32_SerialPort( P) l8 |$ n4 S! d9 _7 h
  Win32_SerialPortConfiguration
; j; L% e- @" T- j   Win32_SMBIOSMemory, Y+ U, G" A2 g3 @: Y+ d
  Win32_SoundDevice3 n0 q! Q- ?9 m% K) @" O5 R
  Win32_SystemEnclosure
: o( J/ ]' K: W, |2 l: n   Win32_SystemMemoryResource) ^1 E9 n% J' a' z& Y0 t
  Win32_SystemSlot
* @0 G7 w/ J, ~   Win32_TapeDrive
) S9 k8 H# j- P- ?: J   Win32_TemperatureProbe
! |& X, H8 c% Q/ X* b7 R9 ~  I   Win32_UninterruptiblePowerSupply
* m# ^7 e. Y8 O# x   Win32_USBController
/ O" P; j, |; I8 R2 o* @   Win32_VideoConfiguration
! L1 e; A6 X/ r' w8 o# i$ ]   Win32_VideoController
6 S6 u  L1 Y4 m- Y   Win32_VoltageProbe. i0 ?+ t6 D7 N: C1 T" e5 U7 V
8 J# ^- Y/ c1 Z5 T
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-11 04:44 , Processed in 0.018468 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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