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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
( p& K& P0 G( a. o1 a. b
# |2 }5 x$ Y- R% Q7 b" d3 C& \+ Q( W7 V
--------------------------------------------------------------------------------
4 }  a8 ~+ P9 D7 ]& W% lWMI: Windows Management Instrumentation (Windows 管理工具)
) ?+ l1 ^- e* b4 ~$ c   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
4 k- g! \0 x5 T5 _1 O   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
* B2 j$ i0 u6 g) A   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ) [  F) e3 j9 q5 r- z3 b3 M

4 ~* {8 e/ K! g) t  i--------------------------------------------------------------------------------
1 j% D3 a  e0 P# s0 k- \BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面" M) [& G* C9 {9 N. C

. V8 n- x1 I" G6 e--------------------------------------------------------------------------------+ O" j  s, }/ e0 U+ H
① 初始化 COM 接口:6 S) \0 n0 I% ?. ~" l) s
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。" h2 B7 L% |4 a# U+ `; \
  这两个函数在 #include <comdef.h> 里面定义。
. c5 L! H- D  n- ]2 M
. l2 d9 f4 J0 ~' b- q  C② 获取访问 WMI 权限:" Y0 {9 r* u$ m( P) z
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);2 l2 Z* d( f" j# E
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。& }5 ^- t; Z6 A3 U! B% c
$ z6 {  n; I1 C$ S* _+ X7 J9 S
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
$ |. {! R/ R2 T/ A6 ?   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
2 c9 T  ?) _& U8 o
: T$ E7 s# j& E; h& U( J1 Yvoid GetWmiInfo(TStrings *lpList, WideString wsClass): l6 a( Q; \$ G: g8 b
{
2 N- S, G. n% w9 _  IWbemLocator *pWbemLocator = NULL;
0 t6 U( P4 Z0 T4 t  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
2 C$ i% N  u: q/ v; z; E   {, S7 u! W4 P( {$ c- m5 s
    IWbemServices *pWbemServices = NULL;! r: P3 T" `: G/ m( J/ M
    WideString wsNamespace = (L"root\\cimv2");
) R) l8 f1 w, _( W& ]7 D! w     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)" s" y, a4 @, I: V* f
     {5 d, b; T3 s$ y+ X
       IEnumWbemClassObject *pEnumClassObject = NULL;9 K$ r" z8 L7 ^+ L; H
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;8 L" ~" Q  n0 B$ s/ R' [8 A( Y
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
' C& _# U" l7 z2 ?: J' L         {
" K- T! ]& \: H% j: ?. ~' i           IWbemClassObject *pClassObject = NULL;
( R3 f2 N* x9 W           ULONG uCount = 1, uReturned;
' e8 u" m6 Q% k  ]: y& L           if(pEnumClassObject->Reset() == S_OK)% d2 x7 Z# |- o$ X! E8 H& G
           {
2 u+ J' J2 g$ g& e! \$ x              int iEnumIdx = 0;- x, |0 z( ~3 E, n$ S2 H
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
6 ?1 r' h! r7 ^$ r# ~8 a1 X2 X6 w               {; j1 ^6 g  i3 _+ W1 O
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
" A/ ^6 l: [8 ?# ?  b1 C/ k- I, w
$ ^/ e  [$ T  }& H; j6 I                 SAFEARRAY *pvNames = NULL;- ]7 [$ t6 Y* `: o, X
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
' z" \& N" |( A$ I; p: N7 Z                  {% J& ~; y5 B' f7 F/ G* |' _$ t
                   long vbl, vbu;  o6 i1 e0 b* m1 d
                   SafeArrayGetLBound(pvNames, 1, &vbl);
9 s& [) V, T9 ~2 \# Z+ u                    SafeArrayGetUBound(pvNames, 1, &vbu);
) G5 p, `6 D9 r9 U& F                    for(long idx=vbl; idx<=vbu; idx++)
3 p2 {1 M; A+ w& L                     {3 |0 k3 S1 g7 U$ Z4 Y
                      long aidx = idx;6 y, ]6 T! r7 R+ j8 C
                      wchar_t *wsName = 0;) V: F; d; E( |3 f
                      VARIANT vValue;
) @5 Y% }  @: Z9 v& M0 `0 F                       VariantInit(&vValue);
/ M0 ^  G0 B6 S                       SafeArrayGetElement(pvNames, &aidx, &wsName);
* Q; V% h. O( l6 ^) `" y
! C- o% v8 d0 q0 U                       BSTR bs = SysAllocString(wsName);4 ?- x0 d2 K+ i
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);1 t: j/ M; W! m8 d, [* y
                      SysFreeString(bs);# K+ H, e. s0 h! C& T

  Z7 m6 D+ Y9 ^& Q                       if(hRes == S_OK)
2 ^+ F5 F, K: H3 I  F3 `                        {
  b4 v5 R! k  v+ ?                          AnsiString s;
$ M! B( w; j: H# o$ f                          Variant v = *(Variant*)&vValue;
# L& Z" H  c4 P                          if(v.IsArray())1 {  B# E1 P) K! N- \
                          {- _- M- O9 J/ M0 r" ?0 [" N
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
4 ~/ D2 ~. b( W" r- \/ v' K0 N                              {
( T3 q5 P" U) {2 V& F, X0 g                                Variant a = v.GetElement(i);; X- m# X* S, ]( a& ]
                               if(!s.IsEmpty())) w* o) r& h1 I& X- }
                                 s+=", ";7 Y* U4 |: z# P  i  D: t7 H
                               s+=VarToStr(a);% s+ ~( X# Y' k( b% J
                             }7 |. t$ P5 A; f. ]
                          }, D6 a, J/ m  q- J6 E! p
                         else
" W' C; z; a1 T+ k; U$ W! T                           {
- s- q# u' f. L! V& n6 ]                             s = VarToStr(v);; D" z0 t, h* y0 {: q2 u& P
                          }4 B0 Y9 l& B+ G2 v" }8 r3 G
                         lpList->Add(AnsiString(wsName)+"="+s);
5 F! W( M  r0 `+ ]2 r                        }: @! _  G  z7 y- C  t

4 u6 v: W" U! X                       VariantClear(&vValue);
" E  Q* i  x3 }- h                       SysFreeString(wsName);
* |/ _5 E6 w1 z  m/ _                     }  o& ?; J# H9 f% F+ S
                 }/ M+ R/ A  J+ C' h
                if(pvNames)SafeArrayDestroy(pvNames);
- I" q0 w1 s9 o; Z$ r1 M                 iEnumIdx++;
/ [% t, H* O2 u( m; g: X9 U               }
; S8 f9 W$ m- G( @9 L            }
7 t+ A% o' \2 @$ e! B  s           if(pClassObject)pClassObject->Release();
  V' S. q9 Y' H( m2 d         }
9 L: E, W/ W9 G2 b" Z        if(pEnumClassObject)pEnumClassObject->Release();9 Y1 E( `# m0 P- E$ D
     }& i4 K$ D9 o3 \( ^+ n9 [
    if(pWbemServices)pWbemServices->Release();/ _) `2 ~- o" k" }
  }
4 w/ U0 U7 u' P6 C  if(pWbemLocator)pWbemLocator->Release();0 E( _# X9 T! s0 T9 V3 g' W
}
% @1 S) b9 G" h$ j- L, Y$ ~//---------------------------------------------------------------------------
" U/ \, k/ p9 x* W! S  K! A) k7 l! i. W" ]  j0 q
// 通过 WIN32_bios 获取 BIOS 信息:( z  a% p% n& |0 t  h
void __fastcall TForm1::Button1Click(TObject *Sender)
5 Z1 v' M& {  {3 C2 a{
7 v( ]& W2 a5 a- e& j7 ^    Memo1->Lines->Add("================== [WIN32_bios] =================");
% _) \  [3 j' ^2 W5 X    GetWmiInfo(Memo1->Lines, "WIN32_bios");; o, \7 B' _8 P$ P/ R+ u
   Memo1->Lines->Add("");7 w! R; @7 X+ D, O; ]6 n% T
}- S! n6 C) i/ F5 P

  ~, a. D4 s& p7 R& a# @--------------------------------------------------------------------------------
. p# K6 }8 d" v* K3 m
# [! |$ c; O2 j# T% D% I/ _WMI 可以访问的信息类型有:$ T4 W0 |5 C$ e3 l
  Win32_1394Controller# D8 B: R8 u# S$ L  ^0 O, E# k
  Win32_BaseBoard
0 X" p1 g9 `" O   Win32_Battery/ P8 V( F  O/ Y+ V0 ^4 n. E) i
  Win32_BIOS2 y$ b6 N5 [: a
  Win32_Bus
! G, \) `9 o9 k( G# C5 w   Win32_CacheMemory7 S! r. P9 d. J' ], b5 p6 p
  Win32_CDROMDrive
/ E$ O: {& c8 U7 q  v* n   Win32_CurrentProbe. D+ Z1 t9 ]3 h
  Win32_DesktopMonitor
& I7 _+ Y6 l' z+ Q: W$ a0 _   Win32_DeviceMemoryAddress
: L# Y$ A5 F. r% t( O) h9 R   Win32_DiskDrive2 m, `% g2 m$ b2 \' ?% A7 Q: B5 ]
  Win32_DisplayConfiguration
( z) a% s6 }$ E4 W( `, S   Win32_DisplayControllerConfiguration
" I1 k. o" f. K, j9 W   Win32_DMAChannel8 i* K7 W3 I! c' y: ~, ?* l4 E
  Win32_Fan
& a# f* Z2 y7 R% q   Win32_FloppyController
& v) `3 [! L! _9 D1 [   Win32_FloppyDrive' u2 P* ~* U( }0 n5 _  N/ d
  Win32_HeatPipe% f/ Y6 f: {. m) g
  Win32_IDEController, Z  g) i* ?4 f
  Win32_InfraredDevice0 C- l' E, X6 |9 s# P0 d
  Win32_IRQResource
' t' G  r6 n5 j   Win32_Keyboard" X- u; \" B* J7 H0 d6 c
  Win32_MemoryArray
: u4 G5 ?1 c, @! s0 W  j   Win32_MemoryDevice
: D# K* j4 i( e) B   Win32_MotherboardDevice
4 y7 D8 f% z) I$ U- W# u   Win32_NetworkAdapter
5 \$ w! R& [. W& t; J   Win32_NetworkAdapterConfiguration" ~* ?- H9 n- C, s- x! u3 h
  Win32_OnBoardDevice
& a  H' O" \' e  s3 }" y   Win32_ParallelPort
. U$ }; \) j8 W) V( _   Win32_PCMCIAController
' [4 I6 p# n+ O9 |   Win32_PhysicalMemory" E  M- N, z- ?6 X. n
  Win32_PhysicalMemoryArray
6 @# S& m* C# I" C: u2 o+ N   Win32_PnPEntity
1 p/ j8 A0 \  g/ O# r& F& I   Win32_PointingDevice
0 c7 e3 F" R" a5 M) G   Win32_PortableBattery
* R+ j: f, U8 U9 ?7 U6 c$ D# j8 q   Win32_PortConnector
- W: b4 u3 a; \2 ~, b  J   Win32_PortResource1 I% {0 ]/ P5 x! Q5 ^9 ]$ a+ M
  Win32_POTSModem% g5 {( `/ G8 Y3 k. V! ?- Q8 j
  Win32_PowerManagementEvent! i- X1 S1 y' f2 t# |
  Win32_Printer* J: Q# V- p5 q$ R) |! f
  Win32_PrinterConfiguration; m% L, t  u% T$ K# V" S+ j9 |
  Win32_PrintJob
+ O& ~- `; U% W   Win32_Processor
1 z: g. F0 t' J   Win32_Refrigeration/ L2 i; r# o7 L' j1 D% x
  Win32_SerialPort7 S' E. p3 K9 F1 K1 J% z9 |
  Win32_SerialPortConfiguration
! G; H4 d' O7 w3 T   Win32_SMBIOSMemory
" z# t# ]  o2 ]7 E2 Z, ~   Win32_SoundDevice
1 `" c+ R6 D" E) p, R   Win32_SystemEnclosure
, `* {# g( c2 J0 u% M# j- w+ N   Win32_SystemMemoryResource; b3 s, N( o7 W6 [) f
  Win32_SystemSlot
1 \8 ^3 P' g: V1 N0 }   Win32_TapeDrive; ]* v. B/ H, |+ k
  Win32_TemperatureProbe7 H/ J; ?  V7 M: O2 s7 R5 B
  Win32_UninterruptiblePowerSupply
7 k' D" \8 |7 O0 \: Q! T! C1 C4 {   Win32_USBController2 p$ ^1 h- Q! Q1 e1 w4 Z) `
  Win32_VideoConfiguration* W+ m6 g: |9 B5 D
  Win32_VideoController
9 n2 X1 T' P+ j* P) c6 b  ]0 l   Win32_VoltageProbe, O! s" ?! w4 Y7 a

  [1 v2 F3 V7 S) L以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-4 02:54 , Processed in 0.019128 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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