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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^: ! W) v3 z* o2 l5 t* K% p7 v
  --------------------------------------------------------------------------------( r& O" ^* o' Z
  #define _WIN32_DCOM # _. R" ?1 D& b. m
  #include <iostream>
3 d5 G/ c6 w8 a9 P3 O  using namespace std ;
) L' ?4 N/ w1 w  #include <windows.h> ( G! S6 h6 g& V) B/ ~# @) U
  #include <comdef.h>
- s4 ^* b2 q3 A1 Q$ f  #include <wbemcli.h>
4 }* b4 U# k/ M  
) O# V9 w) j" S# {. K  #pragma comment(lib, "Wbemuuid")
" r# A, w% a3 d# b6 ?  % Q  x6 Z$ Q; E! Q" ^% c
  int main(int argc,char**argv)
4 r. {+ a; b! ~  { " N5 u7 C4 J! m3 m& s
  HRESULT hres ; 5 Q  F. ~# x8 G  s0 I# t
  6 Z5 n2 s: K% [, ]' d6 l9 ]3 p, J
  // Initialize COM. ; x* u, ^8 v0 R: K! k
  hres=CoInitializeEx(0,COINIT_MULTITHREADED);
8 p, U& H0 X( L  f% V  if(FAILED(hres))
. @3 B" U% j$ @  { $ ]& {. I4 `# U& R7 `7 x+ [) ?
  cout<<"Failed to initialize COM library. Error code = 0x"
( C7 n* L  C6 x: Y8 D' U, Y  <<hex<<hres<<endl ;
; W7 u' M  b+ T! a/ ~  return 1 ; 1 L$ ~% z) ~# {3 Z0 W" `
  // Program has failed. 4 f1 G$ G4 l# p6 S- U! ]
  }
6 U" ^: @$ r; ?8 e  
: P( b* o" N3 C. b/ Y" w: {$ N7 I  // Initialize + i# Q3 O6 X* n5 \+ n4 V
  hres=CoInitializeSecurity( 8 B3 I0 B' M8 {: P7 x/ f( @
  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
& t5 i/ n' p  L# u3 y9 G  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL); # n8 s8 i1 c8 M( B$ n' ?6 \! ^
  $ L2 n# r# q. b; @3 m, @! q; m
  7 b7 Y" W/ M( j- a
  if(FAILED(hres)) 7 e/ F# w3 w0 w! s: k2 T5 q% h. M
  { . |1 R) p$ ^7 o4 t  D
  cout<<"Failed to initialize security. Error code = 0x"
& [* d. h, F! W  <<hex<<hres<<endl ;
3 }1 T8 h; r1 P$ _  {  CoUninitialize(); 0 f) Y6 L% {) ~" B+ ^
  return 1 ;
! A9 b5 E9 F5 G6 u  // Program has failed.
9 x' g3 {& [2 b- W: \, S/ d  }
6 V- I# u( e- o& G  5 w9 ]% m$ h+ @# Y
  // Obtain the initial locator to Windows Management on a particular host computer.
( x) k5 }& f7 x% G) U  IWbemLocator*pLoc=0 ; # E5 f3 p/ i9 u2 S
  
8 a0 t, L" W2 F  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
3 S# Y5 |* R  z. H" y+ Z  IID_IWbemLocator,(LPVOID*)&pLoc);
+ X/ j3 B* m; Y4 q; G- z/ j- q  
* D2 K3 M  J8 @4 h) p; L  if(FAILED(hres))
" ]" R5 a6 o5 I6 q  { # r0 X0 Z- x$ g9 M. J  B
  cout<<"Failed to create IWbemLocator object. Err code = 0x"
5 K6 z0 n+ J5 y" L/ C3 y7 z' j  <<hex<<hres<<endl ; , F) L+ j' b# t) U! G0 J# i" M
  CoUninitialize();
8 E6 r8 F5 q( s+ a1 U3 g7 l% Y  F  return 1 ;   e$ W" T# g  M% o! s! B4 K
  // Program has failed. / I% Y' R- U6 e2 p7 H' Y4 w
  } : k5 X2 Z, s* o( f+ S7 k8 B; @
  
: c5 H! R# f% Z9 t9 T$ K. N  IWbemServices*pSvc=0 ; 2 y5 @4 b* ~6 Y: H% a8 x. {
  7 P/ [! k" p/ g( T! u
  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc
, j1 e7 R; A5 }2 G. ]* `1 ~1 N  // to make IWbemServices calls.
4 e6 G% C3 g6 n* H+ c  + a3 `  O& ?" K
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"),
1 {+ V* M* z0 ~2 v3 w; [. p  NULL,NULL,0,NULL,0,0,&pSvc); ) k. J* g1 H! |  C9 m* O
  
, G) K) v8 ~1 y- `6 `* A' N  if(FAILED(hres))   E% r2 f9 X  K) G/ \% H
  {
0 E. q4 g* S5 Y  cout<<"Could not connect. Error code = 0x" 1 {8 e+ t  F7 W6 g1 g3 T; d4 D
  <<hex<<hres<<endl ;
: E- |% b4 |) x  pLoc->Release(); ) V9 p( [  S1 n/ d
  CoUninitialize();
% `) A2 }: Q' X7 A, c' r  return 1 ; 2 k9 L2 H; ^2 m8 e  }/ _9 i) O
  // Program has failed. . l  m8 a& p: J& F
  } 7 ?4 D" `: C/ [6 n+ x  [
  
. S( T1 W7 ]  A! c! S# }  cout<<"Connected to WMI"<<endl ;
6 n( O1 J9 g4 c9 C5 _  8 d) B7 t2 N- v. G
  // Set the IWbemServices proxy so that impersonation of the user (client) occurs. # S$ G! n1 s4 N( @' c, Q
  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL, : |, c/ s% F9 e" U: Q
  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
( U3 a; L  h2 [' v6 x1 m: s  8 i3 I, N. p% R: y" Q! H* C7 x
  if(FAILED(hres)) * p% d( w7 k1 @$ T* r, ~; x
  {
3 v" b7 b( K! u( b; q: j% {2 b0 A  cout<<"Could not set proxy blanket. Error code = 0x" 8 W' F8 o# t: y* V
  <<hex<<hres<<endl ; 3 g0 W  {  u  S) ^8 a% q
  pSvc->Release(); * j( d& P& u& `0 Z  x+ I  \# _
  pLoc->Release();   c( x: v5 p- v* W- [
  CoUninitialize(); 1 H. Z2 m3 k/ `9 b! D; F4 I
  return 1 ;
$ `. i( M! L' K4 f) ]. ?7 k! R  // Program has failed.
" h/ D6 c' e% E! p  _* F* l  } : n! v1 S$ m  t9 {" l  F; w
  - U; t  F8 Q0 j; R: N; e( S+ G
  
% N/ [6 ^' r1 H3 h  // Use the IWbemServices pointer to make requests of WMI. * y/ f; R4 J4 u# x
  // Make requests here: ; ^" h, H: k: K  I2 m8 b6 R
  
' F: |( i, ]6 F- b2 x$ s  // For example, query for print queues that have more than 10 jobs 9 ^& c2 |2 H( r1 |: s: p
  IEnumWbemClassObject*pEnumerator=NULL ;
( `+ s$ @# |& {9 B6 y  N  hres=pSvc->ExecQuery(
8 r3 v+ H" ~2 }' ^" ^  bstr_t("WQL"),
) x! u* [: i8 n$ p! p/ V  bstr_t("SELECT * from Win32_BIOS"),
7 q7 L' e* W3 @% ^  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
  ~7 e/ s6 T  }' q: [+ d: W  NULL, ' U# s7 R8 @1 P9 k" x4 Z
  &pEnumerator);
$ c$ U9 u( J3 w+ h& l3 [  1 |# |9 h6 h, ^, p$ ~' T( _
  if(FAILED(hres)) # A7 g- _+ ~; {
  {
( o1 n4 o2 p" K6 @: X  cout<<"Query for print queues failed. Error code = 0x" 5 r6 Q: |) F' z4 g1 C% H3 p
  <<hex<<hres<<endl ; " U# e9 ~6 N2 p) Z! T
  pSvc->Release(); : ~: P, h# o. ]( r% O
  pLoc->Release();
1 l! {. Z, j& P' Q) X  CoUninitialize(); ! E) }0 a; d9 t" w, b
  return 1 ; ) x! X6 o4 R3 M) M7 C0 p( \4 G
  // Program has failed.
  H  c" N* P+ {1 q' T1 O  }
4 L" C; P! q4 Z$ [  else
* L8 r/ a; o. m0 j4 h  {
, d* U* G* e0 V# d4 ]' D  IWbemClassObject*pInstance=NULL ;
1 R, A* m2 ?' y9 Y* [  ULONG dwCount ;
: j2 s0 f, I3 R  while(pEnumerator->Next( 9 P! d. a) z$ a( m/ a7 j& g! _
  WBEM_INFINITE, 0 C/ K: \7 `% r6 t: V' c9 \$ |
  1,
8 s# }  b" G. U4 o: u5 `. K; Q  &pInstance,
) a$ {0 `, d; K/ o3 Q  &dwCount)==S_OK) . I- j5 L* ~+ J) X1 }3 Y* }- v
  { # p0 S' b  L  `* f* `% K5 P! h
  SAFEARRAY*pvNames=NULL ;
' O2 U0 f' T- n4 g) K% v  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK)   X5 c9 t  G+ ^* f) P
  { " p) a+ q# r2 |* y( K" w5 m. i' ^
  long vbl,vbu ; ( R2 P: {( H+ m8 s
  SafeArrayGetLBound(pvNames,1,&vbl);
% s" p- p' F3 q/ |# ]) X  SafeArrayGetUBound(pvNames,1,&vbu);
/ e! E: U9 u4 @  V9 K  b  m9 C' J  for(long idx=vbl;idx<=vbu;idx++) 7 K  z3 }& q9 ], [. E" D
  { " O# k7 }) Q$ A& W$ u, T) R$ x
  long aidx=idx ; - _7 }: O8 O1 ?- p
  wchar_t *wsName=0 ; 3 x6 E) j, f" q; Q
  VARIANT vValue ; # `$ J* }" |- O, ~
  VariantInit(&vValue); * `* F( u2 w  L& r5 H5 T$ s
  " P' a4 ]  _+ q+ m
  SafeArrayGetElement(pvNames,&aidx,&wsName); 6 E9 t/ u6 `- [- S1 O
  1 y2 r. T( B! }- q) W8 Q
  BSTR bs=SysAllocString(wsName); - q2 z0 D$ q8 ^# _
  hres=pInstance->Get(bs,0,&vValue,NULL,0);
9 j) M! @0 m7 d6 q. l* n  SysFreeString(bs); ; _" w/ i8 r, D% n  W
  
/ [% G3 l5 E# C! w5 a! @5 x  2 b7 f& e. L$ }/ X
  if(SUCCEEDED(hres))
9 i: T, d, |5 S1 b/ U9 _- m8 v  { 6 @2 _; m' G9 f
  char szANSIString[MAX_PATH];
' N; v9 Y, u' n6 o/ a  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
5 j" t( `- B5 F2 n  szANSIString,sizeof(szANSIString),NULL,NULL); ( i% q3 F  ^+ k, b2 [4 w5 X/ F. J
  
4 q# L8 V* L8 q" U" L7 k" j  cout<<szANSIString<<" : " ;
- `& L1 ~4 Z: T+ j% D) v  W  switch(vValue.vt)
' i4 A( r4 y% m6 H5 v2 P  {
& W( Q1 L. h) n' n  case VT_BSTR : 7 T) a! H' Z) U3 x. k" L% C& C' e
  wprintf(L"%s",V_BSTR(&vValue));
+ \' N+ D, @& h; V, _# U  d! Q  break ;
8 K, X6 h5 M- f  case VT_I2 :
1 h% d" ?! P" A- V  wprintf(L"%d",V_I2(&vValue));
- ^9 {/ n* S$ W5 o" |9 _' [& f  break ;
; l0 ]) B% l5 k2 t4 a  case VT_I4 :
1 |# x1 M# _' y- ?8 z  wprintf(L"%d",V_I4(&vValue));
4 y, f8 g  A" w9 a7 A  break ;
+ x+ I3 _/ J1 |9 l. d  case VT_BOOL :
# T1 z: J% s3 d3 m& f# O1 Y2 L7 R1 f  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE"); ) y" C  d0 p. |9 c1 y
  break ; ; w8 ?) r3 G8 s( r' ]
  default:
7 j* ?1 s9 q. t3 l- ]' f2 y3 g  /*WCHAR tmp[100];
6 C" g, e& \6 R  wcscpy(tmp, V_BSTR(&vValue)); 4 W' X7 Z! e" X  n: m2 B. r
  char tmp1[MAX_PATH]; 2 ]5 l7 G7 h" ?+ W# b; S0 [- w% [% }
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1,
  F6 a' E0 o; c$ N* k  tmp1,sizeof(tmp1),NULL,NULL);
2 r( B! A+ j/ O( Q. g6 ?: Y. e  
; g9 l) Y0 \% @2 a- ^  cout<<tmp1;*/ 5 [2 s, N5 p% X) _8 w
  break; 7 I. ~+ M7 o8 a
  } $ |: |5 P- d* w  f+ V- `* l
  cout<<endl ;
3 G. }; x2 N7 F$ Y. j7 y  } 2 \) B( g1 J8 j
  9 x$ L) Q4 x3 S! p; W; J
  SysFreeString(wsName);
: K: ~/ t: L3 p3 H  } 8 u7 C' X& R. L* a/ ^
  
9 Y5 n- H$ f  |0 @  } . V9 k* f( D0 k3 k& f( G" Q
  else
1 C6 S; P1 X+ v/ F4 Y/ _  {
1 a# i) f+ {4 h% T& T6 l! n  cout<<"Query for print queues failed. Error code = 0x" ) \% l# \  _( `# M
  <<hex<<hres<<endl ; 5 ?5 [+ i9 V7 q/ `. X3 H
  pSvc->Release();
1 q- {4 J# Z+ t6 P: I/ ]  pLoc->Release(); : w% s5 y1 f8 E/ k3 Q
  CoUninitialize(); - j* M- K' E6 A) z( w! m
  return 1 ; 6 L& D$ o+ ]4 K
  // Program has failed.
: T2 `2 S+ L: p) m. W  } . b' p9 j7 H: I% M' g
  if(pvNames)SafeArrayDestroy(pvNames); 8 w" \9 B$ @) ]# ?7 i
  }
1 U6 k' ?8 [& |$ T1 ?; m8 U  if(pInstance)pInstance->Release();
- o: y5 u+ V; U6 \  ! X( @/ ?7 B$ n- d6 ~- s
  } ! L* x! m0 ]5 h0 r2 M2 ]& L3 H
  // Cleanup : P( G1 ?0 K1 [: U
  // ======== 8 O* [* [9 L/ m
  pEnumerator->Release();
; v6 |9 t: P+ q2 {' e5 \: l  pSvc->Release(); ; e. p# x: u4 J
  pLoc->Release();
+ e% ^2 M# ?) G- Y/ G3 F8 g5 K' t  CoUninitialize();
1 z* w8 A7 s2 b! o/ M# f  
" @4 Y' L! a3 V) ^8 r5 t" D. B  return 0; / a( {0 P0 I) i1 R3 K, u, J  y
  // Program successfully completed.
: Q& c3 H* Z0 z& \+ `# U( d$ u* F  } 2 x8 ^0 ~! \8 h2 j+ K+ ?' k
  //-----------------------------------" ^- G5 ?+ A8 H3 O: K
  
; n* J8 W, J$ t' q6 U# A  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到. . `8 t4 v2 W( A/ s6 l% F2 }" q7 [
  . I+ j3 `' O. g
  void GetWmiInfo(TStrings *lpList, WideString wsClass)
; U0 [0 t# z( m4 g  {
2 z7 Y/ |* I; E' U$ }' f0 G  IWbemLocator *pWbemLocator = NULL; / [0 P% a3 |1 X9 ?
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) # b! O- _: A3 w0 `
  { . y7 h; T/ d6 j$ |2 p/ H
  IWbemServices *pWbemServices = NULL;
$ f( x- o  z; D  M. k: |  WideString wsNamespace = (L"root\cimv2"); 9 C) C1 v6 T8 H/ @4 s8 s
  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
" C9 \4 j: g, k1 A9 n, `  { 2 G$ n' u( S8 F+ v- C( p
  IEnumWbemClassObject *pEnumClassObject = NULL;
. T! a: W5 F1 Y; s8 {) w  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
. M; u& A5 N3 ?  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) * x7 ^2 p; C6 ^8 J8 ]# y7 e
  {
& ?9 b4 E% B. R$ y3 K7 ~; w  IWbemClassObject *pClassObject = NULL; & G6 v5 `0 ]# R6 V- ~
  ULONG uCount = 1, uReturned;   K* g2 \* V9 e) j
  if(pEnumClassObject->Reset() == S_OK) 0 F6 x( J& z9 W5 h
  {
0 L3 U  R  O0 |% @  int iEnumIdx = 0; : f, [3 z% G6 R: b8 O% t" L
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK) 2 X. \' ~% y9 U5 ]
  {
5 x- O3 X+ m$ t$ L' k. o8 a  k; P  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
1 s$ l& n/ ]( z6 n  
; m/ |& w: f5 F( t- B5 A+ t. P  SAFEARRAY *pvNames = NULL;
- u' ]8 ^$ I) P: G9 E1 e$ n  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK) & F2 W' b6 w( e- }+ w  X+ O
  {
$ H. L2 M1 y/ C& V. T7 U! m% j  long vbl, vbu;
4 e9 F3 }" R: `  F! {% z7 d9 F+ o  SafeArrayGetLBound(pvNames, 1, &vbl); ( Y4 b& c. p- p& D, M! Z: G
  SafeArrayGetUBound(pvNames, 1, &vbu); 2 ?2 N5 ]% {! V' J! W7 {% S( \
  for(long idx=vbl; idx<=vbu; idx++)
# k5 a" p  p( c' s- r" n  H  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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