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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)% {' k$ q6 X/ N( W# A: l7 `9 [& w
( M% W; k: p- X& q/ h2 \( |8 K6 N

: ^0 d; H! n( H, d7 _--------------------------------------------------------------------------------
& y9 K& W& K8 g0 `: l7 m" X) S; SWMI: Windows Management Instrumentation (Windows 管理工具)0 [: f) b6 h" r' G5 \% D8 C. O  m
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 7 X" X3 x* }% U4 Q  N
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。' f2 M; J) v6 Y2 h9 ^3 |
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
  G9 Y5 d( G. H6 e' s! D) |
3 N! L# K& b! H6 i8 O--------------------------------------------------------------------------------
1 m/ m8 I0 q7 g! }/ U7 V" WBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
, c2 N+ _) \# Q
& O5 R- b) {5 u2 K7 f; @* h--------------------------------------------------------------------------------" |* B/ e- o6 r# b& X6 O
① 初始化 COM 接口:
2 }6 S, o' ?) m- ^* u9 s5 i' S   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。7 m% F  y2 G0 m" s9 Y
  这两个函数在 #include <comdef.h> 里面定义。( |1 N" F7 d9 B+ _! n; J

! |) C$ p5 Z5 c( Z② 获取访问 WMI 权限:$ U& K% K. L; q& \
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);* a7 ?  e: E, |" O/ r1 k
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
2 Q8 ^. z+ Y; w2 E% e4 c. \1 D" a# f
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:) S& Y. L% W3 {0 T' h, w1 s
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。2 M- ^+ }5 }* Z: b% Z4 ?5 G1 h# z* z
% |- u( c' D( C3 I  E' n" M( _
void GetWmiInfo(TStrings *lpList, WideString wsClass)
/ z/ n4 d/ W3 C6 i8 `{
+ `# k- W2 A, N' O' b+ ~5 f" |  IWbemLocator *pWbemLocator = NULL;
8 l' d* f, |9 A  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)) z1 V& R  p2 r2 s0 w; m/ I6 G
  {
7 j7 h  V: M8 J/ x7 ^. B/ \/ Z     IWbemServices *pWbemServices = NULL;/ P  [" ~) s8 B$ `5 r1 i
    WideString wsNamespace = (L"root\\cimv2");/ I. G2 \) Q4 x
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
' t9 K% y  N! y% G/ B% s% O) E      {
: p% z. o  t$ q  Y) b$ s- ^9 R; D        IEnumWbemClassObject *pEnumClassObject = NULL;
. `) C# Q( b; S6 l+ c1 p. U% e        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
) G0 m7 G. n5 O        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
$ D- I4 K( p' G         {
, ?/ H! I" s# j1 @; L. g3 \6 [           IWbemClassObject *pClassObject = NULL;
5 y/ e! t- H6 Z) a- S           ULONG uCount = 1, uReturned;
7 j# e; _1 C  @           if(pEnumClassObject->Reset() == S_OK): Z" j2 a" j+ W
           {" ^, ~9 o8 F6 }" L, v  R
             int iEnumIdx = 0;
. ~% U- v! }4 e% M5 F              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
8 P7 g3 M  \% ?0 a; D' L               {
; V7 M3 M) J6 h                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");; ?) X+ l: y2 S3 B# `

% X9 |4 o9 A: [+ ~& u- \                 SAFEARRAY *pvNames = NULL;
  H( {% F. r9 C; ~! j/ c- V" Q2 Q8 g                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
5 E9 x/ x% G) z, n- W* Z                  {
' v5 Y$ I6 n9 F; I                    long vbl, vbu;8 d# Z5 H$ {0 t
                   SafeArrayGetLBound(pvNames, 1, &vbl);
: F: M; B$ i5 \% w  ?# R                    SafeArrayGetUBound(pvNames, 1, &vbu);1 }  C; |# p2 M- Q9 Z
                   for(long idx=vbl; idx<=vbu; idx++)
; q" l0 I* E; V* R2 d0 T+ N                     {( A; e2 e, \2 W, ~" m. x, j$ g
                      long aidx = idx;
7 |9 i# T, D6 G+ a% [: l                       wchar_t *wsName = 0;
8 A+ W+ j  `! j+ w$ ^( E: D                       VARIANT vValue;
% r) z! Y8 l; ~                       VariantInit(&vValue);
) k3 q  d: y6 n' v                       SafeArrayGetElement(pvNames, &aidx, &wsName);
5 P) s1 A% Z0 L9 V5 d+ Z* J* N6 P  G
/ q3 O: n* h( Z8 k- b; p                       BSTR bs = SysAllocString(wsName);3 q) ^. q% l+ I( [- A2 `
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
7 Q# @: I. k4 a; v3 z' I                       SysFreeString(bs);& P% [( b; t. V6 g
6 Y/ @( j" T  k4 h- n
                      if(hRes == S_OK)
2 D& s; b$ k! C                        {: O  j. H9 ^+ M( p% X
                         AnsiString s;
# H5 D8 {9 T4 A" ]: {4 m. F                          Variant v = *(Variant*)&vValue;
4 S8 ?* w9 d- T3 c                          if(v.IsArray())+ M6 j5 e- \9 ^8 Q
                          {
) m" z, B3 Q/ f' S                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)) j, X$ Q. h* t2 h! }) E8 u
                             {( j8 o% t/ @% Z" g$ h8 u
                               Variant a = v.GetElement(i);! r% F" g6 Y: I- ^7 G7 B, c
                               if(!s.IsEmpty())
) Y& K6 _8 v! c) x( S                                  s+=", ";' y( P. S0 l, j* D' m' p7 Q6 Y" G9 F
                               s+=VarToStr(a);- Q3 X9 w) v8 w6 I0 I/ K
                             }
1 n4 m9 m. i3 z; ?! f9 [, F6 x( Q9 k                           }
) ^8 Q# @( C1 S5 F7 A( V7 g                          else
+ f  }% b! x" C6 j                           {1 J/ `4 y3 V. U+ o; x7 X/ S
                            s = VarToStr(v);
) i  T" `# F; r- J& [                           }
: K4 `2 e0 {: {) C- @& L                          lpList->Add(AnsiString(wsName)+"="+s);% f2 p# g4 e% Z% U6 W6 [) ?1 U, e
                       }
0 z  x# B9 l, J  [) L! f; Q% `7 @) I1 e
                      VariantClear(&vValue);' l! z9 H* C0 R+ u
                      SysFreeString(wsName);9 @6 j1 N6 h+ \1 j! n! G
                    }
( }& x" W7 w  B1 y+ o, N5 ^                  }& v6 Q& Y7 C3 v) f3 I# v' @7 L
                if(pvNames)SafeArrayDestroy(pvNames);! D- `, u( i6 X
                iEnumIdx++;* f! g- i5 N6 u8 X+ `
              }% ~& r( x) R9 K( G- ^4 G
           }
5 S2 e5 }, |4 ^: }           if(pClassObject)pClassObject->Release();# M9 n5 R9 H) w& Y+ p3 I
        }' ~8 Z; D4 N$ q4 ^" [
       if(pEnumClassObject)pEnumClassObject->Release();3 O5 t! X2 ]" X8 y5 G* i" a6 t1 q0 w
     }
