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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
3 J& ]7 Q' k' z. m5 \% R* b3 p" R6 `

* [2 n5 a/ `% T: M- U+ {: K: Q--------------------------------------------------------------------------------
  }6 c9 m) T1 R5 g- [1 B0 ]WMI: Windows Management Instrumentation (Windows 管理工具)" Q! C/ T8 |7 L0 }& J
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 + N* A, j9 v4 U: c, u  G
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。, Z* A% O+ d1 F0 \* W) d* D8 H" U
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 3 {& O; u* @( `' g9 A4 l5 u

$ }1 `& k: T# z( _. u: n* A0 S--------------------------------------------------------------------------------
  @$ y6 l  ?) T3 w+ E0 W" z' \3 LBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
1 J) @+ T# a' m) |' r3 E: N  ?* A+ J+ j( B, c6 [8 H
--------------------------------------------------------------------------------4 y" c1 [  S! t- a: K" f  p
① 初始化 COM 接口:
( B5 Z5 @& _7 Y0 Z. b9 Z( Z4 p) t0 v   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
; x4 c* q; K) S   这两个函数在 #include <comdef.h> 里面定义。
; r% W7 t9 V6 _3 q/ Z' K+ P& L9 K( U- [
② 获取访问 WMI 权限:
7 u; r, r. s- T" m   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
& X0 B' V6 e8 x5 w# h   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
  s( U4 f1 x2 g  @2 O
) K9 o: h4 W& S5 \( V7 H③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
1 F. M# k7 H  q1 I   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。. r3 a9 l1 h/ G1 M5 U' z

% j8 a) Z/ `: N1 o9 w9 N; `: Cvoid GetWmiInfo(TStrings *lpList, WideString wsClass)5 B& A/ f; _' k# A
{
5 d3 B+ ~* G; }2 i  IWbemLocator *pWbemLocator = NULL;
3 j8 m! {4 F, B8 f  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)) p' Q  c4 D. R/ T" e) x
  {- d& y! I- p  y; G  Z0 u- }
    IWbemServices *pWbemServices = NULL;
% y& }# I4 Q% k. F- b. j     WideString wsNamespace = (L"root\\cimv2");
8 t/ [1 m2 ^! {7 L     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
1 U. L" Q6 S" r, A: s" v$ j      {
5 }- E) b3 ?* ^0 }0 y1 l        IEnumWbemClassObject *pEnumClassObject = NULL;" C0 W1 T6 t+ Z0 L7 W' a
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
- Q% L8 B" q: j$ J8 q; {/ {( D        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK); Q' Q( e3 b" v" i% S
        {
+ w) n( _4 Z1 N) p           IWbemClassObject *pClassObject = NULL;  `* R" F5 O  P
          ULONG uCount = 1, uReturned;2 h' x& }3 M  p9 h. h
          if(pEnumClassObject->Reset() == S_OK)
