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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)+ ]$ Y8 a: Z6 ?% c! W

! D3 |' D0 o) K0 [$ f1 K
; Y$ @$ W/ |. @  G$ ^--------------------------------------------------------------------------------1 F* Q3 e% |  `$ `" W8 P
WMI: Windows Management Instrumentation (Windows 管理工具)
! e" e' w5 `8 ^) Z, g   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 # `* s9 a( [& d+ A2 T  e
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
$ l9 r  m" b5 S0 a& f   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
  L. l: q9 @9 K3 ]% t4 q
3 ]9 ~! c# I" ?: s+ ^( L--------------------------------------------------------------------------------
" ]- }2 q0 t0 l/ W3 P8 h4 PBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面4 }6 v. `5 T; k' O3 B- l
% D; x+ M6 G2 m7 W3 V% d. }, F# s, U
--------------------------------------------------------------------------------- K6 N0 {: z% u
① 初始化 COM 接口:
: f8 v7 C. Y4 b8 B  u* P! d! h   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
' w8 ^; [; l/ |) \   这两个函数在 #include <comdef.h> 里面定义。/ I1 s5 ]( S8 E/ @' L) u

: z2 q+ _- G8 L- e2 X" ^② 获取访问 WMI 权限:
/ t6 F# n8 u1 v" A6 F% R   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
( H4 N& N7 p( \( h   如果这个函数返回 S_OK 获取权限成功, 否则为失败。5 l# |* j# I  F7 Y, X" t7 b
& B" g" }% c! f8 x+ a3 W* _! p# k0 Q
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:  Z# J' b3 \, |  p- w
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。% h% X. U3 f: `+ u

9 L0 I7 v6 y0 b: ^void GetWmiInfo(TStrings *lpList, WideString wsClass)
2 }2 j$ x4 X4 F3 ^( c0 W+ E{
. I. d! }6 e  Q9 O6 m! ]  IWbemLocator *pWbemLocator = NULL;
5 a9 f0 L, s: h# R  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)/ G8 y- ]$ G+ I
  {# X1 Q5 s7 L9 A; p% l/ w1 j
    IWbemServices *pWbemServices = NULL;
  `# [7 k9 d4 c" j* I     WideString wsNamespace = (L"root\\cimv2");
( x) W0 W2 p0 R# t' W     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
! h/ V9 h, G2 N& p1 |: `      {( E; Q, r& w! R9 H9 {
       IEnumWbemClassObject *pEnumClassObject = NULL;; Q( ?7 |" q+ R  p+ l, n7 U( L
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
  V. p4 l/ a# N  Q2 t; S' u        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
' B+ d- b! V2 Z8 n1 f/ s/ s/ _         {4 s7 |! ^8 D2 |+ {0 l
          IWbemClassObject *pClassObject = NULL;
) D/ S6 C3 \6 n2 X1 t           ULONG uCount = 1, uReturned;
4 T2 ^4 J: Z% p6 r$ K$ c           if(pEnumClassObject->Reset() == S_OK)
$ c6 p1 V: M& i( S' h/ b5 Q5 y: g            {1 @' L) P2 v0 o- H
             int iEnumIdx = 0;3 ~1 c, F1 R" s( ]% ?- N. o
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK). r* X4 G* B5 r: \2 k9 }
              {& d1 b; D9 j- V5 e$ X, T
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");6 v2 K. }. ~/ h! \4 B! \, x% b+ @

+ d! _& j3 Z3 D0 h# Q7 A$ q, c                 SAFEARRAY *pvNames = NULL;
  n, s) ?5 R1 s+ f' ?: K                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
+ I5 g8 k3 K. z6 K  e: O( ^) N2 r                  {1 }3 F1 h. L# b0 X- k, k# h0 j
                   long vbl, vbu;! ^' \5 |* N$ K- ?
                   SafeArrayGetLBound(pvNames, 1, &vbl);
1 C! S: f% z$ i$ \- O6 T                    SafeArrayGetUBound(pvNames, 1, &vbu);
" y% ]# A+ ~% f7 D! M/ R                    for(long idx=vbl; idx<=vbu; idx++)
: ~9 J' Z4 h# q0 t& O                     {
9 I% O  F# n" L' L6 `) U* p- w3 `2 y& U! g                       long aidx = idx;6 Q9 R" E9 n9 p8 R
                      wchar_t *wsName = 0;! x) ?! o' m0 M/ J2 J
                      VARIANT vValue;6 Q' c' d  B6 g1 @
                      VariantInit(&vValue);# V" h! ]" \! ]& u" z9 D2 `4 ~: [
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
: G& m  U9 z- _5 @1 n" `/ N7 D$ X
                      BSTR bs = SysAllocString(wsName);
4 e. b9 H% O; z2 _. m; I                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);  p6 @6 a' |* i5 }: [
                      SysFreeString(bs);
; U: J  V& ~! k, Q+ |: \; w1 W) n5 e
                      if(hRes == S_OK)
