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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者): l( G8 J" N- Q% p# w4 I8 f

- \* C6 e# y1 Z6 ^  w4 b8 m  |6 l$ P  C
--------------------------------------------------------------------------------$ u! B. \) y( N
WMI: Windows Management Instrumentation (Windows 管理工具)
- b# b+ Q  p' `1 [, I1 r% j   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 % o; [" m9 p% B0 J" t* l! u
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。5 M7 d) I4 z! F+ N$ r# A+ t% C
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
. ^2 p0 s0 k2 Z( n) A
' |) E& `- t0 p; L) Z+ _  t- v--------------------------------------------------------------------------------. y! e. o  C9 z  p$ i7 m5 N5 F% r1 w
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面3 y8 T. U' c0 u0 O7 S

5 @9 B3 j1 \0 x. V4 z( ^+ J4 c--------------------------------------------------------------------------------
( l$ F/ }: ]' O( |3 I① 初始化 COM 接口:
# M  I: b0 K0 y( b# p6 S   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
& V$ E2 d& u; i+ {  b   这两个函数在 #include <comdef.h> 里面定义。
8 n; j" l6 |' m! `6 r' h
8 n/ M% w# G  A6 ~# R' f# }' `4 P② 获取访问 WMI 权限:1 S& r  ^  J5 J3 ^
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
( D/ ]# T7 O9 P2 m   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
9 N; b# g! m8 ~3 |8 ^7 D% m5 Z( L& a% \
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:' w+ s# e! W5 l$ P( i8 f# M% s
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。/ ?. j4 @+ C6 t

! {) ]' l) l, t6 `! Y# j0 Qvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
! g- m6 j. _; l7 x% j{' v: v' ~0 }- `# C5 n: V, j
  IWbemLocator *pWbemLocator = NULL;; S+ D; H6 i$ F/ C+ ^% W
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)! w8 W: Z" S# T
  {9 u- u' b. C9 y& Q4 X2 C6 C* a) r
    IWbemServices *pWbemServices = NULL;
9 f; d( E6 r  k* l+ [" K5 S     WideString wsNamespace = (L"root\\cimv2");7 H- q2 i- t& b0 M! m- V
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)# v! i9 V1 M0 U. f
     {$ v) Y/ @" u( o3 v4 Z7 f* M2 |( c
       IEnumWbemClassObject *pEnumClassObject = NULL;
( w1 s9 R/ H/ V: O        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;! I( R$ G$ p9 u2 W; t, p$ s
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK): u$ g' u8 l0 D7 Z- ^4 m
        {% W/ x- c( P9 u; \: p+ E
          IWbemClassObject *pClassObject = NULL;; b" ^* B) F7 q0 G) v. g; w. M1 }
          ULONG uCount = 1, uReturned;, `! _, ~9 P$ V9 c; Y+ z
          if(pEnumClassObject->Reset() == S_OK)  O# g7 f+ n# x8 E8 |
           {
  [( j* S! d3 S0 K# V              int iEnumIdx = 0;
: |! K, \' I3 n& U: E: a: c- |              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)  ]* `# E" ?* O% k/ Y& k7 O* @
              {
' ^) D( H0 P+ _2 _2 n4 E3 k                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");5 t: B2 ~9 g1 z: J: [& t

4 T0 }; q1 i8 O* F3 N' g                 SAFEARRAY *pvNames = NULL;- V+ Z% n- ~7 E9 D" Y5 U* o3 y' [
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
9 H/ J' t3 e- Q( L5 B                  {% G4 g5 R, Y. C; k4 x& i% I; k
                   long vbl, vbu;% R" D) s- y5 r* j! |
                   SafeArrayGetLBound(pvNames, 1, &vbl);
) w8 H! M8 q+ u1 c* ^. ]2 i: _                    SafeArrayGetUBound(pvNames, 1, &vbu);4 d% E" D3 n/ z, C
                   for(long idx=vbl; idx<=vbu; idx++)& B$ z. e* U* \) T- S8 r# h
                    {
/ X# ^0 q* n( v& [                       long aidx = idx;( e; X  M+ K3 w* p" ^
                      wchar_t *wsName = 0;
$ I" a: k. m5 j+ Q                       VARIANT vValue;
( F9 P1 I& j. v                       VariantInit(&vValue);
3 [% W, f" o7 r- t" G, A                       SafeArrayGetElement(pvNames, &aidx, &wsName);5 W' M2 b- |% \2 m$ M. J
+ o) T& [% J$ x9 ]# H! A9 z; G
                      BSTR bs = SysAllocString(wsName);
% o* W, u' D/ N2 N6 }9 P0 j                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);4 f5 ]4 A% X0 l" r
                      SysFreeString(bs);" N! r5 i( ?) G( ~, @2 _

0 C, v3 Z; U& ^  q( B! R0 p                       if(hRes == S_OK)
/ |8 X" @8 a2 \7 m0 z# g+ l                        {+ U  B$ f  p) ?4 e4 I8 y
                         AnsiString s;* V: ]/ @' o1 H9 v7 o( P
                         Variant v = *(Variant*)&vValue;) G3 f( A# u5 i4 \) p4 E  W
                         if(v.IsArray())
  C5 L( j; p! X. C) d1 Q; u                           {
3 q9 a+ E* V4 C9 |                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
# p/ f( g6 h' a1 X  R0 C                              {% P; C. O5 O1 E7 o1 f7 p# r: y
                               Variant a = v.GetElement(i);, k2 [/ O- [3 Q+ d2 |) z5 F
                               if(!s.IsEmpty())
/ ^/ i$ q' r4 m; ^' [                                  s+=", ";$ z. b  }0 N  v5 J: r" g& h
                               s+=VarToStr(a);
8 o7 p9 D6 q6 _8 Z                              }# f  q, F* i/ I, E* P0 L( Q/ W
                          }
# F6 c: W2 D$ d* `                          else' {$ _1 _! Q, ]" o4 S' z2 o0 J8 P
                          {, l$ O9 J: b* @9 ?( T+ h
                            s = VarToStr(v);. b( ~" _/ U9 p9 Q2 l: a8 ]! T) T
                          }3 w8 x; @- e0 H$ @
                         lpList->Add(AnsiString(wsName)+"="+s);  k: c0 F2 g1 F
                       }
. }/ G$ l) o3 Q0 ^$ x2 F0 r
6 }1 T8 G4 B. B                       VariantClear(&vValue);
. [7 d# I( i6 v! c; y- X                       SysFreeString(wsName);
# S( f& v$ U1 p; J' m6 r6 }. i                     }) M% s+ K6 N% @
                 }
. m! F3 V+ M  ?$ g0 F/ L' Q) G2 c                 if(pvNames)SafeArrayDestroy(pvNames);
9 }% {( i( l" i0 [3 M& E                 iEnumIdx++;- d/ B* M/ D" I1 [; O7 ^
              }4 {: C% ~& ?4 q  T* f: s7 k( E
           }( C' h$ ~" l, W" r
          if(pClassObject)pClassObject->Release();
2 s  g9 X1 ]9 f. M7 V2 L* L  l         }5 Y2 h+ R4 J- i% D6 c5 x
       if(pEnumClassObject)pEnumClassObject->Release();4 T) o! Z, c9 S/ h$ X: {6 S; r3 O
     }3 \7 w. Y1 \, B. G1 g
    if(pWbemServices)pWbemServices->Release();$ [: J5 }4 ~" D  D- D" Q
  }
$ H- o/ u# U, x# J& D* g4 P0 u( P. R  if(pWbemLocator)pWbemLocator->Release();( Y3 Y1 T8 s& D5 h- ]
}4 f9 T: H3 c0 t  p# d& E9 u) ?) f8 e7 f
//---------------------------------------------------------------------------
9 g  J0 v* z  |9 E( F9 l/ j" u- y+ g) F! A3 E- Q5 `, J1 Q" {+ T7 W5 V3 R
// 通过 WIN32_bios 获取 BIOS 信息:$ a9 }# p6 F+ Q, d
void __fastcall TForm1::Button1Click(TObject *Sender)& B' s" d9 e+ s' T0 `
{; Z( C9 {  l8 L5 j* p
   Memo1->Lines->Add("================== [WIN32_bios] =================");
9 [5 N& N9 A$ t# ~& [% u    GetWmiInfo(Memo1->Lines, "WIN32_bios");
* E7 R0 E& v+ E$ [, a' m$ M! [    Memo1->Lines->Add("");/ I* D/ y  J- N: d
}
( q2 f) ]+ R, R, C9 \9 K/ T( v& [* W: n  `: v
--------------------------------------------------------------------------------3 j' a5 _' c  f* c
7 X- b+ L( Z: s) @! l; ?7 L1 L
WMI 可以访问的信息类型有:( N/ k) s$ Z; P/ S
  Win32_1394Controller3 K: h0 S9 V8 J  p. f
  Win32_BaseBoard% W; H- W# n0 Y4 A6 C6 }/ x5 e
  Win32_Battery; N: x/ I8 i6 p* V. G4 i0 H
  Win32_BIOS" Z: Z' `9 a$ H$ O% R
  Win32_Bus8 l& v2 C2 c8 M# N: K5 `3 t2 Y
  Win32_CacheMemory: \+ d4 e) x* f9 y* B
  Win32_CDROMDrive' }: k" l* G. b$ K' H) @' r
  Win32_CurrentProbe9 v2 H8 U9 o& s
  Win32_DesktopMonitor
