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

[收藏]关于用WMI获取系统信息——编程实现

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^: 5 H7 y0 K" @) M4 G3 M. E8 P; d# |8 Z
  --------------------------------------------------------------------------------. O0 X3 G4 w% E
  #define _WIN32_DCOM 2 q& \: {5 n: A: r/ O
  #include <iostream> ) j5 G5 J* v' J+ E- `2 q. F
  using namespace std ; % j4 s6 w3 X; d" Z6 `
  #include <windows.h> % W+ B+ {( _8 C: P
  #include <comdef.h>
* H, k& l# f5 ~4 Q  #include <wbemcli.h>
: G3 `- [# J5 \8 k  
2 m7 K% _. X; f" U" [# _5 N0 ?  #pragma comment(lib, "Wbemuuid")
/ m+ d# c2 J+ k* X! j; n5 {  
4 q9 C1 d- N& I+ ~, P& f* c# r* |8 x& I; t: Q  int main(int argc,char**argv)
& h% {5 [9 }; [" M' _5 ~  {
7 t1 P5 t8 {: R0 H  HRESULT hres ;
8 O$ L( Z3 v3 D- d  H: q  * H* W: J5 g4 |3 F
  // Initialize COM. , r% r& J) h5 n$ M
  hres=CoInitializeEx(0,COINIT_MULTITHREADED);   I1 e7 Y, z0 h& |; I; N8 k3 o
  if(FAILED(hres)) / _; u$ Q: f$ a$ t6 G
  {
' |' b9 v" i* Y0 w! x& n2 {  cout<<"Failed to initialize COM library. Error code = 0x"
* b  i2 M$ @1 N1 s  <<hex<<hres<<endl ; : K8 R7 p/ a' k% Q+ m0 L$ D; x
  return 1 ;
5 u( M: Y. f, h5 L9 b' H2 q  // Program has failed. % J( S! @; f* n* ~1 A, O1 T
  }
' _" I1 h- }! J0 I( o& o  
( D( D2 [5 s3 O! P  D, _& o  // Initialize
- w0 ^2 u- a. z* M  hres=CoInitializeSecurity(
+ k) T% G5 ]( k: k' l% y9 `  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
0 h8 a, z& l3 I) m  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL); 8 r$ e5 N0 D; C6 q: @
  & G8 X  m- J% m$ i( q# |3 l
  
; E' T7 W6 y: |4 e( v" \  E; T% v  if(FAILED(hres)) ! S$ Z7 S% R2 m* d
  { 8 v2 b( H" U. R% x+ Y; x3 I
  cout<<"Failed to initialize security. Error code = 0x" 8 @5 @% K* F$ s6 q$ o4 R
  <<hex<<hres<<endl ; $ l4 R9 ?; m* x0 O4 I( q1 N1 F
  CoUninitialize(); " j) |6 A' L$ Q. a
  return 1 ;
" Y  Z9 H- l8 R  // Program has failed. % U( M: K$ P/ j- p. h9 A
  }
6 i6 t: Q* c0 L  " e0 _8 ~, V; w9 Q/ W. J- s9 `
  // Obtain the initial locator to Windows Management on a particular host computer.
& C& J2 E/ i) q  IWbemLocator*pLoc=0 ; # Z7 v9 q- R0 I8 Q& t# k
  ; x* O, }! Q1 y4 H2 E. o8 t
  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
" K4 k8 p9 o2 |/ m  IID_IWbemLocator,(LPVOID*)&pLoc); ) D: ~- Y& w+ O3 P7 R
  # L/ ~6 o* e+ P6 N
  if(FAILED(hres))
9 S- h4 |! f) C" |2 T. b9 S, a8 X  {
8 f$ E4 w, W7 A" A' G( q. i) n  cout<<"Failed to create IWbemLocator object. Err code = 0x"
; ^# r6 P# |$ A: `" G% U$ X9 {  <<hex<<hres<<endl ;
2 d1 ^; J- y+ u0 i- P  CoUninitialize(); " \, H  b: d6 W0 E
  return 1 ;
3 |6 K9 c$ w. V# p; v3 {9 _6 z3 W  // Program has failed. 0 @3 w8 \  u3 _/ O
  } 8 U! q- Y% f$ c. P2 S8 R
  , S# G. z# w4 o/ U+ b6 T" A- E  ~' {
  IWbemServices*pSvc=0 ;
1 N0 Z5 S% h; @  3 d7 B3 g4 k: ^' K
  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc
$ O9 b: Y; ^/ P1 I* |0 M0 ^, n  // to make IWbemServices calls.
* O+ s  Y5 C; u8 U  / g+ o3 w% D, Z/ L$ \9 i
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"),
1 ?$ ~% a) i1 D5 c% L% _% P! q  NULL,NULL,0,NULL,0,0,&pSvc); ; A9 }5 m/ I# Q; G- h
  