& z& F+ h3 I% M0 l9 |3 ^9 ~0 C  c                        {, U0 ]/ ~+ ~1 G5 G, U2 n1 V
                         AnsiString s;5 G) c1 `: O6 Z$ c/ l  R0 [- F- J
                         Variant v = *(Variant*)&vValue;
, H* Q- c3 E7 y* X2 @* R                          if(v.IsArray())
' H! P" |% l8 a3 ]+ ?                           {
0 E2 H! |1 a. v" N- L' Q                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
6 y8 r8 D' `. c* }/ ~                              {$ @4 o6 |9 M0 Y* B  W& ?8 B% R
                               Variant a = v.GetElement(i);2 d+ S& q& h0 l2 J
                               if(!s.IsEmpty())" ^4 }9 Y% H3 y
                                 s+=", ";1 w2 k2 a* E& Y, }& I
                               s+=VarToStr(a);8 k$ C4 D7 o& T; s/ R3 K
                             }7 c: m4 {) |$ e% M2 F! {: e
                          }
8 _8 {. `; j1 G                          else
8 d/ {5 A$ y7 c& c9 I% C/ f6 }                           {
% `7 w+ H, J$ h3 E* i0 Y                             s = VarToStr(v);* {( o/ S+ J& w0 s
                          }; w) }' y$ [1 s& l8 x% z$ n; b$ x
                         lpList->Add(AnsiString(wsName)+"="+s);
