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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
+ {; G. f+ {9 T9 c0 f, k
# Z% V# x- O: r3 A
; ?/ V7 |, s& A0 B& ]--------------------------------------------------------------------------------( j& T" Y' }% o! ^& P: I
WMI: Windows Management Instrumentation (Windows 管理工具)  t3 N" b. D8 \
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 6 r$ [" `) y/ V3 I
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
4 q/ M- _1 X$ I6 B$ _1 k   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 & d1 X3 b% C8 `" v$ f5 p  D: }: |2 y
3 ]% G, h3 @$ ~( ]; \$ k8 {. V3 m
--------------------------------------------------------------------------------
. i3 Z& E5 g% nBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
$ G3 Z5 U0 w# r2 c4 h3 C) m
# A6 b/ m  X- ~) n4 h--------------------------------------------------------------------------------" D7 V0 |0 R$ @% m
① 初始化 COM 接口:
" `+ u2 j1 D/ N/ W7 Q9 b9 K3 m. B/ q   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。6 `- T3 }  v. J- c# B! w4 v, b
  这两个函数在 #include <comdef.h> 里面定义。9 E: b( I( S1 r
% d3 H$ Z% Y# b3 b+ F9 d- a
② 获取访问 WMI 权限:
3 n( j- S" ?! x( A* l   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
" C# h" Q, E* O! C& a% v   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
4 ?+ H9 s% D% w! k
# v' s6 y* a7 M! C) J# k9 a. Q5 W: Z③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
; {3 ]# S' k. g   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。; B! P3 j6 m+ N

* x- l0 D/ ?% ]) U) F( q( ]void GetWmiInfo(TStrings *lpList, WideString wsClass)4 Z" o1 l$ I8 e
{
6 N3 z0 J) A/ k! A! z  `. s) m3 g  IWbemLocator *pWbemLocator = NULL;5 l- X. n  y! z1 D5 c( V) [8 R
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
: w3 _2 N# ~2 u* A1 V" u   {
& V) v" _* x9 c' ~) z     IWbemServices *pWbemServices = NULL;
* C$ q9 o( _8 B, v     WideString wsNamespace = (L"root\\cimv2");/ p  B6 j* ~; Z/ |1 }  s5 [: B
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)1 T, B2 ^* x: R/ r" A( [
     {
% `# B$ F) T# p4 s# J3 v  ?  j        IEnumWbemClassObject *pEnumClassObject = NULL;
" Q; U5 C; y5 @) E* g' }% H, a        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
) }2 q7 W+ d- L/ }2 A, ^, g        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
' I& B# L; p2 e8 W0 O( @7 x         {1 c) H9 \9 d4 o
          IWbemClassObject *pClassObject = NULL;
