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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
: [- S1 s7 c4 I. u& y, X) }9 W9 ?
" I' v* o$ c+ S/ A
+ G$ o- e4 |/ x# h--------------------------------------------------------------------------------
- Q+ B* ~- }$ Y& sWMI: Windows Management Instrumentation (Windows 管理工具)& b% n+ _7 C7 m7 V6 B. P
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 / a( h1 i) ]/ q; Z. M1 \8 ~% c
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
) H! W# j: k" u3 o2 U4 L" y+ j" t   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
1 w5 r- ~4 V# k8 O" H( d+ }7 c( E  e9 A) u: w* ~* H: ?7 J
--------------------------------------------------------------------------------
) _9 B9 z. q* m/ Z# BBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面" c2 @6 @5 O6 P8 w6 E

+ A1 I. o, Z; N& c0 R--------------------------------------------------------------------------------' g) I% w0 |. R- m
① 初始化 COM 接口:
1 a. s7 J( ?' c" N# k+ E( R( H; K   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
# n# j+ w- u* K. T, S, h   这两个函数在 #include <comdef.h> 里面定义。. |8 W4 a/ j3 N6 U; e; j& ~7 f

+ R! ]8 J! o  I5 s5 S② 获取访问 WMI 权限:
9 k9 }1 w+ j1 u8 }   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);0 I( T" F0 S3 F
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
$ X- N* \4 p9 w& o
5 c: C) g+ M0 z* ^③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:- z# W4 E3 u/ _
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
8 t1 s- L, `2 N3 }* H
  R4 t( b" n7 x0 y+ k5 w4 w# dvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
- e. r; H1 {1 n{" q: t) B3 s$ _; ?
  IWbemLocator *pWbemLocator = NULL;8 M4 V* H$ Q' O& [2 L) e
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)/ I; o8 E8 w6 K+ j( X
  {/ a" c# V0 y1 @2 @( \- ~3 V
    IWbemServices *pWbemServices = NULL;
" U. }3 o7 |: [; [. Z$ Z     WideString wsNamespace = (L"root\\cimv2");6 j! I! G7 ~! q; k- E& ~( D3 O
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
3 V2 G4 Y- H, w. F      {$ Z# R+ b4 Q- F% ^  |7 `$ s
       IEnumWbemClassObject *pEnumClassObject = NULL;