' r' \* n5 l: ~( d2 v            {
- M" c6 l. ~& T, R3 L              int iEnumIdx = 0;
  D3 E  K+ b5 _6 V7 P              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)3 i7 O. Y+ ~; v$ G* m: Z* i* A) k
              {
8 g: [7 E  w2 I                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");8 \4 k" V# R) P2 [. N
' v" I) H8 v9 o( o! k4 g% f
                SAFEARRAY *pvNames = NULL;
3 v) m- m. m; S1 J                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)! S& i' y/ a3 k. K9 q
                 {
" N1 Z- Z6 F: Z                    long vbl, vbu;, d8 N: L0 U! G5 a# d# y- L, u
                   SafeArrayGetLBound(pvNames, 1, &vbl);
$ {1 j) @. \) `% ^+ v% N$ h& W                    SafeArrayGetUBound(pvNames, 1, &vbu);
) i1 {8 ]  _) u8 J1 w                    for(long idx=vbl; idx<=vbu; idx++)
! W6 @$ }( p0 _* C# d  _$ F                     {
# j  P/ h8 B: [6 k4 }7 [                       long aidx = idx;) l+ v1 h/ q; ^& @% ]9 ]
                      wchar_t *wsName = 0;
3 G0 m  M% v5 p) m0 I5 O                       VARIANT vValue;
& f9 o; F3 F0 d1 h* g1 ?1 k2 A' S                       VariantInit(&vValue);
* Y7 F# j% R. ^+ d4 Z                       SafeArrayGetElement(pvNames, &aidx, &wsName);
$ v3 F( j) w- I- h7 ?" O& s
# ~+ Y  [1 i) b( Z. H8 N                       BSTR bs = SysAllocString(wsName);
: C% s" v: F) A6 c$ Y                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);. B* J/ O* {1 x
                      SysFreeString(bs);
) F9 _9 |# \  E4 |* u  C, x
  g2 {2 q0 I* Q  I" {0 p; A                       if(hRes == S_OK)1 B- G  b( {0 r) ?- [) \( N! y
                       {
( p' w5 Z0 O5 T# s+ G! p/ v* E                          AnsiString s;
7 }+ L/ t  i! H! V: t3 {+ X4 e/ A                          Variant v = *(Variant*)&vValue;3 L$ V  I6 {8 U9 c- ^: ^' c2 H
                         if(v.IsArray())
( E" g5 r; M* G4 j                           {
, u& w( h7 F0 v9 C* k                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)- U' K# l; b, p# n
                             {
2 F- \( y; e" g9 Q0 v                                Variant a = v.GetElement(i);' w* k- U% r: C) T! C  f1 d
                               if(!s.IsEmpty())
* `2 J. i7 n- `- j8 j! h( A                                  s+=", ";
" i+ n2 d' q$ H( \; V  E                                s+=VarToStr(a);" H$ n! [; x. ^/ c, \
                             }
1 t2 b, e: D8 c7 y5 r# t                           }
1 r( V* ]5 I; E5 x3 A1 u                          else/ ^  t5 _1 I0 {- n% {) |5 D
                          {
) k, Y+ H& n0 E9 w4 ]8 E                             s = VarToStr(v);, D5 W# ~& b; }9 {" U( I5 {: }
                          }
0 v* ^" i! @$ @% ^6 N. t; a% m/ ]                          lpList->Add(AnsiString(wsName)+"="+s);
; Q) N8 R! P: C/ _/ Z                        }
& M' F1 X7 {7 y5 s; Y
( s$ A7 s+ {3 G& c0 d( n% P: z                       VariantClear(&vValue);
3 H' U- Q6 T" m+ n: U" U% E                       SysFreeString(wsName);, I, v+ p2 f; M8 ?# o9 |
                    }
6 ]) g! \9 ?6 p& @$ W5 Y                  }
' R  f- k1 Y# b/ c9 y                 if(pvNames)SafeArrayDestroy(pvNames);
$ N* V  _% v0 k: n1 b                 iEnumIdx++;! |1 b6 c: i6 y2 E- m' w6 ?5 z
              }
! W3 q: W/ g4 o0 X% H8 ~# z            }
& B% e. b( A4 g2 Z% d           if(pClassObject)pClassObject->Release();
; d6 V- x8 a$ Y$ K         }2 q2 K$ [- n& e5 ^  T9 ~: d7 ]7 i
       if(pEnumClassObject)pEnumClassObject->Release();
# ^$ R8 P) W* v  m      }
- ^' U+ t# }9 }- w     if(pWbemServices)pWbemServices->Release();* g( J  J9 I: |/ v9 m
  }& t) B; J* M, q
  if(pWbemLocator)pWbemLocator->Release();+ S6 P9 a' I7 y- N2 X, M
}
$ i8 v5 \& j6 v0 t! S4 h//---------------------------------------------------------------------------
* ?- M6 S: n1 x6 y  y
. y; r! }3 t$ [// 通过 WIN32_bios 获取 BIOS 信息:
1 o* A9 i9 |6 a2 ?3 u) b/ M* ^void __fastcall TForm1::Button1Click(TObject *Sender)7 U4 @6 T9 H- P8 Y* K% Q5 j
{
( o# @' Q8 v: N/ P; f' H4 S    Memo1->Lines->Add("================== [WIN32_bios] =================");6 L5 Z& S0 A2 W$ v" _
   GetWmiInfo(Memo1->Lines, "WIN32_bios");6 m' t* a! y. g0 Z
   Memo1->Lines->Add("");$ W3 O2 c( K; O% w6 s5 D+ G6 ]" T
}" l/ G( A  \, P8 C+ {/ d0 v
5 }  F, E) A) w0 N
--------------------------------------------------------------------------------
& \& H" V" R3 O2 ?( o7 ~% r4 J% g. ?) J: d
WMI 可以访问的信息类型有:. F; A2 l/ V6 R- V! j
  Win32_1394Controller) A: h7 t$ t3 M9 B& U3 a( |
  Win32_BaseBoard6 `, g* ~% t; L! u3 Q+ ~4 ]) M
  Win32_Battery& V* v- ]5 y& M
  Win32_BIOS