* p4 C& [5 [) R( ^, o. {: o           ULONG uCount = 1, uReturned;% b% r, C/ c* N
          if(pEnumClassObject->Reset() == S_OK)* ~- F9 H+ h- m4 W. }" |* W. R- b- P: _
           {5 q" E5 @! B$ v: z8 g
             int iEnumIdx = 0;
' g2 m  W$ x1 S7 K) }              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
- R( i8 b: x0 c9 G' Y& v               {4 ~8 q# m2 ~) v* F/ o; L, B
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");8 b$ ~& I4 u/ F  O# t/ k1 c
7 i+ _, p, ?. N$ B6 e" ?
                SAFEARRAY *pvNames = NULL;2 B& c& h0 f* v  o, `* F* V5 {
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK). z: Y" ^' P- f+ Q. J7 p$ w
                 {% W$ [- I: J6 J- R$ B
                   long vbl, vbu;
% ^2 l  {- ~, y- C$ F                    SafeArrayGetLBound(pvNames, 1, &vbl);
( L$ q: S& H# q- ?7 H+ ]! g                    SafeArrayGetUBound(pvNames, 1, &vbu);; s  \' F- J$ ~
                   for(long idx=vbl; idx<=vbu; idx++), k8 v8 s* X5 I" Z% y: n" y
                    {
# h5 p6 x+ r  V  c                       long aidx = idx;
9 _5 K* [. l) e6 m$ ?" g                       wchar_t *wsName = 0;: {* D4 O: C9 L# G4 q
                      VARIANT vValue;; p9 M, A7 J: F6 i8 o" L7 r! j" n
                      VariantInit(&vValue);  n% H! N. ]9 u# P5 q
                      SafeArrayGetElement(pvNames, &aidx, &wsName);) s( q+ [5 P2 `# ^5 a
4 t  T% Q+ I5 G$ \: P
                      BSTR bs = SysAllocString(wsName);
; g' T/ ^3 d- Y# k: m# G, s                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);3 o- z$ v2 w* I/ H; C
                      SysFreeString(bs);6 R0 r- q1 H, `9 \$ j9 `: `1 W, g4 r
; a& v# [& n; E( |2 i8 h7 |
                      if(hRes == S_OK)
% s! S! y& ?3 e6 Q" D0 \. Y: w                        {
9 h' O' E" y: k% U# W6 u                          AnsiString s;
2 D+ Y) i, z5 H$ R, w; M                          Variant v = *(Variant*)&vValue;1 h# g$ t6 l. r' O2 g: m( O; o( U
                         if(v.IsArray())& k, r! f. A9 U. z9 M2 `
                          {6 Y( t. F3 X, b
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
& X. c/ s6 l& b                              {
; I; e. k1 W7 G) Z$ e5 l& \0 L                                Variant a = v.GetElement(i);
0 |" P6 |3 w* p6 \- \3 Z# W4 ^                                if(!s.IsEmpty()). \5 g' l, U6 W: X, X+ L0 E
                                 s+=", ";
4 }* D, h* }% h                                s+=VarToStr(a);( N, O" a$ P+ d( u2 j
                             }4 s5 G8 i" _, Q; n% M0 _! i# Z. @' t
                          }
: m! z5 z3 K4 l                          else, ~8 o* L0 E6 i, C1 {2 J# ^
                          {: |( K; _6 V: g9 `6 J- k& L% [, o7 w
                            s = VarToStr(v);
" u6 u2 ]5 n3 R8 G# h3 a                           }& z" m9 N# j! {" V% q' m  E
                         lpList->Add(AnsiString(wsName)+"="+s);
8 A' w# |$ r4 ?) w5 Y4 s$ ]& V                        }
5 D2 s" p6 f, |8 E) q. X- W! W) r& S& H  \* y6 I% Y" _
                      VariantClear(&vValue);/ a2 G4 N- l: ?& g0 X6 E; j  f
                      SysFreeString(wsName);
6 }. l! Q+ \2 K% b                     }
3 e& N; R/ S  X& u/ z                  }
% M& ~9 N9 h6 Z4 p& a1 D                 if(pvNames)SafeArrayDestroy(pvNames);
0 r# u7 }: o* E  m* s( U: `/ H3 Z                 iEnumIdx++;2 Q. k0 G; y# Y5 U) ]' e+ `( t
              }" U0 V2 D% |1 f- X8 z$ q- \! _" L
           }
6 z2 n9 F6 a  ~( J           if(pClassObject)pClassObject->Release();  x5 ?& T) \' D+ g) F
        }+ Z' Y, X* k7 i" y
       if(pEnumClassObject)pEnumClassObject->Release();
0 c! U" [+ H7 `6 o; G: O      }4 e& n' y) j" d. ?! J  d: M
    if(pWbemServices)pWbemServices->Release();
# E  G3 O& T+ ~   }
) z; k+ g3 U" ?- ~9 {  if(pWbemLocator)pWbemLocator->Release();" ?& T% L4 Y2 b2 `  b) Y
}
) l; A  V2 O* P$ Q7 B! q" e# l) X//---------------------------------------------------------------------------
% S1 A; L. W# f, Z: N* J6 U9 F3 h# \* U& B
// 通过 WIN32_bios 获取 BIOS 信息:
! R8 _# Q+ X% j2 W9 R) nvoid __fastcall TForm1::Button1Click(TObject *Sender)4 R" `( o4 Q9 m9 H
{& K; q2 x3 w4 |6 f# t
   Memo1->Lines->Add("================== [WIN32_bios] =================");. K6 {$ j$ W  X+ X
   GetWmiInfo(Memo1->Lines, "WIN32_bios");8 {$ V8 h6 ~5 b# K% A: O$ A
   Memo1->Lines->Add("");
. s- F( a; [; y; Y6 L) p}
6 X9 h. q7 q) q1 g2 v0 \
* `9 z- ~4 W+ h3 {! @$ Z--------------------------------------------------------------------------------/ b0 ]7 C4 y$ w# J2 |$ w

  Y1 e. k% V) Y$ ~7 u& e) a1 tWMI 可以访问的信息类型有:" f. P, L2 P) I- y+ l$ f, }
  Win32_1394Controller3 z& C1 H; l9 u( |+ F8 c4 g
  Win32_BaseBoard  B  D- l* J( z: l) R0 f1 c
  Win32_Battery  o* K5 Y6 i# E/ S* S, T
  Win32_BIOS
3 C* o& }( J6 o7 x+ E9 h" w   Win32_Bus
( y: f  N6 Q( _0 D   Win32_CacheMemory7 e; j% [1 M2 T
  Win32_CDROMDrive
4 `+ g; d/ L: @3 D   Win32_CurrentProbe( J' m% p4 J' V
  Win32_DesktopMonitor$ u9 c1 w. Y0 l; @
  Win32_DeviceMemoryAddress2 _- u2 C0 u5 }$ d
  Win32_DiskDrive6 b, s0 [- v0 x: `! i2 G
  Win32_DisplayConfiguration5 }+ t( D& t7 R7 B! n; z  s& o; P
  Win32_DisplayControllerConfiguration
! y, J7 c% I" `) A- u4 J1 y6 R   Win32_DMAChannel
1 N5 K- ]! }3 v9 e3 l  s   Win32_Fan
$ f6 W9 p& A+ L# l   Win32_FloppyController9 x7 i1 K' z, @+ A  D" q/ t
  Win32_FloppyDrive5 a3 z0 |) d+ [1 I& h  z* o5 ?! ^. m
  Win32_HeatPipe: I/ k) ?8 k1 Q' G
  Win32_IDEController, H# i  x! j7 ~9 }) _3 G
  Win32_InfraredDevice
' j% Y9 p1 o' U& W   Win32_IRQResource! v8 W$ P1 d1 D7 u8 s
  Win32_Keyboard
' M0 h" r/ X- ^$ {. x! P   Win32_MemoryArray1 y1 z! X: y7 S" I6 g& \
  Win32_MemoryDevice
9 n' h* l. x. @- |   Win32_MotherboardDevice( c9 f9 o$ ?) C- X% V
  Win32_NetworkAdapter4 m* x8 A( y! ]- \' o. e
  Win32_NetworkAdapterConfiguration
) w/ q& e) F3 p7 T% u6 A; H   Win32_OnBoardDevice' \/ ?, e/ _/ J% j
  Win32_ParallelPort9 \  J6 g8 U+ i
  Win32_PCMCIAController