# ]  x' L3 Y0 R( }" }, }' G1 W. K  if(FAILED(hres)) * Y/ \0 K4 F) C2 p! a
  { ! h# M. x9 }% z" E( a
  cout<<"Could not connect. Error code = 0x" - d- p, a( F; S) r) V
  <<hex<<hres<<endl ;
5 `! h3 x; }* T9 N, l+ i1 P  pLoc->Release(); 2 V2 J, W) L! G' f0 g: W
  CoUninitialize();
5 G& D' I4 s# H& y0 y  return 1 ;
# E4 e. M* s* s  // Program has failed.
' H  @( B0 R8 Z/ ?0 V% [9 j  } 9 W7 N0 Z! J! q. |! I& K( C9 _
  1 t4 J+ C% Z6 {8 G  o+ Y2 K) S
  cout<<"Connected to WMI"<<endl ;
3 a& O& t" P( p  g1 {5 d7 L7 Z  
) E. i/ R( \1 @5 ?# W" |. ~  // Set the IWbemServices proxy so that impersonation of the user (client) occurs.
  K5 U/ P/ P: w- _. I  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL, 1 j% ]8 |1 }" s( m5 [! |
  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
& i. e- J' j( R! F  % G. O* [( `1 y( f/ x7 G/ A
  if(FAILED(hres)) 5 R) \4 |) I  [" f
  { , R( q: N  ]+ V+ [
  cout<<"Could not set proxy blanket. Error code = 0x"
: c6 H; ~5 K+ [9 o6 w  <<hex<<hres<<endl ; 6 r& `; a( u$ x' M0 u8 a1 ^. k
  pSvc->Release(); 0 c) d9 y$ E" Y/ b
  pLoc->Release();
! F4 e# _/ y. |) k4 c  CoUninitialize(); - a4 J& O- k8 m4 k! S
  return 1 ;
% g8 q" B' N1 }8 B8 O: y  // Program has failed. 3 D" J/ v' Y0 F( k: M1 E# L
  }
$ ~) C, v! D0 B& ?" R' D  * n* C1 p' Z: i& p1 b9 X; l
  
0 Z8 v& _* b2 }3 ]( y  // Use the IWbemServices pointer to make requests of WMI. ! @) N, \9 c3 q8 u8 _2 x
  // Make requests here: # t: U6 m7 f0 h6 `9 Q, w
  5 r' Q) n, b, c$ I/ O
  // For example, query for print queues that have more than 10 jobs 0 b: b- R5 o3 y8 B; O
  IEnumWbemClassObject*pEnumerator=NULL ; $ M; D) u( F$ u" p6 v* u
  hres=pSvc->ExecQuery( ( K& A2 F+ a1 q+ k% y7 ?' V
  bstr_t("WQL"),
# h4 y# l- |# B' K  bstr_t("SELECT * from Win32_BIOS"),
$ C: x* d. v( |' H, Z$ S  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY, 7 Q1 c3 ^# v6 O) W/ V
  NULL,
% ~* ]8 J* o- K2 A( Q  &pEnumerator);
. i2 O4 ]  }: z* ~: W/ n  
' J( @9 R0 r/ c; D  if(FAILED(hres))
: l( k' e/ `7 a- T! L  { * }" d* H" M  L& v
  cout<<"Query for print queues failed. Error code = 0x" 1 Q+ `& T; `  A5 z8 Y2 M
  <<hex<<hres<<endl ; 4 a0 ~. G7 C; o5 u
  pSvc->Release(); ( C1 [2 g/ R! G
  pLoc->Release(); 6 g2 B- s5 z* [* d) O; v* f/ y
  CoUninitialize();
" A& `4 J+ z2 |. Q  return 1 ; 8 z4 ?0 H! o, Y4 _; E0 P3 y3 T
  // Program has failed. ; q+ U& G9 |( ^9 V' n- r8 F
  }   j0 K9 l6 K/ g! H& r6 g; J8 Q6 T
  else & j" Z6 @1 m# [% L% h6 |2 n
  { 3 [8 r; D7 u1 k- k% O  L
  IWbemClassObject*pInstance=NULL ;
: n* u# A/ t, u  ULONG dwCount ; 1 x- P+ ]. z& h3 K. |
  while(pEnumerator->Next(
( @$ b! }$ F" J* J" @  WBEM_INFINITE,
0 b7 S2 b2 d8 y, n3 h  1,
1 p5 c6 z6 w$ `! i  &pInstance, 5 ]& c9 S( _8 x  N( }$ ^5 ^6 y% K( G& @
  &dwCount)==S_OK)
  m' _, n, @! [! Z5 N# M. r( ~  { ' o) y' N4 i! a5 P, P: @) Y
  SAFEARRAY*pvNames=NULL ;
5 o) s( B/ N6 P, \; G. x  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK)
; ^1 U+ C& Z! W( h. v) ^8 n) Q; [: Z: E  { 5 a4 a5 ]2 o+ W7 R
  long vbl,vbu ;
+ _+ e1 D$ w, L9 x# T6 [  SafeArrayGetLBound(pvNames,1,&vbl); 6 ]' ~0 [( r" B( U
  SafeArrayGetUBound(pvNames,1,&vbu); ) I) ^! [8 y4 a
  for(long idx=vbl;idx<=vbu;idx++) 3 [- s. q: t4 g( N6 B7 v
  { " ]4 U! i, m  j
  long aidx=idx ; $ [7 z* {$ ]8 W! W# Y( m
  wchar_t *wsName=0 ; 5 X. c: ]* q. p+ O! a
  VARIANT vValue ;
. c4 z( u! S' O  VariantInit(&vValue);
% f: R0 j3 K+ A2 C9 ]1 g    z/ a* l: |* {$ S/ z
  SafeArrayGetElement(pvNames,&aidx,&wsName);
4 a' \- f' R  j  
4 H* p# l: V- T) `4 X" ~  BSTR bs=SysAllocString(wsName);
- V$ u8 o; }% q3 q, c* `  hres=pInstance->Get(bs,0,&vValue,NULL,0);
& l- }9 o1 N, Y4 E7 t2 I  SysFreeString(bs); 6 @9 X& u' C( p( f. h' `) ^
  
! Y3 T  ?* @0 w, @: ~7 A  
! Y5 h0 b7 V% V  Q) a1 g  if(SUCCEEDED(hres))
6 a6 y& V- z2 L7 }% H  w  {
! K/ E9 M. @+ p. Y  char szANSIString[MAX_PATH];
  w, s3 l/ @! G1 n- v* q! M8 E  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
  ?+ z; ^4 ^7 r, d5 c2 Q  szANSIString,sizeof(szANSIString),NULL,NULL);   t8 m/ e/ ]% j2 _
    |* \9 [! Y$ ]- f
  cout<<szANSIString<<" : " ;
3 L4 ^/ O+ d) C4 L4 _' R& X  switch(vValue.vt) 3 e$ U; V9 w0 V! J' I
  { * L5 a# J. N7 s4 g# L- N1 P4 {9 V
  case VT_BSTR :
( E4 u5 C; s3 L# z1 R3 D5 f# x  wprintf(L"%s",V_BSTR(&vValue)); , m5 j: g( {9 L. d, @7 t
  break ; + m0 g  \0 t4 o+ r6 K. |
  case VT_I2 :
# d9 J7 ^5 @4 w( c+ B$ |1 W  wprintf(L"%d",V_I2(&vValue));
! m, {# A( X4 e" N: ~  |! Q  break ; $ r5 V  i7 Q+ T5 W. x, z  b
  case VT_I4 : . ^7 l3 N$ h! _3 R1 G
  wprintf(L"%d",V_I4(&vValue)); ( v: g0 C1 j& q& E8 X+ X# a
  break ;
7 h5 f$ e% |0 W  case VT_BOOL :
" [/ z0 h+ E2 B! e5 H# `; j# F+ K/ m  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE"); ( h& E/ R4 N3 Q% ]" k$ @# b
  break ;
2 R% Y6 ^) t( r0 G  default:
: S# \) C% T9 W' V" W. o- ]$ `  /*WCHAR tmp[100]; ( d1 Q; }3 B% L
  wcscpy(tmp, V_BSTR(&vValue));
8 g- J2 f# F0 f' O  char tmp1[MAX_PATH]; , b2 F% ?& t# ~- k
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1,
! s9 `) Q! q/ T9 }% O, y  tmp1,sizeof(tmp1),NULL,NULL); 2 F, {: w+ e5 Y  w6 l' v
  , w5 f" O9 ^' @9 _3 m
  cout<<tmp1;*/ ' W2 l4 U# J$ P; t( d6 z
  break;
; d& Q  t- T2 s9 W; x  } & o! o# m7 n1 W+ t! Q( N
  cout<<endl ;
' o/ R1 K3 C# @& H  }
; C, h& w7 g) ~) |, k+ D1 z+ l  
8 N6 t9 u3 [% _  SysFreeString(wsName);
( x0 v6 r/ b" X+ p9 m  }
" [0 e4 V2 d" ~1 @3 W  ]  
3 O; Z, \  Z" [) O+ ^1 j, G$ \) d  }
7 q/ i0 {. Y' `6 f  else
) e- T6 Z' L$ T, |3 R9 ?7 Q  {
' V3 K! h5 J/ `% `0 \  cout<<"Query for print queues failed. Error code = 0x"
- y3 t% ~+ b/ n) |) D6 N0 @  <<hex<<hres<<endl ;
8 [8 k- C( }& Q7 s! [  pSvc->Release(); ; P) p8 e: t. v# y. l; W0 S$ H) h1 ~; b0 B
  pLoc->Release();
3 O' o1 L# _3 r9 c  CoUninitialize(); 9 [% c+ N3 X: z8 J* q
  return 1 ; 6 r% T0 A- @+ T3 [: ?% \  H
  // Program has failed. 4 F1 R0 p+ x/ V2 J0 S  @
  }
; l( p/ @0 G& \* M3 K  if(pvNames)SafeArrayDestroy(pvNames); ) ?, j. W) ], G+ n; |
  }
) e( a6 |  u; I6 B( r5 I) C% S  if(pInstance)pInstance->Release(); , L2 U( x- t6 \1 U" e0 J1 U. q/ O5 G+ m
  
7 I3 u: @+ {' A5 i: d( M4 g( a  } # j1 S; z" R& o
  // Cleanup 9 z3 g- ^$ F  w+ @: g! g
  // ======== ) E9 T+ `. i5 Q$ w8 o) T! k7 E
  pEnumerator->Release();
, N% ?; k; b) c8 m! q  pSvc->Release();
. y/ R" d) H" _! m* E  pLoc->Release();
, m$ ?/ l; h1 z: Z  CoUninitialize();
# d" X( C  @5 f, ]  3 B. Z& P: ~4 q
  return 0;
9 M/ f* ~9 r2 c) F# c  // Program successfully completed. ) r, }1 }: b) q2 u3 |# p: N) d
  } ' i  W, O( ?2 r3 X9 ]
  //-----------------------------------# O5 M- x9 ]1 ?$ ]% X
  % u* b& Q8 ^( c; F8 V; o. j/ ^
  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到.
4 M2 ]( l; o; r3 k) s  
3 P3 @# m, H! e  g) c  void GetWmiInfo(TStrings *lpList, WideString wsClass)
( g# W# I3 {6 X1 b9 L4 _  {
1 f& c" u5 [3 j+ |! L$ h# K  IWbemLocator *pWbemLocator = NULL;
& g' n' B3 \( ~1 R" C  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) ' T9 W! p- _/ Q$ g, J  n
  { ) P) @: Q! E* m4 F
  IWbemServices *pWbemServices = NULL; . o7 W- x: ~( R7 Y. v* E6 z
  WideString wsNamespace = (L"root\cimv2");
* M9 n; m+ y8 d: D7 T( r  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK) ( i9 w! ?5 R+ C& U5 w
  {
0 \% ^9 f; u, x2 E0 v) y  IEnumWbemClassObject *pEnumClassObject = NULL; ; y. T. F0 m, Q: G: _0 A
  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;   S" `; w+ i# u# t) H
  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) & ^1 }: |  k5 @7 ~6 j; W
  {
) `' l/ @% z5 a  IWbemClassObject *pClassObject = NULL;
$ B  [5 |% K3 J- ^) K0 Q  ULONG uCount = 1, uReturned; 2 J8 ]; I3 V% z" i, L1 p: ]
  if(pEnumClassObject->Reset() == S_OK) % _, P( f# T- C8 Z
  {
. [2 w: N) J: h2 e, ^: q  int iEnumIdx = 0; $ r/ Z1 n* m% y: T% d
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK) 2 E, V2 U% {8 O" o* Y5 M: g
  {
/ O6 W6 v2 @! E/ ~  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); * e: B  K/ @1 P$ }( x
  
: O/ c' [% x7 d. i  SAFEARRAY *pvNames = NULL; 1 {3 A$ B. s4 Y3 k4 h$ f
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
, ?# G( F$ Q6 ?# G, _+ v) Z  { ' n5 G- p2 i4 O7 B* I9 G
  long vbl, vbu; ( o9 C7 x" W" ]. i3 ]
  SafeArrayGetLBound(pvNames, 1, &vbl); 5 ^5 N4 X8 k9 I- f3 z* j/ k
  SafeArrayGetUBound(pvNames, 1, &vbu); - m& B! t- U, c! I( J% d
  for(long idx=vbl; idx<=vbu; idx++) % g# h+ j; D, |  U! b% l# B9 e$ K
  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:01 , Processed in 0.018741 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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