" k  s8 V3 ]. r, }! q# r5 V3 l" t% x   Win32_DeviceMemoryAddress
/ R' L7 o) a  L' H: b- R   Win32_DiskDrive
  I- w5 j5 g0 \: T6 O" V* i   Win32_DisplayConfiguration
7 j& b/ p( ?: x6 l8 ~, U   Win32_DisplayControllerConfiguration) @" A# W6 k0 ~3 M2 I
  Win32_DMAChannel4 t- @% D' T" d/ t2 ?/ o( n
  Win32_Fan& j# Y" \: d6 s! _2 r
  Win32_FloppyController
4 ^5 {/ r2 ]: {' ?. G1 @. h   Win32_FloppyDrive0 B% W9 [5 z6 n. [9 I
  Win32_HeatPipe1 g$ \9 x: z' v3 i
  Win32_IDEController1 D! B+ j# N! ^( k
  Win32_InfraredDevice
& P/ y7 w' C3 `+ w   Win32_IRQResource
6 t0 g6 r4 \3 z1 L   Win32_Keyboard
2 x' c; Z. e6 B! h! Q' B   Win32_MemoryArray  e: F2 X; Q1 V" z1 q
  Win32_MemoryDevice1 Q2 P1 ]3 t$ l$ B5 j" q
  Win32_MotherboardDevice
