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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^:
" S& f/ J: F2 ^8 z$ r! x  --------------------------------------------------------------------------------
% p2 A5 Z2 p2 _- R  #define _WIN32_DCOM
/ F2 O; W* z" B8 m% Y. b5 i  #include <iostream> 7 p, A2 A& n0 G9 T
  using namespace std ;
3 K/ A! [2 q* v7 }1 x  #include <windows.h> ) ]+ m) j* s) z, I. u( L
  #include <comdef.h> / e, j6 F: T9 L) z/ O
  #include <wbemcli.h> # M& j  {4 Q# e" d2 g
  
: e! |0 r5 ~% g  Y  #pragma comment(lib, "Wbemuuid")
) i' |/ d$ x7 {& I& L# f) a4 R  ( m& e1 s3 c1 _2 ?$ M( Q" }; q
  int main(int argc,char**argv)
3 d1 U. b- e# n, P" G4 r  { % G, e( r  I# Q$ Z
  HRESULT hres ;
( Q. z2 y. f/ x/ l1 C  
0 ^% b+ l, h. V) x  // Initialize COM.   N& i# ^( x% c" O. W- h
  hres=CoInitializeEx(0,COINIT_MULTITHREADED); 4 a- g9 ^8 C' A8 F/ T' F  @" S
  if(FAILED(hres)) 4 X$ k* a5 N0 R2 w+ y- D! B
  { 4 L2 S4 R  R; K7 b, `- w5 q, E) b
  cout<<"Failed to initialize COM library. Error code = 0x" & N/ I5 y9 q! R9 g& x
  <<hex<<hres<<endl ;
) {' K7 q5 U5 |8 |/ T0 Z* [6 L% ^6 Y  return 1 ;
$ H" a$ g& }; o  n( {) z  // Program has failed.
  ]/ [0 v4 i& N0 [  }
" L9 g, K! z# ?$ k3 H  S6 C# T& i  3 s6 m) C  X5 F2 x- T
  // Initialize ) }8 E. _* Q5 x" P2 C4 u" P$ _% p
  hres=CoInitializeSecurity( ( f# V0 e5 E) ~7 k% y# Z: Y1 e
  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
3 U% K, {+ `8 ~( c# ?  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
( W' |, H9 C. C9 c1 i. S1 }  & F: v0 K- ?9 I4 A+ x( [! C
  
4 s' i; A4 v, e# K) s  if(FAILED(hres)) . _5 k+ x: t3 M5 {# E  I5 s
  { - G' C  i# q2 L8 ^# e( c$ v( m
  cout<<"Failed to initialize security. Error code = 0x" ( D& N' D; J+ R+ u
  <<hex<<hres<<endl ;
% a0 \8 `5 S0 ^" W0 H  CoUninitialize();
+ P/ x) [$ n8 @3 b  return 1 ; 7 _8 ^; n% _/ Q0 W! V+ p& d9 Q
  // Program has failed. 2 |; y1 g9 X7 ^1 y9 r
  }
2 I3 ~/ B: {  x7 h) h  ( o6 t2 e: l1 _8 I: W+ n
  // Obtain the initial locator to Windows Management on a particular host computer.
: S+ |( H- f  Q2 e+ i& v  IWbemLocator*pLoc=0 ; : y  r* F5 j* \0 `& B4 e- s
  , H! ^  M1 f0 ~: T$ W
  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
% I) f: k# X4 m7 ]% v: p& f  IID_IWbemLocator,(LPVOID*)&pLoc);
. H) W1 Y. p" u) K1 U) l+ q3 t  
" P5 ^* z% j8 {  if(FAILED(hres))
2 O. D: ^' B9 v- X1 I3 ?; G  {   O4 A: e9 R0 e4 d: |
  cout<<"Failed to create IWbemLocator object. Err code = 0x"
  {; C0 \8 ^# r# r" o% P  <<hex<<hres<<endl ;
3 o' [$ o; A& y/ a8 A# G  CoUninitialize();
  F  @2 E, [6 B0 F. ~  return 1 ;
+ y! x, P7 ?8 Q' U* J1 r  // Program has failed.
: b+ q$ p" `& l$ d  } 3 l' u6 b6 L& O4 p6 z; [
  * K+ J) x. ^. V3 ?0 ^# e$ K' }8 e
  IWbemServices*pSvc=0 ;
, h* A7 C1 u0 a( ?& V  
( l% i6 [2 D3 a* A6 Y: n  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc $ [( i1 y& p4 k1 U
  // to make IWbemServices calls. / a1 i7 e1 R: c. l9 Q6 q& V; t3 u
  - c/ ^8 z! r. C% L- G/ c" c4 A7 t
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"), 2 ]. Y8 q9 E, S1 d$ S: a
  NULL,NULL,0,NULL,0,0,&pSvc);
0 j/ h+ y1 R5 O  m2 ~5 k  : \1 |! I4 z- i+ N8 t4 p' n- E
  if(FAILED(hres)) + f7 {2 V' N3 e6 f
  {
' _0 F6 d) e( `% b4 V3 I- X  U7 f  cout<<"Could not connect. Error code = 0x"
! {5 `6 \7 |8 T6 P7 _8 _  <<hex<<hres<<endl ; $ A4 o, g. F4 W* f0 t
  pLoc->Release();
$ m) }$ Q1 x1 k) e0 J* L( H  CoUninitialize(); + x. @" f5 S+ ]) B
  return 1 ;
% b) H% x: m! G; {  // Program has failed. & L  G0 a+ A9 l* S* l
  }
* u. x( j% G0 \  
5 n1 s- Z2 P5 k3 D/ w7 e  cout<<"Connected to WMI"<<endl ;
. K  |" U  N! S: C  
  C4 `" R; Z) {. k  Y0 y9 |  // Set the IWbemServices proxy so that impersonation of the user (client) occurs.
- U6 q$ T* m& G  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
: I9 t2 _$ v- i- ?$ m  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE); 1 {8 }4 b6 A  x! @7 w( w9 b  U
  
$ p  v9 x) K4 }8 y/ R2 z( I! S  if(FAILED(hres))
% m5 k3 L) j, [3 e  { & b7 Z) ~, x5 ^: r
  cout<<"Could not set proxy blanket. Error code = 0x" + a' `4 q8 R5 p3 A" R
  <<hex<<hres<<endl ; : J/ t2 Q$ g* u# N5 I8 }
  pSvc->Release();
3 f( Q, d$ M) z( C9 w  pLoc->Release();
; Z2 B4 N9 ?- s8 M' v  CoUninitialize(); 7 M  n1 M9 l! d! @# B8 O$ G1 Y" T: ~
  return 1 ; ) W! U) ]# R+ f, R  U6 B+ x& e
  // Program has failed. 5 C/ K: s# `& u# @- m
  }
' o% z, w! p' u! f  ' k& j3 T( E7 ~1 b
  
1 ^! c% B5 x- ?9 M% j, x' v  // Use the IWbemServices pointer to make requests of WMI.   K: q$ t" o7 b$ s8 y
  // Make requests here: / c' m2 E- F1 ^: T% Y
  + g, U5 r. a/ [) [
  // For example, query for print queues that have more than 10 jobs
  }7 V7 k( N$ T, E* m$ k  IEnumWbemClassObject*pEnumerator=NULL ; * d, G7 ]/ U  F% Z$ q
  hres=pSvc->ExecQuery(
2 u' U0 E* k7 ?8 ?$ a4 C  bstr_t("WQL"),
  z8 b8 }+ [. c, |$ _9 ~0 d( J4 U  bstr_t("SELECT * from Win32_BIOS"),
/ g; B3 P7 c" j$ {; I4 p/ B" l+ g7 H2 V  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
6 B6 X! Z& K4 m! o  B. l  NULL, * ?$ d. s" M0 Y
  &pEnumerator);   `1 O5 X) l# y  o7 C
  ! w* ^/ p/ X* @4 Z7 h
  if(FAILED(hres))
! E. H8 G# S( K5 ?6 }: x  {   P  |4 h; b$ q: B' p
  cout<<"Query for print queues failed. Error code = 0x"
0 _; c+ K, E, u3 X  <<hex<<hres<<endl ;
7 h, a  p1 N+ c" w) m  pSvc->Release(); . U. n; x  a( M9 N4 v+ c0 V1 T6 x
  pLoc->Release(); , l% o& |4 j; c1 S
  CoUninitialize();   y) s* N" d1 n; [  z- s6 [$ y
  return 1 ; " A, v, m! O& e5 n
  // Program has failed. 3 K% K6 B8 C  b1 h) P. W3 b
  } 3 p) I) _, m% V6 k" B
  else
% E4 q! a3 X6 S5 ], D- {0 U  f1 W  { . g: R, y/ R% M& T3 j+ I! C
  IWbemClassObject*pInstance=NULL ;
# v3 X+ [8 o$ Y  ULONG dwCount ;
8 t4 i( v" W5 k4 \. J4 F6 m1 f2 V  while(pEnumerator->Next( & t3 K1 a* g) D) Q7 x5 p# F
  WBEM_INFINITE,
- r: Y" |8 F% A. j: W  1,
) m8 {/ B: g1 x; r6 U& `) U; S  &pInstance,
5 P6 {, {! n5 J! v# L. T& @( X0 G  &dwCount)==S_OK) ) O; |1 s+ [9 O
  { , J, [! r6 i/ a9 J8 C6 G4 J, x0 ]. L9 @, O
  SAFEARRAY*pvNames=NULL ; # a- Y8 e. u+ v( I7 b; L
  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK) - i* n0 [# L- T4 K0 B
  { % ~1 u# m# F0 o" B- n4 P
  long vbl,vbu ;
1 C2 s  M0 ^& c) S9 g# g  SafeArrayGetLBound(pvNames,1,&vbl);
  L4 {1 f) d: O+ O7 I  SafeArrayGetUBound(pvNames,1,&vbu); 1 P3 o* Q) ^6 {, ^; B& D! t$ w
  for(long idx=vbl;idx<=vbu;idx++) ! e3 M$ S, Y& {$ T  N
  { - F. p+ D& o4 q; u. P3 c* ^8 o
  long aidx=idx ; 9 H3 W, W- ^9 f" K. n' {
  wchar_t *wsName=0 ; - p% v1 @. p( G6 Z3 o" X2 P
  VARIANT vValue ;
. y! m) f% V4 w- J$ K+ l* ^7 V4 s  VariantInit(&vValue);
# L# n* U0 e' k  
' `# M% t" h* L2 g& W4 I. L. G  SafeArrayGetElement(pvNames,&aidx,&wsName);
; u' k8 |' _4 E( C8 a" u6 ^8 `+ k  
' I; W- k- T* q5 P* ~* r0 b+ J  BSTR bs=SysAllocString(wsName);
! b9 s( P! J" C7 D8 ]3 ]  hres=pInstance->Get(bs,0,&vValue,NULL,0); 2 U# d, i  z& i
  SysFreeString(bs);
5 }7 A' y* Z1 @# X6 R* |6 h4 i3 E" E  . W' ^6 r( w5 {
  ) T8 C5 e' L1 V* M4 E: E6 w
  if(SUCCEEDED(hres))
4 H5 ?; I# d! e7 U3 _$ y) ~  { 4 o" V% x% p  @0 c
  char szANSIString[MAX_PATH]; : j* K9 H3 w# |8 c- I
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
5 L4 H9 H: R1 x7 M! G  j& v. d/ q  szANSIString,sizeof(szANSIString),NULL,NULL); ; v' L( j! d8 q- ]
  
4 p3 }& ]3 {8 l2 R3 A$ R* N  cout<<szANSIString<<" : " ; + ]; ?9 h2 [: U
  switch(vValue.vt) + U. @1 |* r) U& S2 @1 W4 u0 }
  { ! G+ S: a' Q" _# l; E
  case VT_BSTR : . C# ]  p5 \4 P. p! J9 Q- r
  wprintf(L"%s",V_BSTR(&vValue)); * C* ^1 v% ^7 n7 }
  break ;
8 q9 p) g- z! \* Y, E6 \* G  case VT_I2 : % D9 J* |; Q# t+ M8 i6 R3 L) a
  wprintf(L"%d",V_I2(&vValue));
- l4 W) F& _7 p! `% A4 W$ Q  break ;
  q% s  b3 g, Z" k9 Q+ ~  case VT_I4 :
! x! @1 d$ ]" g! i+ M5 z$ t/ x' e  wprintf(L"%d",V_I4(&vValue)); 2 r" |' x2 Y3 ]; }" F8 U
  break ; & Y1 r" v7 P1 v' y+ b( g
  case VT_BOOL : 6 u% X! A6 w  n  U; w
  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE"); 1 c; }* y. P2 W2 Q
  break ;
; n" a! W" x# J% z- Y2 _  default:
( K) D/ [' J6 E/ v9 v  /*WCHAR tmp[100]; # S- v( w' g4 {5 W. Q  M; R
  wcscpy(tmp, V_BSTR(&vValue)); : X& h( p: `  e3 ^
  char tmp1[MAX_PATH]; 7 h& l# H7 a" @" a. ~! j% V
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1, 6 `! @8 D: g! \, _
  tmp1,sizeof(tmp1),NULL,NULL);
% Y$ Y# ~; w2 N  
3 b$ t9 y/ N& Z1 K% T: j) g  cout<<tmp1;*/
! P: i3 f( ?  l7 R/ W5 N6 |7 \& O  break;
' Q# F4 P$ `0 Q. i/ o3 T  } 0 U2 i4 F6 s* M  g
  cout<<endl ;
2 F, n& m( p- }9 W$ G5 C  } 8 o5 ?: z& u" @, n
  
, B: f0 Z2 L) J& X8 }+ D  SysFreeString(wsName); ! k; W6 H5 X$ C
  }
1 h& O# e$ ^# j/ ]0 {5 n  
, S7 S* V; ?9 Y. D  } 8 n7 U( p$ y& O7 P# b8 Q
  else
2 h$ c2 W3 p2 r: k1 R# _1 L  { ; Y0 R3 o4 y) U* \, z- ]' m9 j* ]$ m
  cout<<"Query for print queues failed. Error code = 0x"
* B% w* d; H0 K3 o  <<hex<<hres<<endl ;
% B) E6 [  N9 b+ r% K: O  pSvc->Release(); 7 A8 e7 F/ V6 n0 ^, ?8 P3 u
  pLoc->Release();
/ ~0 D. G& D, m1 n9 a/ v  CoUninitialize();
% f5 j- }( i) u$ R  return 1 ; ) n- j4 b) ]+ p$ `
  // Program has failed. $ r' _5 [: i, y3 r
  }
& ?1 u3 @& e+ {5 U5 n# K% Z4 k  if(pvNames)SafeArrayDestroy(pvNames);
7 w& [7 Z: P# d2 N9 ^  } 6 X% M  g; E9 G& I# O, |
  if(pInstance)pInstance->Release(); ; |6 k, q& r) D* S# A
  6 ]* [) p$ R: R! u& Y3 z+ c
  }
6 I& s% }" G: A8 j6 m, M  // Cleanup 4 e5 _: x  m; ~6 N" s# _& z
  // ========
- D- D+ [- |$ |) `: v3 Z2 d8 |' B; x$ {  pEnumerator->Release(); * Q1 c* y* J; }6 q# x
  pSvc->Release(); 6 Z. R2 B. r9 t" G2 h# w7 m
  pLoc->Release(); . [$ A3 L( L" \& V, a
  CoUninitialize(); 1 z* {- t$ _  a) s" g3 u
  
& A4 o  L" K8 v- y% Z% Q  return 0; / E' u. Y2 s3 L
  // Program successfully completed. 8 q/ C6 M- g. A6 ~5 o6 K( f
  } ' q! ]# W9 H. ^$ V2 H8 m. a' L
  //-----------------------------------  y! |- F% S3 R0 r3 G9 M6 R3 W, u
  
% G7 T+ c3 O$ X( R4 X' q3 @  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到.
- l* p5 h1 h2 z+ E; P  - D3 S( ?! e9 L3 q' R
  void GetWmiInfo(TStrings *lpList, WideString wsClass)
- P  }2 E! [2 M  { 7 Y" [6 K/ s, _/ W7 H1 z; @
  IWbemLocator *pWbemLocator = NULL;
/ K( N4 F6 U! k  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) 5 b9 L  R2 N3 b  \% @3 \. E( e
  {
! @3 }, t7 I! M: H3 g; Y5 R9 _  IWbemServices *pWbemServices = NULL; 2 C. Z& |; L/ x2 @) e
  WideString wsNamespace = (L"root\cimv2");
0 d' c# E5 p9 y9 [6 O  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
0 @' K: i) _& \9 Y( J  {
8 _( q7 Q+ w1 |$ V$ C' U  IEnumWbemClassObject *pEnumClassObject = NULL;
5 Y6 p+ S5 Z' i7 g  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
% b' o2 j0 h1 `/ j  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) # z# C6 |0 B# q/ H# S2 H+ j$ u; d
  { 6 Y  _( N2 E% R  ~
  IWbemClassObject *pClassObject = NULL; $ |! `4 i# E6 p
  ULONG uCount = 1, uReturned;
7 }2 B$ @+ M% C6 ~  if(pEnumClassObject->Reset() == S_OK) - q0 r/ y# s) n, w) Y
  { : L4 w: l$ {1 p& U: q. L) @) s8 n
  int iEnumIdx = 0; - p6 I7 T% @) h' ^: X
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
4 R6 @5 B1 z- R$ b) Q" Q  { , K4 \; y5 ~* e: w& n
  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); 5 m- C! X2 s' A% ^5 S: [3 Q3 X
  
/ F% n% }7 P& d& {8 a- Y7 P' [! G  SAFEARRAY *pvNames = NULL; , L& C. `: P  w" K" i
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK) * \# h, p" a3 L1 o& ]
  { 3 P& c; h+ \, _5 A' }
  long vbl, vbu;
5 {8 C! `$ C0 d: D/ ~* E5 o9 E  SafeArrayGetLBound(pvNames, 1, &vbl);
5 K3 y) J- A, _& x' e, N. Q  SafeArrayGetUBound(pvNames, 1, &vbu); , |. R0 q8 M+ v
  for(long idx=vbl; idx<=vbu; idx++)
4 l; H2 l+ w- i; e8 t- a  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 08:59 , Processed in 0.017999 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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