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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)! ?9 C! {. X4 P2 ~) l/ o! ]
$ t. {  P: n  d3 k9 h: T8 ]' b
$ ^' K, m2 R0 r0 Q3 x( F+ ~
--------------------------------------------------------------------------------
- f+ Q! k# `; h% A. x( J3 J  zWMI: Windows Management Instrumentation (Windows 管理工具)  P4 j4 b0 s, T. Q8 V1 ]5 q
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 9 T8 }$ L0 `# {2 e* b1 ]4 ^2 P: d
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
% s" b2 `$ I* I   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
/ L/ K. F' B: @0 z; k  Z: B8 F  n* u6 a6 T# K" ~
--------------------------------------------------------------------------------* t7 _+ O9 c9 ^+ |
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面  i6 h* p! I0 }$ ^
8 T8 c' @* u9 s: B* e
--------------------------------------------------------------------------------
' R; Y: V0 _# Z2 {1 k; S① 初始化 COM 接口:
1 G9 J( f, l5 l. P) @7 |9 G1 j   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
% {4 Q  B8 f# R+ d% N2 f& R5 A( _   这两个函数在 #include <comdef.h> 里面定义。! P/ v, z) {) u# |, \6 y
6 w- c8 ?! U' V+ d2 z  A
② 获取访问 WMI 权限:
0 ]' \  F0 ~# P2 Q. x) P/ P/ n   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);6 m0 \  v- s) H$ z2 K0 o4 B
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。2 z% o% Z, f7 u2 w1 D+ b