2 d1 N# Y$ a7 U* A  r" V8 y# I/ v5 ?   Win32_PhysicalMemory
) H' e9 s* _  s: R5 [   Win32_PhysicalMemoryArray
7 ]( y1 `0 y+ r9 J% }& T   Win32_PnPEntity: E2 k- t7 z& |8 w6 m; D
  Win32_PointingDevice
, F. N$ ~' n! g7 ?8 W0 F   Win32_PortableBattery
# g/ f" `. J7 D# z8 x3 s; b   Win32_PortConnector
' k( T2 v1 \( T   Win32_PortResource
  x8 r& H% F8 f' Q% i! P$ z3 S) ^9 l   Win32_POTSModem
* W; k8 ~& I; M+ V   Win32_PowerManagementEvent
" o9 h7 }, A& K, S   Win32_Printer: u& B) q8 c" S# o' S
  Win32_PrinterConfiguration+ g& x6 R6 e7 m9 E
  Win32_PrintJob
5 p3 w5 p) p3 V+ {; n1 `( X4 k   Win32_Processor
/ u- U1 ~3 U1 h   Win32_Refrigeration: k6 [+ u: t* U7 G! C
  Win32_SerialPort
" L; Z3 @2 d& F" C/ |" N   Win32_SerialPortConfiguration9 w1 Z3 C& Q; w2 e2 H# `
  Win32_SMBIOSMemory
4 V- d. M# k, P; ]7 m* g5 i   Win32_SoundDevice
! U  r  F  x4 F" c0 ]5 T) X! d   Win32_SystemEnclosure; ^$ O- G3 B" M1 j' }) S2 M
  Win32_SystemMemoryResource
, i& s' T* T  }( u7 s2 A, G1 g1 b   Win32_SystemSlot! F# c. p( N. _" p9 |0 c
  Win32_TapeDrive
$ p7 N, V& _* k, ^   Win32_TemperatureProbe
1 r+ v7 Q- p$ S" {1 G: ]   Win32_UninterruptiblePowerSupply
7 M/ W% m7 d* b5 q* |0 i   Win32_USBController
1 w* {, Z$ R0 e8 L   Win32_VideoConfiguration
& M& q, \, Z- s* i- @: u   Win32_VideoController
" I( b0 M& O1 G! b9 s, @* m/ s   Win32_VoltageProbe
" G, y* T# S) F& J/ \, t( U$ A8 u
/ |3 j/ f( Y9 f7 N以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-8 10:43 , Processed in 0.018384 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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