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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^: 3 X1 ^  P3 B! n7 v, u
  --------------------------------------------------------------------------------
7 T1 S) k1 u% h( V1 O" x9 @2 p  #define _WIN32_DCOM : W& _: W5 A* G4 p/ g9 r
  #include <iostream> * o/ Z% K: d1 i, W
  using namespace std ;
7 z2 F9 j% J4 c/ H( A. Y/ J  #include <windows.h> - `  R7 ]6 T/ q
  #include <comdef.h>
( [4 ?6 ?: f/ Z/ @2 I  #include <wbemcli.h> . [( Q- T+ ^# }- E6 O5 X) E
  % h% m/ ?1 `0 c. q0 ?: L) f* x6 r
  #pragma comment(lib, "Wbemuuid") 4 Q$ B9 Z1 n0 J& Z& D4 Y
  / O& m" l  i# M' a- d
  int main(int argc,char**argv)
( t! `" e: v& e. a  {
0 U& G. W9 u8 e0 n. q# T, {  HRESULT hres ;
  {+ r3 Z+ T! S( G9 Q$ d  2 Z* t5 f! J' m9 T4 w6 i
  // Initialize COM. : x" z: Q& R( [
  hres=CoInitializeEx(0,COINIT_MULTITHREADED); 4 D/ C5 }7 Z8 F: D
  if(FAILED(hres)) ( \8 \( v" A$ Q* Y8 I) ~! u
  {
. e. q& y5 o( F  cout<<"Failed to initialize COM library. Error code = 0x" 4 B, q$ U; r6 Q7 A+ n7 D
  <<hex<<hres<<endl ;
+ k6 y# ]' p- f% G+ c- c  return 1 ;
( P! i, J1 y. v! M) Z3 K  // Program has failed.
  j2 [  `+ h5 `) j: [' ~: o! Y) c  }
. B+ ]0 E5 O: W/ C! x% g9 h  
" `" g8 U( P$ W  // Initialize
+ K- e& x6 n' ]  r/ J- \' F2 t+ C  hres=CoInitializeSecurity(
+ P$ n3 O* M0 e4 x  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT, 1 b4 i7 _) p+ J5 |
  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
" e$ K/ U6 @! Y& f" s' f  3 L0 D8 M1 A) H8 ^  F
  7 q! O2 v5 _: R* q. w: k; U2 F& J
  if(FAILED(hres)) - {0 M$ {' a- Q, t  l* f) @! S
  { % I+ S4 D9 D* V4 a: y& }
  cout<<"Failed to initialize security. Error code = 0x" 2 ~( E, p6 a% Q8 \
  <<hex<<hres<<endl ;
( r! ]. o% `2 |9 |0 f) B) Y  CoUninitialize();
( t: p1 y8 q% l" B; f  return 1 ;
9 z- Y: B& E5 d; Q) T$ Y3 E; M  // Program has failed. 1 `4 k8 U5 v: y; g+ H) b
  } % G% M7 W+ _* `" r9 o
  ) |4 y3 [0 a* J0 B
  // Obtain the initial locator to Windows Management on a particular host computer. 0 B) M5 c9 q/ C6 `, I
  IWbemLocator*pLoc=0 ; 6 b4 h* U' X/ k' l. q/ w; T
  ) i& T$ h5 ~2 K" k2 T
  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
% J  n) k) G! A4 Z4 p, \  IID_IWbemLocator,(LPVOID*)&pLoc); * D: |7 E$ Q. E; [; r# l) `3 ?2 W, D
  
; c; a6 Z( J2 ^0 }; ]  if(FAILED(hres)) . q9 \7 n( l3 K; J$ M8 S  V8 C
  { 7 H2 ~( G6 B0 E
  cout<<"Failed to create IWbemLocator object. Err code = 0x" 3 ~( j3 Y5 o' c; M) }/ n* h0 s
  <<hex<<hres<<endl ;
. i. V. T+ Q  o" y  CoUninitialize();
0 ^% a' q; p: c  return 1 ;
4 n. x3 M0 r; Q7 J/ _5 \3 v  // Program has failed.
- L1 j* Z) E5 y5 Y. O8 T. N1 E  }
$ g( I) g. ?$ @* p) e  - }2 h/ [9 }3 y" u& _) p. E
  IWbemServices*pSvc=0 ; ! A, X' v0 _6 f" j* L3 f4 f
  5 E0 V! x4 i' ?; V( o; u
  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc # [$ B$ g3 m( Z
  // to make IWbemServices calls.
; q3 X+ E- S: B5 W, Y( B  
" s; l# s% K( A2 j9 h) ~# \  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"), 8 H* t$ N( F0 r' j$ U
  NULL,NULL,0,NULL,0,0,&pSvc);
( X1 s7 D$ \( s# [& z- P  
& \7 n3 d1 T* f9 U4 E( f9 ~* P  if(FAILED(hres)) . e3 e* x, r. w
  {   T4 c/ ]5 O; a5 o+ y- ?+ E; D
  cout<<"Could not connect. Error code = 0x" 2 [+ P' ?. z9 j  B$ o
  <<hex<<hres<<endl ;
4 D# M" V6 F# V- Q5 Q# T* V  pLoc->Release(); 4 N6 K+ G5 I  F7 }
  CoUninitialize();
* V1 _  W! J5 y2 J3 `  return 1 ;
% \* R6 _5 J/ i7 u  // Program has failed.
5 ^( |+ ~. C& F8 N6 X  } , m, e2 ?* T, O5 t; b: V% H/ m
  0 q* s1 r1 Q; P" \# n# x
  cout<<"Connected to WMI"<<endl ; ' p" j! {" O7 [  D4 a) Q
    s& e# Z! ^3 g5 j* U
  // Set the IWbemServices proxy so that impersonation of the user (client) occurs. / _; B' {" A6 ?' i" B' W
  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
! H, K+ t) e$ w: @; n3 C  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
7 T. J" ]; d1 `0 W+ p8 E, k' m  o  
$ x- h( y9 o2 t5 `/ A0 r; Q$ q' n" {! U  if(FAILED(hres)) , M2 y: R& p) Q* a7 M! D- b# j
  { ! N$ e1 c5 L2 R! P' t4 [4 X
  cout<<"Could not set proxy blanket. Error code = 0x" , D8 P) g2 p6 _0 x4 L2 [0 r
  <<hex<<hres<<endl ;
- X( {9 T0 C0 z! D  f+ T2 n) R  pSvc->Release(); , P( V2 c) }( O3 V; P. Z3 p4 m
  pLoc->Release();
% \/ O  H# _( O' A8 E  CoUninitialize(); * }4 K+ |* w1 Z# X
  return 1 ;
# l% h) g3 W8 h' N1 L6 S# M  // Program has failed. + M6 ^6 r, L; @0 v  j& ^* I; N. L$ o
  }
; {% x; j2 P2 g4 @6 Y2 E: u" r  4 N2 F  {$ ^0 \" ^
  ! Q, I- O% @0 i9 @6 g8 C8 q$ s0 N6 u
  // Use the IWbemServices pointer to make requests of WMI. 7 p9 L1 s5 _: H1 f- N
  // Make requests here:
" p8 j9 C+ [" K# y0 }% b- C9 w  8 ~8 K- z: G  k8 [9 a0 i7 i
  // For example, query for print queues that have more than 10 jobs
4 _- N( Z5 s: X( H  IEnumWbemClassObject*pEnumerator=NULL ; 6 {4 N7 ~* }, r
  hres=pSvc->ExecQuery( 0 ~/ Q% ], T) \8 P; K5 L& `; X8 J
  bstr_t("WQL"),
0 ~# H7 T9 V/ k0 P  bstr_t("SELECT * from Win32_BIOS"), ) y( z5 Y3 m' @* g2 f
  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY, ; ~, |% ^" u4 t( }! ]
  NULL, / G* G8 z: E- q6 x) J- t
  &pEnumerator);
  o( t' F, F  e4 g0 c  0 C# _' k5 N: _" Y$ O. O
  if(FAILED(hres))
% t/ B+ ~) |: s  { 1 I' K, E! y- M6 f5 F; A/ S
  cout<<"Query for print queues failed. Error code = 0x" $ G( p/ a1 z: P' n) U( B. Z6 c
  <<hex<<hres<<endl ;
$ \4 n. a8 q* q( ~' P- a  pSvc->Release(); " Q% N4 H+ I) p9 \, A
  pLoc->Release();
% }7 \. \: E) B* l; k  CoUninitialize(); $ T% _6 l$ H& _0 W; J
  return 1 ; & \/ Y$ q) ~% ~5 x7 t
  // Program has failed. - l1 g  a' r" y+ j
  } ; l! i8 {. s; @- i4 D
  else
  h* w$ I8 a, V! b3 F; [5 _  { % j, T1 _, V& z! g; E
  IWbemClassObject*pInstance=NULL ;   ?; O. t+ ^5 p: P, i2 o
  ULONG dwCount ;
: J2 H; o- g" ^  while(pEnumerator->Next( - @$ q2 L! f8 t7 O+ X! t
  WBEM_INFINITE, ( I2 v6 [6 y3 h$ N! H0 S7 b6 s6 F
  1, & i2 A9 y: `' j7 [
  &pInstance, ' y# ]* D( m1 ^" e" D0 D
  &dwCount)==S_OK) 7 N  t, @; h& g3 x, |
  {
! j& y1 h* [: F& K  SAFEARRAY*pvNames=NULL ; 8 Y, c7 i7 n. _  ]4 M0 R
  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK) , r/ S. W* R% Q3 P
  {
8 s4 q+ v1 M" f2 t% _) F" }/ r  long vbl,vbu ; * H! V7 A# g/ F
  SafeArrayGetLBound(pvNames,1,&vbl);
3 q6 T) f: Z% P4 ]  SafeArrayGetUBound(pvNames,1,&vbu); ( {% r3 i3 Z1 f' g0 o
  for(long idx=vbl;idx<=vbu;idx++)
5 y, T- y9 S4 o+ s  X  { ; J9 t" s9 A; l+ P- o4 m5 l4 c" ^- h1 Z
  long aidx=idx ; 5 t3 p) k- G) q$ T
  wchar_t *wsName=0 ; ; x  a. ~3 o7 S1 r/ |; K2 Y
  VARIANT vValue ;
  Q5 l# d" x: o1 u  VariantInit(&vValue);
/ H4 H' a* {! k) w0 D  ) W, Z& p4 h! e. \$ Y. i9 a" s
  SafeArrayGetElement(pvNames,&aidx,&wsName);
7 o/ k, K/ ^; v6 J( ^  
' s7 x, H9 |& S/ I" ]2 a  BSTR bs=SysAllocString(wsName);
$ x; `' v- x# a  Q3 ]  hres=pInstance->Get(bs,0,&vValue,NULL,0);
) B' h: o- Z. F/ j  SysFreeString(bs);
; ~0 Y1 H. n0 D$ z4 |  
: n, ~, v/ Y* y, F6 J5 c  
: P# T4 y! y( I  if(SUCCEEDED(hres)) + m" h  N, ~1 \/ D0 G
  { & H% {/ g7 O4 s3 z4 Y) J& |; |+ b
  char szANSIString[MAX_PATH]; 3 s2 x7 d0 |6 F: B) K, O; B) O! Q
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
9 G( k# N$ q9 f2 }; A7 f  szANSIString,sizeof(szANSIString),NULL,NULL); 7 M! S5 c7 V" c, |  x, c
  7 b) ~  n3 _$ E
  cout<<szANSIString<<" : " ;
+ D$ m6 q/ J0 q7 [7 u) Q' u% {  switch(vValue.vt) 9 p- E& r0 G8 O% F
  { ) T. x; k  y: C1 n  r5 S% j
  case VT_BSTR :
9 R5 f; Y! @- p0 t! s5 q- O  wprintf(L"%s",V_BSTR(&vValue));
' m" @  ~& t% _& v/ Z, n' A4 U  break ; 8 r- [0 w5 X8 P" z1 ?- V; M
  case VT_I2 : & N) J8 \4 t' }: ~: Y
  wprintf(L"%d",V_I2(&vValue));
* n2 X. B6 b: a; [7 \  break ;
6 n8 |2 y# C5 L- x0 r+ ~  case VT_I4 : 0 N/ h& f& ~/ g. T: h, _4 q
  wprintf(L"%d",V_I4(&vValue));
, [* r* @" |& t& o0 K" f  break ;
, f  V* ?" C7 [! l  case VT_BOOL : ( x0 O0 d: ]. Q, v
  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE");
- G& l+ v0 e! d. s& }2 |0 G  break ;
' Z( N( r: a1 z, I/ ?  default:
' h, R6 [7 e! ^$ s7 C- p1 v  /*WCHAR tmp[100]; ; D, G4 ~/ s0 c! V7 [# j6 L, ~
  wcscpy(tmp, V_BSTR(&vValue)); : E  g" z4 q- ~/ x
  char tmp1[MAX_PATH];
$ k, Q* B4 \5 z& R5 K5 ]  O  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1,
, x. m" [6 K; A2 p  tmp1,sizeof(tmp1),NULL,NULL);
2 ]% A2 {; o# O- b. @6 \8 L# Z! `( p  % t) g# d$ f5 I* V# m. m; I
  cout<<tmp1;*/ , S2 S' |3 v: a+ M) o2 _2 `% D6 J
  break;
8 I/ C( n% A; k# N4 ~1 S" ^2 a  }   e8 K! k6 n, u
  cout<<endl ;   W9 ~! D8 z" K7 h% F- n& ~: o
  } 4 a* G8 m# {5 ?- _) A
  2 t8 j( q) i4 `* S
  SysFreeString(wsName); $ q+ X1 }/ {4 s% c9 i8 _: y2 T* D
  } ( E+ D. ~' \& i3 ]) ~
  
: h' l  q2 s2 T! S" Q  }
- V/ T: R/ Y8 ~; M' e/ x7 f% @5 A  else ; O0 |0 Y. _* C; q; U
  {
2 I8 ?! O+ H4 `5 h  cout<<"Query for print queues failed. Error code = 0x" : u; A4 w5 V7 H+ c
  <<hex<<hres<<endl ;
2 A3 v& s% W; |  pSvc->Release();
4 S, n* h3 l2 d4 O" T  pLoc->Release(); ( P9 o* z- V4 o& I* j( s
  CoUninitialize(); : m* C- n9 L$ J4 h% X! G7 f
  return 1 ; 0 r* t1 s! J) d) q. p
  // Program has failed. $ A/ Q% @" ^" x2 @( C
  }
4 D  j; x, U. M4 V+ V  if(pvNames)SafeArrayDestroy(pvNames); : Z/ x% B/ ]6 O" N, L8 _* `
  }
2 C& h1 t1 }. v0 }1 \6 |; B+ V  if(pInstance)pInstance->Release(); , Y7 F2 R" A/ B$ L, S1 k3 W9 Y
  ' k" h$ Q2 \7 t$ ~% ]  H; B( U; O
  } 3 C# s6 n) j  P  n$ t$ p" o
  // Cleanup # h: A( \' G# ^( r/ M$ |
  // ========
. N, `! o! X# Y* C6 _: n5 {  pEnumerator->Release(); ( i3 V) V+ p6 A. R$ W% B7 q1 n! a
  pSvc->Release(); 3 [/ v( N+ m; b  Y! P" ?
  pLoc->Release();
4 R& \6 ^* c" |, Q' j  CoUninitialize(); % R. E6 n0 k5 P* o/ n- j3 T
  0 n% E& v, U  N( ?+ j; b& P
  return 0; & o" u2 L1 {- A6 `$ X, b& Y* b
  // Program successfully completed. 2 @; M& b4 L/ O6 ~2 }3 ^
  } * c6 Z) G6 N: ]; H0 T5 h4 ?6 u
  //-----------------------------------! I) l- x% |) p# M7 H: P  v
  