# ?6 d3 H- i" k        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
" q" J- a, J/ x' v4 k9 u        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)$ P7 x! P3 O8 V% x+ k& N2 s
        {
" |' E9 K% ]6 l& j& O           IWbemClassObject *pClassObject = NULL;
- R" @& G  J. ]# j# d, A           ULONG uCount = 1, uReturned;
; ?' d" }; a1 |) @; |/ K           if(pEnumClassObject->Reset() == S_OK)
% o) B5 O7 u2 X, ]% [: f' z            {
' r) N4 y3 Y+ }' q) \6 q( o              int iEnumIdx = 0;
+ j" L& b. h+ L+ @              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
3 f6 C8 I& F: D" s! T. s$ `5 p               {
+ F3 M% j( h. [  w, l                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
: k. [1 B% Z; k5 R$ Q  F! }" ]/ \0 g) q" i% j( X
                SAFEARRAY *pvNames = NULL;
/ P# I- }" ~! o9 Q1 n; M% k                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)" z0 z: N' o0 a
                 {
: b+ j9 B9 n* o/ ?                    long vbl, vbu;
) U! E1 R, A4 i                    SafeArrayGetLBound(pvNames, 1, &vbl);- s0 d5 ~" P0 J0 D6 H7 U$ J: C: T7 _
                   SafeArrayGetUBound(pvNames, 1, &vbu);& m# M1 S0 b1 I  a/ I; Z7 n
                   for(long idx=vbl; idx<=vbu; idx++)
: u$ |0 ?# o, O1 R                     {4 r. x0 M  n1 A9 _' A
                      long aidx = idx;5 D7 ~" n0 o- F+ m. V8 J4 {+ t. k
                      wchar_t *wsName = 0;
. T6 M2 K6 e( y3 Q: d' n! x                       VARIANT vValue;
* ^2 l$ z! Y" V' w# L0 _9 U                       VariantInit(&vValue);' f7 A. M% H) X! l- |2 ]- W
                      SafeArrayGetElement(pvNames, &aidx, &wsName);0 G* F: O1 X2 V2 H

  C9 ^  j) y! c) d                       BSTR bs = SysAllocString(wsName);
+ r1 C9 M) m6 [& W: E  ~                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);) ^8 V  a3 s. B$ M8 q9 q
                      SysFreeString(bs);  u! O, k8 A! z: I
  L2 z+ ^. T. n' m: L. Q
                      if(hRes == S_OK)$ C3 e! j1 \$ H5 n9 I! I
                       {) H6 j; |; i. @' J& ?  o
                         AnsiString s;' Y  F4 g5 n  L$ f$ ?( o2 t$ w
                         Variant v = *(Variant*)&vValue;
4 l! ~" X1 \9 K                          if(v.IsArray())+ h5 g0 U6 ^6 c
                          {3 V5 }6 z! A1 d6 P! z
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)2 \8 v* T" {4 ~) N/ V7 a
                             {
2 P9 a. @/ N. O  _0 M% }                                Variant a = v.GetElement(i);
1 d6 U8 t( B% V$ E                                if(!s.IsEmpty())9 e" A# e8 Z2 ^7 W/ A
                                 s+=", ";
8 Y) E2 ~) U8 w) A                                s+=VarToStr(a);2 N: G+ O! |( f6 E: H  [+ [7 Y
                             }
; s. j: E6 n9 k# v+ E( q% O                           }2 K9 p: y; M! |# S
                         else
$ G- T' E8 b( g4 t, `( r: V                           {1 j0 c& W: q8 P4 @8 A
                            s = VarToStr(v);4 C2 l2 U( J: y5 u# t, g
                          }
- E6 l: W6 s, \1 h! |: ^0 x% |1 m                          lpList->Add(AnsiString(wsName)+"="+s);
& V9 m4 X+ A* R  j( G2 C                        }+ l, {/ |  R" M3 R
6 [7 d# t( z  M5 G& ~
                      VariantClear(&vValue);
+ N. d, X5 d, U2 F  O                       SysFreeString(wsName);% q5 b4 Q+ ?" p3 ]
                    }
3 w. x9 S- B5 ^' V2 m& Y                  }2 c- f. x  `% |: [
                if(pvNames)SafeArrayDestroy(pvNames);+ ?% |0 `  P" D9 ~1 h. Y
                iEnumIdx++;( u# Z( ]1 a& S! s/ Y& a. H
              }
; {. Q/ L1 u& v+ O% O: x! ?" _1 Z            }
1 _+ g; k) D( V. P. _0 [) O/ F           if(pClassObject)pClassObject->Release();& T- M4 W  M. H% Z
        }& H/ g6 k" n8 _8 e
       if(pEnumClassObject)pEnumClassObject->Release();
; d, Y; l# l( M  k$ M0 i6 T( o( Y      }/ C" B- c& c. y4 b; c
    if(pWbemServices)pWbemServices->Release();3 t! e' ]. ?- B# B$ Y
  }
/ g) v. i: s! y  if(pWbemLocator)pWbemLocator->Release();! i( g7 l) W& {1 D
}
4 M+ Q0 G: L8 M//---------------------------------------------------------------------------
" U9 D; L( o# w4 |- l, k2 s- y, ^7 y1 a# s  V$ x
// 通过 WIN32_bios 获取 BIOS 信息:. r! n# x+ |$ h' J3 m- @' L! U( F6 X
void __fastcall TForm1::Button1Click(TObject *Sender)0 y. g0 B7 O( C+ K
{
* `9 J' x& n) K2 d! B    Memo1->Lines->Add("================== [WIN32_bios] =================");
4 }2 m# q0 ^/ u  r3 e    GetWmiInfo(Memo1->Lines, "WIN32_bios");6 C: e3 l+ T1 z* O0 {% J5 _
   Memo1->Lines->Add("");! p% @5 q* o" O+ p" N9 z
}4 b' J( R' u( \, R7 ~
; r" z3 h. r, H' m
--------------------------------------------------------------------------------
% `3 W! j( r( \  n  F) s: {" \3 V+ _9 \1 w1 G
WMI 可以访问的信息类型有:
" M$ x' A5 [$ n$ g: p   Win32_1394Controller1 ^+ X; @* U3 P
  Win32_BaseBoard1 j% L+ [7 ~3 k3 u" k. x
  Win32_Battery2 h( S) g1 T; _/ L* {
  Win32_BIOS
9 x* p! K9 H' z5 V3 Y   Win32_Bus9 Y, Q. [2 ~' S& S& c
  Win32_CacheMemory
; c) u: @0 B# ^/ o$ ^   Win32_CDROMDrive
4 |6 f4 i1 L0 G4 Y   Win32_CurrentProbe
" o) N* \3 `1 H6 @1 }   Win32_DesktopMonitor
5 z5 ]/ N* ?8 Q  e$ a* l   Win32_DeviceMemoryAddress4 i3 d4 H7 Z& ~1 L* L3 @% [
  Win32_DiskDrive0 A) K  e8 [' k, W5 Y/ t# k7 g
  Win32_DisplayConfiguration9 w% s9 h2 t* K. q6 P8 w
  Win32_DisplayControllerConfiguration
' n1 X% q! D7 L( F( }5 U1 s+ w6 |; J   Win32_DMAChannel& ^9 \3 y! s8 j, b
  Win32_Fan
2 z, j* E: D, d0 }" f5 }$ \   Win32_FloppyController) ~$ n$ f- T( {* L7 N( j8 f
  Win32_FloppyDrive+ ]7 @% Y7 h, J' g4 R
  Win32_HeatPipe