( A* O/ U' J) J2 j" _4 I" {                        }
+ q$ ~8 s  P7 ^" c9 d' ~# V+ f1 Z
% ^+ \/ v- `+ d" n) S" @+ i% ~7 N, |9 o3 T                       VariantClear(&vValue);$ U% K: D+ y( u6 E# I
                      SysFreeString(wsName);
1 u; B# w! U2 Y3 j1 C5 w2 M: W& V1 S                     }
; D/ \, K+ n7 Y  {2 T% p0 l                  }# E8 t+ e, ^$ t+ Z) E4 V
                if(pvNames)SafeArrayDestroy(pvNames);
* J; B* a# P: r% r/ F4 j8 r                 iEnumIdx++;
% R! @% m, ?* D* ?' a8 b5 C               }/ p$ w$ S2 w8 z! j! ]! a8 d
           }
7 S4 h, ]; y6 z4 o* X           if(pClassObject)pClassObject->Release();
7 V# E+ k6 R& J1 V# T         }0 Q( N" w4 K! l6 k7 O
       if(pEnumClassObject)pEnumClassObject->Release();' h8 \# \) _1 M9 c, l7 y# o$ d
     }
, V  I6 d3 J7 b+ o' s, Z$ ]     if(pWbemServices)pWbemServices->Release();! Z5 g$ S* W0 C3 x* M7 i6 r1 j
  }* s' x8 ]& h/ e& x. _
  if(pWbemLocator)pWbemLocator->Release();
# c. W' t1 X( d) A( X1 P}
: b2 U5 m7 H" H//---------------------------------------------------------------------------* U+ ~' y) A6 C& E; ~6 E7 p+ c

4 d8 {: |+ k1 U, P) g// 通过 WIN32_bios 获取 BIOS 信息:
3 u/ {. s# Y% X! ~. Bvoid __fastcall TForm1::Button1Click(TObject *Sender)( x' Y6 ?: Q8 [) t
{
3 ~. w" Y7 I& a. @: }/ N    Memo1->Lines->Add("================== [WIN32_bios] =================");
8 u* a3 W" ~, P3 q7 N& {& M6 {    GetWmiInfo(Memo1->Lines, "WIN32_bios");+ `- c' J: I$ _7 Z% N9 N0 |1 S3 C
   Memo1->Lines->Add("");
: q( U3 H/ R" L" O$ @}
0 E- Y& Q3 I( ^6 d4 Q1 c3 I  ^  c( U( |& X2 r" q
--------------------------------------------------------------------------------
" i2 Q" d  `4 m
" E7 X$ E5 J( OWMI 可以访问的信息类型有:
& i5 m* e8 @( v# g% [! s! R$ e) X8 Y, S$ \   Win32_1394Controller0 ?" b3 p) ?) {, h- u% h
  Win32_BaseBoard
8 x& u9 k' @/ W1 D   Win32_Battery  D* S( F" T! u$ K6 L
  Win32_BIOS
. {9 F, ^4 V0 g   Win32_Bus8 x8 c+ f: |% G+ U- m3 z
  Win32_CacheMemory0 D; w2 y4 i  w7 V$ D
  Win32_CDROMDrive5 ]: @, H" E( [2 P
  Win32_CurrentProbe) S& d* |) r* j: ?3 K6 l
  Win32_DesktopMonitor) ^/ ]. N  ~) B% }5 i
  Win32_DeviceMemoryAddress
8 \3 K* Z5 `4 Q3 p   Win32_DiskDrive
! o8 ~+ {* E& b% b2 Z# w3 Y   Win32_DisplayConfiguration
! e! r/ z+ R% _& p; s   Win32_DisplayControllerConfiguration
: ]8 G7 l* {4 A( |( e8 b: X' A( B# H   Win32_DMAChannel
8 @5 m& ]6 L4 H: w   Win32_Fan
8 G, _4 t4 U- V+ q   Win32_FloppyController
) f$ p1 ^5 `# d. N3 V5 @   Win32_FloppyDrive3 l- W- C# M5 ^! @0 @9 m  w
  Win32_HeatPipe- v; ?/ h, M3 O1 Y
  Win32_IDEController
$ K1 ]2 j5 Q2 n- c* n   Win32_InfraredDevice$ A2 d" c. f  D2 ?  D
  Win32_IRQResource
8 c& ]; F% S7 S+ y/ o/ q8 l   Win32_Keyboard
7 W  b9 x/ u6 {) b) Q0 K5 D   Win32_MemoryArray
" Z* r4 Q5 B: f   Win32_MemoryDevice
& n4 I/ e, n# X- X0 l9 V) B; M   Win32_MotherboardDevice" v  I$ _# t! S- j
  Win32_NetworkAdapter0 D9 B% x' j) A% s6 V: o
  Win32_NetworkAdapterConfiguration
; x) x, i) t& w* c, i( U! r7 @1 M# z   Win32_OnBoardDevice; @0 D! H! A8 `- @( K) r$ c
  Win32_ParallelPort+ I) X0 y7 ]6 B7 n: s& n/ v
  Win32_PCMCIAController4 f! u: K7 ?0 _" _
  Win32_PhysicalMemory
& \% u- J2 b  E" n1 n   Win32_PhysicalMemoryArray$ F8 e( I# s. @( F1 B) T8 n3 F2 v2 D
  Win32_PnPEntity; L) l, H0 Q- j- a+ S
  Win32_PointingDevice
1 \. X0 R( l6 }. s! f1 Q! M   Win32_PortableBattery( _" H* C5 m3 m8 T  r& e4 H
  Win32_PortConnector6 I% R! q, d0 i* u
  Win32_PortResource
* o6 C+ |9 @* T; W   Win32_POTSModem
) E8 e' R/ y/ I, l% \, k   Win32_PowerManagementEvent* w: c7 g' z9 r( ?7 g7 n, F  t
  Win32_Printer
2 n% j0 e1 Y1 E; I6 p7 W" `   Win32_PrinterConfiguration+ _' j3 d/ J' e; F6 ]
  Win32_PrintJob
! t8 e9 E& f- A. S4 M' M   Win32_Processor
/ S! e4 x) t1 @   Win32_Refrigeration; k; `# t3 {: @/ _: ]8 W
  Win32_SerialPort
* [  P4 Y& \( ^" I- r0 ?- x   Win32_SerialPortConfiguration
8 X3 X6 `9 c7 m5 J9 ?, W   Win32_SMBIOSMemory4 p3 B2 Q7 |1 {8 U3 {3 S5 r+ P4 d
  Win32_SoundDevice
; k" V% R5 o# s   Win32_SystemEnclosure7 T( f: J( d4 ]1 w, `; l
  Win32_SystemMemoryResource3 c/ b* H3 C  `# J2 w
  Win32_SystemSlot. |  y) }6 B# i- T0 e' d
  Win32_TapeDrive
9 r8 ?7 }$ Z9 R/ w   Win32_TemperatureProbe2 i& F" B7 v. E; L: F. M; g
  Win32_UninterruptiblePowerSupply4 E, z2 m; s* y) o7 d' O
  Win32_USBController/ g8 Y* g: G9 I' U2 Z5 H
  Win32_VideoConfiguration5 s4 A: v6 T: A3 O# |
  Win32_VideoController$ R# e, G8 s/ \7 G
  Win32_VoltageProbe
2 i' P" s2 a# @+ B- s7 }. \( l8 A2 c4 r  r
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-24 00:48 , Processed in 0.023850 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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