% G4 W7 y$ m) A7 a: m③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:* L# D* w% K) V& [& a: Q3 r. Q5 Q
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 ?& Z: A; x- N1 j  y# J
% k. h& ^% K& Y" R3 e# ovoid GetWmiInfo(TStrings *lpList, WideString wsClass)
5 Q; S3 {, X  q  a; H4 h$ R' r{
( N: q% n- F2 L, y  IWbemLocator *pWbemLocator = NULL;
! z5 T+ Q1 L1 K% u2 {. @9 D; b  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 K( b: }; B/ E( z) ?5 N& I   {0 p; u9 V) k* n6 S  V0 o! N  a
    IWbemServices *pWbemServices = NULL;
+ `( P0 J9 `: }% \% D     WideString wsNamespace = (L"root\\cimv2");- A1 @. I6 O" |) w
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
' ^4 g) z* T! |5 N- v6 w% u# M/ D      {
% i1 I" }6 k4 ?% U5 V. K        IEnumWbemClassObject *pEnumClassObject = NULL;
! Q( [; ], V" @6 h        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;5 M* R: S/ B5 b8 O
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
: Q( y4 M* x7 c" X/ n6 q+ X         {
0 ~, ?+ ~: J3 P1 L; W           IWbemClassObject *pClassObject = NULL;
; u  L( A/ D1 ]8 M           ULONG uCount = 1, uReturned;' j! Q) S5 a  m) T  p
          if(pEnumClassObject->Reset() == S_OK)1 x/ k# j9 Q# Y, h. M  J+ b# Y
           {
( [  B8 W# |1 m              int iEnumIdx = 0;- v, l5 Q# B) N. |* r, o" a3 g
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK). C6 n" L. Y! c1 |
              {
* t9 W/ r6 I: e7 I8 f                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
9 _$ W% t' s! |6 o1 K$ v( q. x0 X& o0 Q( S" [) n' V* k% D1 n
                SAFEARRAY *pvNames = NULL;4 s$ L3 c( ]) I, y# o% \+ u8 r0 j- t; b
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)) W3 ~! v! Y, _0 _5 j+ a
                 {
0 A0 }# F* @# M6 H                    long vbl, vbu;
* {1 V/ I8 D% [                    SafeArrayGetLBound(pvNames, 1, &vbl);# V  G2 ?6 H2 t7 M1 c4 D
                   SafeArrayGetUBound(pvNames, 1, &vbu);5 {) n1 n/ N( M! q' {2 h0 e
                   for(long idx=vbl; idx<=vbu; idx++)7 {6 p' w8 H* K+ c
                    {$ _* `# P. O  F- |) T5 Z5 \0 l
                      long aidx = idx;' w$ R, V: n( j9 j/ Y5 ^
                      wchar_t *wsName = 0;# T" {* G0 D- s- U# u
                      VARIANT vValue;
6 q3 i  s' W  `                       VariantInit(&vValue);
6 o% t' P0 o" }( K, E                       SafeArrayGetElement(pvNames, &aidx, &wsName);- X5 t- M: H" r, b$ i( ]1 i8 `" G
: v4 T8 ~) O0 A& ?2 O( b
                      BSTR bs = SysAllocString(wsName);3 Y0 P; V8 B) |$ z$ x" @1 ]
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);8 f" J8 M( k% r5 \" ?8 m
                      SysFreeString(bs);/ n# v  |4 d: r
0 j5 u3 o) e& b( f$ u# m, n
                      if(hRes == S_OK)
5 R* g4 ?& C5 K. B" j8 [* O                        {
1 Y/ i/ O* ?& D, u! L/ |                          AnsiString s;( V, r% w  c9 X; [& x3 q3 x4 c
                         Variant v = *(Variant*)&vValue;5 s# h" @  \  o! K
                         if(v.IsArray())
6 q# \2 N: B% ]' {0 {" t- a                           {
7 ^$ R2 N; w3 a' f$ }                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)' F. q3 k; S' i% M4 \
                             {
% b. x% g& A7 ~: l                                Variant a = v.GetElement(i);
, V5 s0 A7 Q+ n7 r2 A$ d8 v                                if(!s.IsEmpty())
- |: ?- M& X, p                                  s+=", ";3 Q4 B$ I& k9 s5 E. N+ B
                               s+=VarToStr(a);
" e4 T6 O% s3 ~# l- U- O# K  ^  T                              }
) [) z9 \* v  h9 P9 [                           }3 S. ]. H$ t5 \0 r/ k
                         else3 }# j: @1 O/ m* v1 o1 F4 l
                          {% C0 |' I4 m7 k' z0 \
                            s = VarToStr(v);
/ a6 b; V5 U, N7 e; n( N+ P                           }
6 q# G6 Z* M) A                          lpList->Add(AnsiString(wsName)+"="+s);8 \, D+ O# ]& \0 J: m
                       }
4 {+ j# }% g% M( @0 |8 m3 B) \8 Z9 e- b0 M0 a8 H
                      VariantClear(&vValue);
( i5 [$ s8 \, k& |8 p                       SysFreeString(wsName);
- k( ^! V9 Q  I3 |, h* @                     }8 {1 ?8 [  r, l' @; ~
                 }
/ T3 G! I) H. |' O& A                 if(pvNames)SafeArrayDestroy(pvNames);8 D* Q) o/ X1 Q0 ~& Q6 a/ b9 B
                iEnumIdx++;
6 I* h1 X2 h3 F: w* r               }' e7 ~' L4 R" _8 \
           }: M: H2 B5 c/ b3 y
          if(pClassObject)pClassObject->Release();
/ P" h5 Z! R% N: A( M& O         }
2 c8 k7 i5 N; ^  C  s        if(pEnumClassObject)pEnumClassObject->Release();
, J! m# a) B" I0 A7 l3 n      }+ j& ]: ]9 F" E! [
    if(pWbemServices)pWbemServices->Release();
8 i3 J- ?7 f7 p/ ^2 w3 s! A$ S   }
) C, w- p8 E% T( u! Y2 J) i) N7 P  if(pWbemLocator)pWbemLocator->Release();
8 J+ X) G- a% A9 L) Q8 s- F4 X5 n}
! P, U' c# _) ]+ q% S& v2 O//---------------------------------------------------------------------------
  b+ L" v4 z% j* {. V; F, r% W, V. i; ]& Y  K' T  y3 l2 L. l& D- l- }4 l
// 通过 WIN32_bios 获取 BIOS 信息:. {* Y) R9 }5 _. f9 r
void __fastcall TForm1::Button1Click(TObject *Sender)
( p# \& G) f# N9 L{
4 ^- u' Y" A2 Z: P/ T# I& _2 @    Memo1->Lines->Add("================== [WIN32_bios] =================");- Z1 q* ^$ \9 @0 [! v4 M) ^
   GetWmiInfo(Memo1->Lines, "WIN32_bios");; E, @  ^' \8 F: ~; }" S) `
   Memo1->Lines->Add("");
2 |; S7 z% ?) \4 c5 o, l}3 k) N+ y) L; c6 t8 O4 |$ `* Q* V/ F' ?! Y
: r$ ^" j! `5 z; k' U7 f. Q1 n
--------------------------------------------------------------------------------
: C1 l- V& n" h  t% ^
" D* F# l4 ^0 d$ |: U( s, S7 W5 OWMI 可以访问的信息类型有:' f2 q7 ?9 m9 Z
  Win32_1394Controller