2 i8 u$ @' [. o' P  k   Win32_IDEController
8 F7 o5 h. x' G3 k   Win32_InfraredDevice6 H$ r4 ^; r7 Z7 F) N5 a
  Win32_IRQResource
3 U, u4 ]) X, _3 ~3 u; l) I   Win32_Keyboard
8 ^! U" k* w3 s" e3 c   Win32_MemoryArray' X/ ]3 s$ F! G! z. U
  Win32_MemoryDevice
2 A0 I9 [5 L5 @1 f4 r8 d" [   Win32_MotherboardDevice
+ C0 i! J' [" Q( O( Z8 y6 I: a   Win32_NetworkAdapter# L& t- o3 |" Y! p
  Win32_NetworkAdapterConfiguration
) U( w4 D# |0 i; R7 z   Win32_OnBoardDevice
. V* z( R8 p- P9 L) F2 q   Win32_ParallelPort
8 w" [( ~, f- |$ P  A, v   Win32_PCMCIAController" ?2 H/ c+ P+ `
  Win32_PhysicalMemory
  z; v8 Y% o5 [+ ?0 x2 j   Win32_PhysicalMemoryArray
; T4 u/ \5 m8 l0 A3 z   Win32_PnPEntity
7 M% E5 e# n) B0 a6 C  \   Win32_PointingDevice
$ J6 h' x' R6 u- N9 [! |, Q, {   Win32_PortableBattery
) t2 W, m) `" A/ c: B8 d# W   Win32_PortConnector0 u- U+ u8 ~# \8 G: Z
  Win32_PortResource5 m* [1 n/ h: G  f. g$ `2 a
  Win32_POTSModem
# l9 R0 U; M9 w  [1 {   Win32_PowerManagementEvent0 T, o- j8 n4 u1 f. E5 v. O3 [
  Win32_Printer
( }( T4 @1 C2 q9 m7 f   Win32_PrinterConfiguration
; \/ y$ u0 r3 ?+ R2 H% Q3 o$ `   Win32_PrintJob
: L% B0 z  a$ F3 U: q   Win32_Processor4 x- y7 G" \/ v1 J7 w# q
  Win32_Refrigeration6 I( c! R0 z( d. O1 l) w
  Win32_SerialPort
* e2 v2 u: Y; q   Win32_SerialPortConfiguration
8 g) Z. t+ M. P" Z! p1 R4 q   Win32_SMBIOSMemory% H% s. z; p. m, ]
  Win32_SoundDevice
# \3 x* Y0 m6 c+ D& G# w   Win32_SystemEnclosure
( s1 N9 O+ d1 y4 p   Win32_SystemMemoryResource
1 y9 C) T, J$ G   Win32_SystemSlot1 [. V6 j, e2 ^9 A6 ~: t' V
  Win32_TapeDrive
" i' ]- N3 m7 D% u6 _7 r+ Z! S4 Q/ q   Win32_TemperatureProbe5 x; c% D, F2 ~9 R7 c( t* ^
  Win32_UninterruptiblePowerSupply6 C) W" l* w- f1 O9 R4 \
  Win32_USBController* P! U% b$ J* c" {  ^& u& p
  Win32_VideoConfiguration
$ F- S$ U$ Z# |% I   Win32_VideoController
* t( n" R4 v9 u% {) c   Win32_VoltageProbe" @- z' N, Z9 G9 F) Y
9 `; Z3 H1 u7 z) d# V% A
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-31 03:58 , Processed in 0.018051 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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