' Y5 h. `6 K5 p$ O4 I   Win32_NetworkAdapter
( K+ h* E$ V) b   Win32_NetworkAdapterConfiguration
( B/ W7 j" k/ ~$ A2 N+ P   Win32_OnBoardDevice
/ a+ j: L* V* m; Q- s   Win32_ParallelPort1 W- F# M, O5 v
  Win32_PCMCIAController
- S. o9 o. T5 k3 h9 E: [   Win32_PhysicalMemory
+ H* w) C# `( _0 r% ^) Y+ _   Win32_PhysicalMemoryArray& y7 v+ @4 u" b, j0 z  Z, i
  Win32_PnPEntity
3 @$ C4 @6 w1 F$ i+ X; H1 D! d" \   Win32_PointingDevice
. ]: _+ p$ h! A# e& A$ J' Y1 j   Win32_PortableBattery4 f- h, P2 x# Z2 [
  Win32_PortConnector3 F$ `* R: v2 y% P
  Win32_PortResource
0 p) r2 T8 x1 d5 j   Win32_POTSModem2 ~- H4 a$ K0 M% ?& R. w3 c
  Win32_PowerManagementEvent$ J3 ], B/ H3 K7 c
  Win32_Printer5 R) h, }8 A8 U/ b5 h" i& q
  Win32_PrinterConfiguration
0 ?% n- t' G- N; R9 |2 H   Win32_PrintJob# j: n( d( W! h, u" y7 C( n
  Win32_Processor) s! h) c' u7 g6 H! h
  Win32_Refrigeration2 v- j. Q0 ~% X* X( v1 X, p
  Win32_SerialPort: w+ {: b; ~/ H! j# X" M8 N9 S9 W
  Win32_SerialPortConfiguration( J% x( S+ A3 p
  Win32_SMBIOSMemory8 Q& e& U9 S3 g
  Win32_SoundDevice
9 g9 W( K( K+ J   Win32_SystemEnclosure
. s' h) b% [, I% g   Win32_SystemMemoryResource( H% _: }+ C8 g! F" l+ V8 i5 C! W
  Win32_SystemSlot
- p7 F% N' H! `9 w   Win32_TapeDrive8 B6 W' j" }2 ^0 n% u
  Win32_TemperatureProbe" V' X5 H0 f1 L  v
  Win32_UninterruptiblePowerSupply
7 }9 Z; e3 o1 h5 F   Win32_USBController! U4 F+ M, N2 r3 B  j. ]
  Win32_VideoConfiguration2 n+ l% {6 m# [7 v& ~$ n6 s
  Win32_VideoController2 k+ c+ s( {: z) G, Q
  Win32_VoltageProbe
8 L' H3 F" o' }2 Y+ O* W% \; P. Q: Z0 d# @8 M
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-4 00:22 , Processed in 0.019177 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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