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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)) f7 b4 q' b5 ~; P6 ]0 _! Q

8 A! e% D' ~% N5 @2 [; M* D: s6 W) Q' H4 A' n5 L- I
--------------------------------------------------------------------------------3 g. W" Z# a$ T# \
WMI: Windows Management Instrumentation (Windows 管理工具)
3 e" Q" Y  X# u3 Q# |   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 9 H0 B* S4 z& G9 g4 }& [1 s5 S" n) q! I
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。0 X9 e& y1 E1 ~5 e6 Y; j* |
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
' u) l1 V: V4 i, h! _, b7 R0 G7 w$ ~* T2 v
--------------------------------------------------------------------------------
0 M' m/ K# \: A+ u7 U% fBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面4 Q( L/ J& q0 b. T" {7 G% d9 c8 t

5 P- H: K9 J+ f3 y( A: N--------------------------------------------------------------------------------
& d% z8 B2 N) w( E. I. P2 [① 初始化 COM 接口:! ^5 C5 l2 v, h+ m" W+ w0 _1 x
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
% r4 i2 d* I/ r4 `0 V$ R   这两个函数在 #include <comdef.h> 里面定义。) d3 K7 r" f) O' `; N6 w

; i  j. ]1 Z1 L# H/ i6 l- ?② 获取访问 WMI 权限:$ D* E0 w) X" U" h" R
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
8 J/ C4 H" i' g# P, u6 _   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
7 [( c$ f' @$ ?* G; y3 p; c* z- v& ?+ [) r2 }: f( W
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
% t5 l) I/ p) p: I4 d- P+ i* N   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。% d9 \& P4 q1 N# N" I9 {
' N9 F: D7 J# c! V+ R
void GetWmiInfo(TStrings *lpList, WideString wsClass)3 ~7 j1 z$ A# P; P
{
0 m! V9 Q. a0 V* y" I$ O5 j" K2 Y  IWbemLocator *pWbemLocator = NULL;5 N, y3 f; J7 L' b, B
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
) N! X. X% Z8 ]7 X- T5 ?   {
9 _( U* u' C2 X4 P1 v     IWbemServices *pWbemServices = NULL;
5 t" z3 `, |9 @4 o6 @% u0 W     WideString wsNamespace = (L"root\\cimv2");: o* I+ r  e* Y' [6 i# v
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)" Q+ d3 p/ q' E9 \5 }- L/ {, i6 ]
     {6 Y7 J9 U5 ?2 \6 e% H- p
       IEnumWbemClassObject *pEnumClassObject = NULL;
7 I5 @: h. J( g" L3 D% K( C        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
$ x1 h! Z% I' b9 i" Z7 M        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK). b$ M" ^2 o: z% E
        {7 _' ]% a# S0 w, m# R+ i
          IWbemClassObject *pClassObject = NULL;2 x, {6 V$ |, D, M5 L$ L) v
          ULONG uCount = 1, uReturned;
# D( S  B7 ]/ |           if(pEnumClassObject->Reset() == S_OK)
: Q. W3 ~! d4 s0 U- p6 }            {
) v8 V+ f( e3 `! _& z6 H, V              int iEnumIdx = 0;' [1 }% }0 L8 E# W8 Z
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
1 {3 d; ~9 t+ r# ^* K- R               {
# }4 M- L  f/ q6 Y1 |                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
% a  L  W+ B) J6 n; M* _& s' g6 {5 q7 }3 k
                SAFEARRAY *pvNames = NULL;+ B; s! \9 q; ]( s& A4 t  r
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)' P4 ~+ d- P  g! T2 U
                 {3 D7 ^7 @$ q/ }/ x: E" j  g
                   long vbl, vbu;5 U) M- I3 w! n
                   SafeArrayGetLBound(pvNames, 1, &vbl);% e( ]- ?. W! }) A2 o, W! G
                   SafeArrayGetUBound(pvNames, 1, &vbu);- [- c* Z( l( e  r! X% u  k+ U
                   for(long idx=vbl; idx<=vbu; idx++)
& z% ?9 B- [& U                     {# V% X5 K! V8 J- n
                      long aidx = idx;
$ _* z0 l1 c; {: f$ ?) {! e                       wchar_t *wsName = 0;% B! |" H! U. d3 D, _* v
                      VARIANT vValue;% m) U' b; ]2 F0 \
                      VariantInit(&vValue);- E. \  ~# Q+ v4 ^. {4 Z
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
. e% b( g6 W/ `0 U% K" I" u
" v; X) f, v  t" R; t                       BSTR bs = SysAllocString(wsName);
5 r) v* M) E; x  c                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
: S) v* ~4 r/ e4 b, X                       SysFreeString(bs);
7 G1 ?9 ~. m( d; |3 \4 }
$ I# G+ l+ V  b  i                       if(hRes == S_OK)
6 N. P. r! \9 Q7 E+ i/ w                        {  ?* R5 U. Q# C
                         AnsiString s;
& @# f: T7 {0 t6 b. n                          Variant v = *(Variant*)&vValue;
4 _* x1 J2 D4 _) `                          if(v.IsArray())
- X; K7 |4 i" s1 B# M2 Q                           {
! c4 A7 q; R, k& e0 r                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++); t5 q$ W: A" a+ b. o
                             {
9 m* {, s8 j) B# E& S/ l                                Variant a = v.GetElement(i);" m( z! q  e0 B
                               if(!s.IsEmpty())1 A% P/ F/ m6 F: _
                                 s+=", ";
* @. D' d5 C' j* [+ i                                s+=VarToStr(a);
- L' B# V% V6 w                              }
( G6 o* z  U& p: G) T                           }
4 Z' i; g9 m* y6 [' _                          else6 J) ]' B0 z0 C% G
                          {
8 J2 W" T, q0 J6 T' z  i/ v                             s = VarToStr(v);
' W5 ?, d9 S2 n. T& G6 J: ?                           }5 Q: C7 s7 o; F. j6 F7 |& b5 i
                         lpList->Add(AnsiString(wsName)+"="+s);7 h' B0 o* L7 ~$ S! }
                       }% M1 d/ O! N8 t' k
" B' E8 i5 G- `6 u+ P0 ]
                      VariantClear(&vValue);3 ?- {" ?* x$ a% a( B
                      SysFreeString(wsName);$ I$ W; V; c8 q9 E5 D0 z4 T; ~
                    }