( n6 ~4 S# v) n, L' `     if(pWbemServices)pWbemServices->Release();
! ?2 D9 S2 V9 m! O$ i   }
" ?: A4 t5 E/ |3 Z& Q1 T" a8 R  if(pWbemLocator)pWbemLocator->Release();
; u' G% G) Y7 g* Q# a) B}
& F' ^3 y& J- t7 Y* m//---------------------------------------------------------------------------( V% q' I( d( T  d

1 m& F" p) K  O0 A// 通过 WIN32_bios 获取 BIOS 信息:% `4 \. h/ x- f( i
void __fastcall TForm1::Button1Click(TObject *Sender)
3 o" b1 |+ |1 k( D+ e{
, n- a  J( T8 }, T% f3 [0 n    Memo1->Lines->Add("================== [WIN32_bios] =================");2 P4 |. j' ^( p) ^, g
   GetWmiInfo(Memo1->Lines, "WIN32_bios");3 Z& E: L6 d7 }" D
   Memo1->Lines->Add("");
& g2 t$ X( C& E# M- n* e}
, r" f3 G6 V* k. I- h* O
- s0 ?5 Y- x/ j6 ^  p--------------------------------------------------------------------------------9 M  A. r) X: x, g( @  [
* ~/ i$ D( k- \, k% c
WMI 可以访问的信息类型有:
* C" N* [8 B$ `$ _. Z   Win32_1394Controller: w/ t" u& w& n2 q# d% H* p6 J
  Win32_BaseBoard# H! E. Y" h  J. ]
  Win32_Battery8 m+ D3 ~5 r( S7 e, d& o& l2 h
  Win32_BIOS
" p# K6 F0 m( M3 G5 Q$ h   Win32_Bus7 e: U% {' m6 g
  Win32_CacheMemory
( O% v+ N: i  X5 V4 }* ]! \   Win32_CDROMDrive
8 |5 `( `6 J3 s9 @% P, A; u   Win32_CurrentProbe
9 [+ V% M* V$ _3 O$ J: Q2 \! {   Win32_DesktopMonitor/ y1 K( }0 l# y! |# K
  Win32_DeviceMemoryAddress4 |; Z: o+ w' q3 z0 H
  Win32_DiskDrive
  |: I4 E- Y4 F1 j   Win32_DisplayConfiguration
% j+ \8 r  Y5 t0 B4 @# W! ?$ ]! a   Win32_DisplayControllerConfiguration* s! s0 o% U2 V+ d8 e
  Win32_DMAChannel
' ]6 t6 y: T/ X   Win32_Fan
& T% s$ [5 o5 `   Win32_FloppyController
! {; `6 R8 X1 c2 V' w   Win32_FloppyDrive
& u- g& c# x. l$ ^6 D   Win32_HeatPipe
0 v2 c* \7 R0 f- n' C   Win32_IDEController
, `0 U' h- A/ i7 X3 z" S1 F   Win32_InfraredDevice. s0 d5 X+ l/ q! T
  Win32_IRQResource
/ h2 x; x1 f2 ~$ E   Win32_Keyboard
9 g2 [1 u' D( B  E: q) ^7 X   Win32_MemoryArray8 L8 G! {8 u4 j0 y
  Win32_MemoryDevice! @6 u) C  n# ^6 ~; f. |4 I
  Win32_MotherboardDevice2 E  f# M9 K$ l
  Win32_NetworkAdapter; U. ?4 Q/ q4 P! j- M0 X
  Win32_NetworkAdapterConfiguration
; {8 R8 V5 g% l% K7 y   Win32_OnBoardDevice
- Y0 C) P% y* I4 z+ k   Win32_ParallelPort
* w+ M+ P  Q" J( Z   Win32_PCMCIAController% a0 P2 s/ K5 ^+ z% i7 j- P
  Win32_PhysicalMemory
# p1 \1 @4 s; e   Win32_PhysicalMemoryArray8 _5 z: V0 J5 a4 D$ |, W
  Win32_PnPEntity# \& B& m: o# k' ^2 r3 H! V
  Win32_PointingDevice
  D" y. X8 F. @1 s- `) z' }   Win32_PortableBattery0 @) w2 P- R! n- \0 [
  Win32_PortConnector8 s0 g# m0 _- r/ C
  Win32_PortResource1 x6 @2 g5 j, Z1 y
  Win32_POTSModem
- F& ^$ E+ e7 S# I6 X  j8 r   Win32_PowerManagementEvent
; w4 T6 S; H$ o) H; i/ D8 {   Win32_Printer
7 ]3 Q5 P& A0 N& B   Win32_PrinterConfiguration0 v7 K$ V' M4 E; D! U. S
  Win32_PrintJob8 c# W' \5 n; n
  Win32_Processor
7 u5 a. `, R5 p' n   Win32_Refrigeration3 x- r& m1 P/ U" d" ^8 @- }
  Win32_SerialPort4 [, s5 s3 m2 [% W3 B, B6 `
  Win32_SerialPortConfiguration
, o; R& g$ D1 P   Win32_SMBIOSMemory1 Z% v0 Q" n" ?: J4 H
  Win32_SoundDevice
3 x6 _2 v# }8 w: I, m+ I" n5 j   Win32_SystemEnclosure
2 j/ [4 i- J- g# T, @2 x   Win32_SystemMemoryResource# @1 L* T, M) [. m2 a
  Win32_SystemSlot
9 w; l1 {7 D/ O3 q   Win32_TapeDrive
8 j4 T' r/ d0 A, D  p6 W   Win32_TemperatureProbe$ ~" ?3 a/ O4 T1 T4 {. g2 P% T
  Win32_UninterruptiblePowerSupply
3 l1 T2 e( V% ?0 H2 r- g   Win32_USBController
& i+ j4 V3 ?9 I4 _   Win32_VideoConfiguration
. d. L, K1 H* q5 e- F& O# r   Win32_VideoController+ p* W2 |& p/ j' @, l7 Z
  Win32_VoltageProbe# u6 R; `- {/ k6 S8 K, Y
( e* ^" S. T8 e, r- f  X1 I  d0 J
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-16 00:17 , Processed in 0.017601 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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