. Q& {9 X/ z- U   Win32_BaseBoard- Y. w3 B- ]0 c( t
  Win32_Battery
) U- }1 y, m* Z: ]/ j& o   Win32_BIOS
) N4 d$ s* o" x0 K, h6 I) c; D   Win32_Bus5 Q6 d( z2 B4 s: f3 L
  Win32_CacheMemory
8 ^5 D0 |8 `6 O: O   Win32_CDROMDrive
, P! y* e$ X- x/ k   Win32_CurrentProbe
' F2 V% r( J" ?6 \% H   Win32_DesktopMonitor
: v- ^$ n* j% U2 W   Win32_DeviceMemoryAddress4 E1 S3 S5 c+ h3 R
  Win32_DiskDrive
$ P! O, M. x$ P   Win32_DisplayConfiguration
! Y4 H5 v6 A5 |, z: J. o* o   Win32_DisplayControllerConfiguration) ]8 D: T; \. a
  Win32_DMAChannel
1 X) o; n, b# W2 |( W   Win32_Fan
$ u0 Z6 S* h' C/ J0 C, [   Win32_FloppyController
& L! x/ H. b. z* d4 c' d$ x   Win32_FloppyDrive
! S. o- t" j  a  X; v& s   Win32_HeatPipe% P5 Z9 e2 w7 i1 q. B' `
  Win32_IDEController2 L* a, {$ Q. g
  Win32_InfraredDevice) G) O* u% w5 _
  Win32_IRQResource
9 b8 G& L5 A" P' g   Win32_Keyboard
" r$ R" i: R0 S& d  l   Win32_MemoryArray& V9 N8 g- n5 G
  Win32_MemoryDevice
  Z1 B& S$ i( e# e( C  V6 ~. J8 h   Win32_MotherboardDevice
2 }0 R2 S3 e, y$ Y  p5 }  y5 ^7 o   Win32_NetworkAdapter  g  S5 S% R5 d. {8 t
  Win32_NetworkAdapterConfiguration6 `7 T2 K' ^  E2 K8 Q9 b
  Win32_OnBoardDevice
* T; K! C0 i. G8 i# S! h" s& z   Win32_ParallelPort
. Q' Q" U9 {: d' A% @   Win32_PCMCIAController
- A, W% w0 c  P6 I9 b0 c1 u   Win32_PhysicalMemory6 t9 g  B1 z( d) C. t1 ^5 X4 S+ G" C
  Win32_PhysicalMemoryArray, q/ u6 y# T0 O8 H1 t' d# B
  Win32_PnPEntity
/ h/ H4 y5 I, w+ l. O   Win32_PointingDevice  i$ [8 a  I8 i9 B1 z' Q
  Win32_PortableBattery
* J2 R3 Z6 e  t5 |5 U4 I" G   Win32_PortConnector
/ M5 W9 P! ?+ T. s! G' ]   Win32_PortResource
: @3 b) t! \. L. w% n! Z   Win32_POTSModem. Z) d/ C8 i, U0 f2 v
  Win32_PowerManagementEvent6 Z/ a3 |: X7 V* {( u% T
  Win32_Printer' Y3 Y# o! L$ @1 c) N4 @# O; l$ O
  Win32_PrinterConfiguration7 \9 t5 z: h/ u$ o0 ~6 l" R
  Win32_PrintJob' i7 |- F: y0 C% U
  Win32_Processor; j5 y  r0 _! A% F! H
  Win32_Refrigeration
# x# l1 J0 f# p: }   Win32_SerialPort" a: ^& j" N  |  M( z8 J: p
  Win32_SerialPortConfiguration
& K- q$ d" e6 f/ z6 m, F2 c/ m, q   Win32_SMBIOSMemory5 Q, p* a( _- W6 t1 ?+ U1 e
  Win32_SoundDevice
5 z2 y4 E+ g1 P, n4 `9 F   Win32_SystemEnclosure
  S( w* B4 {" I  @% @' V  a   Win32_SystemMemoryResource) @* m7 i, \# j
  Win32_SystemSlot
9 O6 h' A7 O( m5 h   Win32_TapeDrive
3 Y9 Y' t! ^% h4 p" ?   Win32_TemperatureProbe/ V; r4 p/ s$ H4 {7 j
  Win32_UninterruptiblePowerSupply6 ], r- |2 U; J" F
  Win32_USBController% o& a, `9 r" F9 K
  Win32_VideoConfiguration0 Q# [) f9 E& r- F2 g* V
  Win32_VideoController4 }- _6 x& Q5 l
  Win32_VoltageProbe
3 ^; V# Y0 o& M' b) P& [* k& f0 y  I$ n' @" O( {! E' ?# x: b" w: W0 S, a
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-15 02:40 , Processed in 0.022996 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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