2 G5 T- n3 V2 ]# D7 n$ s7 v' K                  }! A% F" V8 H% {) r  S
                if(pvNames)SafeArrayDestroy(pvNames);1 m1 J7 ]5 P+ g; O6 b$ ~
                iEnumIdx++;
6 f; J" z& m& v! G( U               }3 E1 R2 e. Y( C# N; K9 M3 g8 L/ `
           }, |5 N, I& n' l
          if(pClassObject)pClassObject->Release();& k+ v( O; C% m! X( f2 c
        }
1 d  w9 x1 X4 w        if(pEnumClassObject)pEnumClassObject->Release();9 V4 Y) I& P- W: b% T8 w( ]
     }
# s- m. B" }& @# q     if(pWbemServices)pWbemServices->Release();7 j7 m+ z* w2 r
  }
3 p) r3 X, b* H+ p0 h1 e) u- i  if(pWbemLocator)pWbemLocator->Release();: @$ l2 f" T9 h) i
}9 w- K# `  ~3 ], t- C4 |' l4 P4 l
//---------------------------------------------------------------------------
0 u6 g* R* g/ K0 Z
  a0 \) i, i( u+ T) l& L' P- l  e// 通过 WIN32_bios 获取 BIOS 信息:
5 u6 s' S4 t: Y) I- e( xvoid __fastcall TForm1::Button1Click(TObject *Sender)
' V3 n3 T$ n9 O2 e" s{
' @% `( _. n/ `0 N6 B: Y    Memo1->Lines->Add("================== [WIN32_bios] =================");$ j6 n% F  {$ |6 g
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
0 F; F8 [* G; ^% L4 l; M. G    Memo1->Lines->Add("");, N* K& Z( ~* A+ b
}
; v6 L% m8 a" ^9 a2 \) b0 P5 F6 S5 {6 \
" O1 v/ y: ~5 [# C( [. S- J/ B--------------------------------------------------------------------------------5 ]. U* U' f4 H, P1 {' |3 S4 r$ s
0 R$ v/ p7 z1 E) ?
WMI 可以访问的信息类型有:
9 K. S" o0 N; q2 T) q   Win32_1394Controller, N' a" @2 D' r$ ^$ S3 b: R, q
  Win32_BaseBoard9 w) Z# M% G0 f3 F8 B' u
  Win32_Battery& P- q4 C" s' u6 T. Q! K
  Win32_BIOS! ?- r6 {2 K; F( ~& Q" k3 a! g! E
  Win32_Bus
/ `% v3 x+ k: A( P6 B   Win32_CacheMemory% [6 G" o$ A& P' @0 O4 @
  Win32_CDROMDrive
0 i4 g( T& h! i' ^) p$ ?/ V   Win32_CurrentProbe4 H" [3 @- B1 r" H! Q' y8 j
  Win32_DesktopMonitor
5 p: ]3 [% b/ c+ z+ J# A; `   Win32_DeviceMemoryAddress2 [4 h1 s7 G+ K- r; E! S. |+ {
  Win32_DiskDrive
: n+ T8 ~6 {- A8 M" m; Z   Win32_DisplayConfiguration
5 ?1 _& g; t3 Y9 n6 ~5 M* b   Win32_DisplayControllerConfiguration
) f1 {( d" v' ?; K" t- d   Win32_DMAChannel
8 g1 y6 f$ G* @# z& y   Win32_Fan# `) ^; s9 I, n3 A. L9 W
  Win32_FloppyController& O5 D; w, N& Y! U
  Win32_FloppyDrive
9 r/ G7 d# Q$ U+ Q  p: v   Win32_HeatPipe
& Z: _3 F+ g  J: n" c8 |" W   Win32_IDEController
, C2 _8 w5 z. S" _   Win32_InfraredDevice. g6 s% t2 s/ `# S" l: ^4 ^
  Win32_IRQResource
3 W6 T4 Z2 B& O! T4 c8 \   Win32_Keyboard6 m& P3 R% f3 s( Q- I' Z2 l
  Win32_MemoryArray
! P2 {( U, c3 F/ k# o2 {   Win32_MemoryDevice
, f4 e5 W2 H- U9 n   Win32_MotherboardDevice  R6 c2 l7 \7 J  ~) t6 V
  Win32_NetworkAdapter/ e( l/ M# m; u4 z/ f1 u
  Win32_NetworkAdapterConfiguration
, g5 k6 v% u0 c/ `0 v- a9 k# `% _   Win32_OnBoardDevice
% d9 L7 u* `  [4 ~" {   Win32_ParallelPort
0 t+ x  c4 u* b: i   Win32_PCMCIAController  e' c4 z" G, ^. z0 B
  Win32_PhysicalMemory2 _) J' L# D2 `* Z$ b) O5 \( B
  Win32_PhysicalMemoryArray* O& J4 ]& P) @6 w1 R
  Win32_PnPEntity
2 f" c0 X3 |/ ~3 l2 d  B/ z   Win32_PointingDevice
3 @! Q; e/ j; }) ^  f' K' G# r   Win32_PortableBattery
. u7 u) o, T3 Q0 b5 I8 ~( Y  _8 l   Win32_PortConnector
' s1 j4 J$ N8 G, \, P; ~   Win32_PortResource
: q, r4 o3 s2 |! a9 I7 P) T   Win32_POTSModem2 P% x8 v( G  @% h
  Win32_PowerManagementEvent
& E5 q. j4 d. y; G" W  X9 K# ]   Win32_Printer  O& m; x, n- [* p6 C4 v
  Win32_PrinterConfiguration
, F& h+ l- ~2 g% i! A   Win32_PrintJob4 A' S4 K" M5 _
  Win32_Processor. k0 b3 D; [& X/ D8 H$ v: [
  Win32_Refrigeration
* k7 `* j4 ~8 i& Q+ @  R, @; g   Win32_SerialPort
( C6 T. M" q0 P8 X   Win32_SerialPortConfiguration
+ l+ [% m+ Y/ u# o5 b0 Z4 {+ L   Win32_SMBIOSMemory
' R" h: j4 u, Q, R4 {* m2 J$ z" `   Win32_SoundDevice
6 D9 Y1 B; ?' j  A0 `   Win32_SystemEnclosure
7 A" Y; S* h& h5 B* O) Y5 A6 [2 j   Win32_SystemMemoryResource
/ R5 P2 `7 E' i* U; ~- L$ H   Win32_SystemSlot9 N4 H6 L! `( x$ M' j) G. Y
  Win32_TapeDrive
! T7 c4 |, g# K8 J0 t3 o; r5 n   Win32_TemperatureProbe- D  m) u& o( [! l# a
  Win32_UninterruptiblePowerSupply8 @4 t8 m, O9 U! u5 X! _
  Win32_USBController
& ]5 O) W, h. z2 c7 F   Win32_VideoConfiguration( D: [5 A9 c, B& `3 c9 j
  Win32_VideoController
* I2 n9 r1 s$ g% Y5 x   Win32_VoltageProbe/ s" a7 o1 f# l
( {* ~: A( k% V% w+ i
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-29 18:38 , Processed in 0.019473 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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