1 F% H% O9 S$ o+ M   Win32_Bus/ P- \# Z/ z8 i
  Win32_CacheMemory
) m0 t$ q! X6 K- z1 ?   Win32_CDROMDrive3 s. M! G  c+ c4 X$ y
  Win32_CurrentProbe' @2 F# E0 y0 F( B& r3 P1 s
  Win32_DesktopMonitor, d( f* _- K. b8 S. z. ^
  Win32_DeviceMemoryAddress
! I# O# ]. D. d, @: w3 U   Win32_DiskDrive
) X  q* m+ M; b, ^   Win32_DisplayConfiguration, n! H! n; b2 \8 _' i
  Win32_DisplayControllerConfiguration
% F* ]# m4 @& T! y% T  V   Win32_DMAChannel0 }7 [2 |0 b+ U& D# C
  Win32_Fan
' i+ }4 m+ z7 e! f   Win32_FloppyController
0 c8 ~; O1 b! z$ m' T  p   Win32_FloppyDrive
) ?1 c8 f* G& p5 M* \   Win32_HeatPipe( S5 q8 h' o6 o9 M: Q
  Win32_IDEController% W# `7 _  e) `( \8 W5 x
  Win32_InfraredDevice* R0 f' g8 R7 s9 R; G) g$ N
  Win32_IRQResource/ E! J" k3 u8 u  _9 y7 }# Q
  Win32_Keyboard
3 p% K- F8 ]3 Q" B  b   Win32_MemoryArray% L3 z2 V6 b( f! t
  Win32_MemoryDevice
6 D" B9 }+ f* k$ }4 h- O0 E/ `( S% \   Win32_MotherboardDevice: M. A5 y' U) n2 i7 b, x
  Win32_NetworkAdapter
8 h3 X% S  E* i: L3 s6 U! o   Win32_NetworkAdapterConfiguration
# T3 F+ d2 m+ W   Win32_OnBoardDevice
9 e6 {1 o1 H/ v   Win32_ParallelPort
7 c  F9 }! s8 S, C5 g0 v   Win32_PCMCIAController$ L3 D2 y8 D) E! ]- R* u3 a2 j
  Win32_PhysicalMemory
9 f5 \0 k' k7 K# S3 h   Win32_PhysicalMemoryArray
/ L9 {- W' g8 f   Win32_PnPEntity
: B' R: L& G4 [) `   Win32_PointingDevice
7 X8 l' {. e5 B: Y9 @+ d) r& X; ~: M   Win32_PortableBattery
5 N3 Y# B6 Q( N1 I, \   Win32_PortConnector' s* K1 B- b! b$ u$ q& U$ B4 o; o
  Win32_PortResource/ P2 k7 ^. p: l  z+ a8 M+ l
  Win32_POTSModem# T6 d3 v9 }4 O' ~
  Win32_PowerManagementEvent
. X3 @5 L6 H% o' N/ |2 {   Win32_Printer+ Z, |* E3 L5 ?7 r8 R
  Win32_PrinterConfiguration. n$ \" N6 n) X3 A' M
  Win32_PrintJob& b4 S1 d2 o0 @0 \: f6 Y
  Win32_Processor
4 X! A, o* e! U' A& s2 n) l   Win32_Refrigeration8 p& T! Z* Z# l8 f5 O
  Win32_SerialPort/ z: D; _! \( \( Q+ ?# y
  Win32_SerialPortConfiguration6 P1 M# [! b3 E# B
  Win32_SMBIOSMemory0 c5 j3 c; X3 x$ X/ k6 B
  Win32_SoundDevice0 j3 P9 K  }. u8 b4 K2 ^9 `( i; c
  Win32_SystemEnclosure" G7 u# p0 s" F3 A
  Win32_SystemMemoryResource
2 k  u7 a( H& D. \# q. {( |( A( d   Win32_SystemSlot
/ G" ]& Y/ ^! k0 q5 l6 y- N   Win32_TapeDrive3 z' u; e0 S' ?; b5 p
  Win32_TemperatureProbe+ g5 j. R" P) d5 M4 d; |
  Win32_UninterruptiblePowerSupply+ H( O5 L, q: L
  Win32_USBController
% w- x' z" a" A   Win32_VideoConfiguration6 K9 G/ y& S! w' Y( k3 |+ O
  Win32_VideoController8 K0 Q, W, {4 i5 i  B! u% e
  Win32_VoltageProbe
8 k: E+ l+ g0 D' {2 r2 ~' h9 ^" E2 s  \
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-16 06:30 , Processed in 0.022817 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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