9 B! a5 C6 f! e: ~* ?  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到.   X- P" h- W, `, y& r
  
6 a/ ~# u3 ~6 N, e  void GetWmiInfo(TStrings *lpList, WideString wsClass) / U  X4 w8 ]. `
  { ( t/ U* R# D$ B' B9 U
  IWbemLocator *pWbemLocator = NULL; 7 v0 \* _7 [3 q+ w' ]
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
) q7 f, ?" j6 m* [  Y2 F( w3 f/ e  { 3 S9 x3 D7 p( ^3 V2 y
  IWbemServices *pWbemServices = NULL;
) C+ u/ P8 m: y  WideString wsNamespace = (L"root\cimv2");
. C" t% [% Z; f4 \" {/ C! G  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK) ' i4 i: Z! t, w8 F0 V
  {
. |/ u8 Z) Z8 y1 y5 ?8 j  IEnumWbemClassObject *pEnumClassObject = NULL;
- x$ n& Z% u: p  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
1 I' f  O$ ^2 c7 w* m  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) ( k( \7 s& |. n4 I
  {
! E6 n4 Z8 D! Q0 ^8 H  IWbemClassObject *pClassObject = NULL; ; N) C  b5 s! w
  ULONG uCount = 1, uReturned; / x( T$ P" u% K. L
  if(pEnumClassObject->Reset() == S_OK) + j( [. Q4 T  e% B& Y- ^  ^1 ?' U
  {
- D+ s: z1 F* \* @  int iEnumIdx = 0; & U' O8 Z& N) H% f+ y3 s' e5 L& B
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)   Y6 P# `) S- j9 G6 T% y) @' M$ v
  {
7 I8 p9 o  U- d9 S+ a' }" A1 h  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); 1 U4 A9 `% B" L+ p
  
( I8 e/ T1 w; Z0 z& n3 \, g+ C, e% w% [  SAFEARRAY *pvNames = NULL; ; ~7 @7 P2 @! Z) h& T6 L" |
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK) 9 [; R% M: r7 q) z) g0 H7 h: I9 U/ o
  {
" l5 s; S: ?$ r6 E7 q9 q& Y  long vbl, vbu; ! U" @4 i; q; }: s# A# L
  SafeArrayGetLBound(pvNames, 1, &vbl); 4 G9 x4 j) \. {
  SafeArrayGetUBound(pvNames, 1, &vbu);
, \6 ~" t5 n" Q; M7 g  for(long idx=vbl; idx<=vbu; idx++)
( o2 W. ?+ l" w- M& n  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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