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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^:
. M0 O+ z7 I3 a/ ^$ }  --------------------------------------------------------------------------------
4 o; F; D7 b( p* t; {) p6 J& i  #define _WIN32_DCOM
7 G0 [2 B6 E9 E7 [  #include <iostream> 6 }  h/ x+ y& x0 H
  using namespace std ;
) z2 q6 S; c- @  #include <windows.h>
; l  r4 V9 f) I+ L  E  #include <comdef.h> + K, `$ ^+ l! U; n& _* b
  #include <wbemcli.h> + x8 D& d) `$ b# {3 ]+ V
  : r: r0 S, l4 K0 G1 g# P, K0 ?
  #pragma comment(lib, "Wbemuuid")
" z& ~; y: u$ ^  
! a. c& A7 u' A. b  int main(int argc,char**argv)
6 B" p" O% `( C) c; h7 F0 v! _  {
0 x' G' b9 ?1 n. Z3 R  \6 v  HRESULT hres ; 2 j5 z( N2 p8 F) [. }+ a: V: b
  
& R' e8 W1 n+ R2 H7 f; N  // Initialize COM. & y3 q) g3 \* R+ X2 M
  hres=CoInitializeEx(0,COINIT_MULTITHREADED); $ }; }1 }( n0 R7 _' h
  if(FAILED(hres))
3 U+ D8 g1 d+ D' Z5 C( N' K  {
: [  F. I2 b" `; \+ p# @  cout<<"Failed to initialize COM library. Error code = 0x"
6 n) ^6 }: L( [+ L  <<hex<<hres<<endl ; & M" i- [  T0 }! x
  return 1 ; + f2 L2 c" j, Z) u+ m& J: _% d
  // Program has failed. ; ]+ ~/ p9 Y/ D0 O8 P( T# Z
  } 2 l" d: ^8 j" e1 V8 @* @8 f
  
. h# o0 e" L6 \8 S3 L# N1 [  // Initialize
( j0 D5 S. ]$ e- Y6 ~  hres=CoInitializeSecurity( & P* X1 u, Q' x# H. \- E; U
  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT, 9 a6 b8 N: H+ I3 ^8 j$ u
  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
. c9 n3 U3 S4 d4 m+ v  7 f/ G" q. G7 W, V9 d  q' b2 r1 e8 y$ N
  . h& m- r" \# l5 N0 n& M; |
  if(FAILED(hres))
- b4 v+ Z& @3 u# n7 s% ^" f& f7 C( s  { " k; H" e% y8 i
  cout<<"Failed to initialize security. Error code = 0x" . Z& m0 l  b4 ~- F  Z% t7 ], N  Y
  <<hex<<hres<<endl ; 2 z) N+ H. u: a8 H7 f0 U
  CoUninitialize(); $ V3 q5 \9 a) M* D
  return 1 ; 5 [9 H8 n  _; L! l! @$ J
  // Program has failed.
1 Z0 z, c3 P2 k  e* a8 o  }
0 E/ a, M7 o9 ^  
2 P* Y% n; V: i6 P4 R5 c( a  // Obtain the initial locator to Windows Management on a particular host computer. ( X1 O) q  ?. {% E! |
  IWbemLocator*pLoc=0 ;
( T4 U; h7 ~# n  
" U$ `; _5 y1 W" f$ M) d- ^5 T. H  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
/ U) \- d( z4 Z5 ]! q6 `  IID_IWbemLocator,(LPVOID*)&pLoc);
0 E% C* h& C3 f  / r1 E4 G" x7 u* w
  if(FAILED(hres)) 5 R( z, B& v+ q4 k
  { ! ]+ l  x6 R2 g4 u& M
  cout<<"Failed to create IWbemLocator object. Err code = 0x"
* U) {" [& Y& e! A  N, C  <<hex<<hres<<endl ;
' b# X" R0 E8 R+ ]! S  CoUninitialize(); 4 `* _% D5 g+ t
  return 1 ; 5 [5 C; [; p7 ?" r7 S! y
  // Program has failed.
, K- ^; r. v& O6 U9 Z) H# U  } , X2 |0 O$ c# ^* n- h; f2 t  S
  
, Y- W2 `0 n+ F0 d. @3 K+ j  IWbemServices*pSvc=0 ;
* I& I# q3 u- [. C  ) b8 @7 x- Y5 Q9 {  {( A" f
  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc 2 L* d- \* [: X0 F  q
  // to make IWbemServices calls.
! Y2 N, M2 f8 e$ r$ X  / l& V3 R, o! n6 d/ L1 [. f/ I+ |+ h
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"), ) h3 D0 I* f$ H5 i1 P" Q1 H* {
  NULL,NULL,0,NULL,0,0,&pSvc);
. t. j5 N0 W! y/ B9 u  
5 X3 L: X7 w- V; B0 \7 W  if(FAILED(hres)) 2 K) K' e9 V; J% E" M9 L
  {
" A( S# L8 e; Q+ f5 v2 d0 c  cout<<"Could not connect. Error code = 0x"
! B* S1 x( H  h' R' G  <<hex<<hres<<endl ; 0 t8 G0 x* t2 i% ?! }, ~: V5 L
  pLoc->Release(); * x5 w$ A; }5 q# P$ d
  CoUninitialize();
" r' C) g, Z% X  return 1 ;
  f5 t  R( o3 z' q, n' l  // Program has failed. # j; _" r' K' Z8 K4 U2 w
  } 1 {" w; `+ z9 u1 C3 {1 u2 Z/ P
  8 G; V3 }3 \. |
  cout<<"Connected to WMI"<<endl ; $ h" P, [1 a1 E! r" S2 R* s  g
  ) q; v: v( Y+ u* b1 x
  // Set the IWbemServices proxy so that impersonation of the user (client) occurs.
8 @3 s! j$ \: z$ F# c% K* ?  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
" H1 ]! P( {: H1 \. L) h8 g* B0 B  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE); 5 v* t1 T/ S. E9 Q
  . O7 j! R& H% Z# l* k
  if(FAILED(hres)) ; Z2 c# B3 p* _+ O
  {
1 l& ~$ j* \9 Z& Z3 p  cout<<"Could not set proxy blanket. Error code = 0x"
. T" I% H1 s( [" O$ b+ n  <<hex<<hres<<endl ; % J6 H) \1 E. j% N( S
  pSvc->Release(); , h5 T8 ?0 f8 l# i
  pLoc->Release();
' d; W# v, |. h  CoUninitialize();
4 C6 n' Y% ?) R8 y  return 1 ; & {. V# o" b! A+ ?7 |8 g& r- t
  // Program has failed.
/ B# e* K3 y% |3 E( y1 N# b  } + r9 J" ~; ~) w
  ) c6 _4 d+ h. W' J2 r' N' z" q
  & w- a% v- e7 `$ n! b7 y$ U) c
  // Use the IWbemServices pointer to make requests of WMI.
+ M% t' P1 ^& O' A' U- [9 |: ]  // Make requests here: - Z/ u4 Q2 Y5 ?0 u- J+ t1 z4 F
  4 L% |1 L% y: r  H% f$ j, o
  // For example, query for print queues that have more than 10 jobs 0 i- G- L" _( w7 H% r
  IEnumWbemClassObject*pEnumerator=NULL ; / C- a# P" L3 e3 J0 N9 i: |- U2 N
  hres=pSvc->ExecQuery(
/ O& Q, X4 T& s2 X4 o; S  bstr_t("WQL"),
) p9 n1 K2 `' f4 W- l% Y  bstr_t("SELECT * from Win32_BIOS"),
( J* a( i- p. t3 \) d  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY, # m2 i2 G: z- D9 t3 v
  NULL,
$ B# g# ]) |% Z+ s  &pEnumerator); 3 I4 g! _( Q  O: N/ a
  
9 t* b% H; G6 c# q4 S6 Q/ ^0 @0 O, h  if(FAILED(hres))
2 _: O% ^' G& k, [/ O9 u  { : R" U5 }( G4 k0 f
  cout<<"Query for print queues failed. Error code = 0x" 7 G5 g2 x* P6 v6 n  s0 w
  <<hex<<hres<<endl ;
& ?0 b9 U- N3 t# I9 s7 e  pSvc->Release(); # @  [3 a3 v0 w  o3 C) i4 H7 i
  pLoc->Release(); $ x' Q! e; L$ d! x
  CoUninitialize(); 6 u# J+ n0 I+ ^9 p( d
  return 1 ;
* P7 |9 n. Y8 o# v, L  V  // Program has failed. $ b2 A; F$ L, s! K' }0 U) h4 ?
  } % v; I; t2 z( E; S4 V  o
  else 3 e4 i9 N! b$ a+ p6 q: [. t7 C/ _
  {
+ a* W6 w% t! \9 M  IWbemClassObject*pInstance=NULL ;
, v/ @0 T1 f% u1 o+ p  ULONG dwCount ;
% R+ Y" u+ ?" o1 C- t8 }7 W3 ~  while(pEnumerator->Next(
0 [* p6 L% k: \1 J5 a4 p9 Y6 c  WBEM_INFINITE,
$ O4 j  G8 E% d5 E- n/ C  1,
! e1 o3 q+ }" v0 w  &pInstance, 7 K, R# Y$ l+ u2 {. y- [5 x
  &dwCount)==S_OK)
) d/ D9 Q; [$ _" d  {
3 J/ Q' U. y6 W6 B9 [  SAFEARRAY*pvNames=NULL ;
2 W* b3 d& f6 }; c  A5 w  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK) " c( ?; f- G  B! }+ _" Z+ ^  c! Q- A/ J
  {
7 b8 k! J# N4 s7 c$ E/ k, z  long vbl,vbu ;
# M# i/ C! L& [. @  SafeArrayGetLBound(pvNames,1,&vbl);
! X7 a  w9 D0 Q6 ?  SafeArrayGetUBound(pvNames,1,&vbu);
1 \3 ?- X2 B4 [& ^: |3 `9 Y  for(long idx=vbl;idx<=vbu;idx++) : C$ t3 f3 O1 U
  { 4 D) z( P% m- I  z( J$ n- @) q
  long aidx=idx ;
" {9 @- J' r+ [6 L; P! e0 X: _* x) G  wchar_t *wsName=0 ;
& T2 F7 t2 J" ^! w* W8 c# a  VARIANT vValue ; * m" J+ v( ^& n! D
  VariantInit(&vValue);
; h$ J) s% Q5 k, g0 T1 D) R4 `- z  
8 ~! u' R; _, |4 l$ Z  SafeArrayGetElement(pvNames,&aidx,&wsName);
" a4 ]0 `) g6 O  \# E# c  $ A) }) l/ q2 @% E
  BSTR bs=SysAllocString(wsName);
  T' ^2 j/ \8 `7 F; A  hres=pInstance->Get(bs,0,&vValue,NULL,0); / l: u( `8 ~% n. ]( Z
  SysFreeString(bs);
1 G1 y( y) o% i  L8 h5 P7 U' C  6 k0 N& I* X) H
  - j) @9 ]* [9 }. ~4 W0 c* A5 c7 m3 M( N7 ~
  if(SUCCEEDED(hres))
- |+ E* Y1 C4 G  {
8 O9 ^4 a9 d0 i- |5 g6 L# [  char szANSIString[MAX_PATH];
3 d8 H' `9 b5 ?- W  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
' i0 }/ P0 d& E  szANSIString,sizeof(szANSIString),NULL,NULL);
6 J2 Q5 l6 b0 C  8 T9 A3 u0 N& Q3 n, `& g" m
  cout<<szANSIString<<" : " ; - @/ q9 {' X6 _* s% d& z4 P3 X
  switch(vValue.vt)
0 X9 A; A/ @5 d: p# G3 Y" V) k  {
* }- H& S& @! s  case VT_BSTR :
$ H+ c: f( C% s/ W  wprintf(L"%s",V_BSTR(&vValue)); # P1 y& c/ \3 a$ E& G
  break ;
- a# n4 C/ h; I1 y0 n6 C  case VT_I2 :
. o, l7 Q, ~3 g0 s7 t" `. [  wprintf(L"%d",V_I2(&vValue)); $ z' F7 J/ A( j5 D8 m9 z) a
  break ; " f; f/ U8 M9 t" G  J8 I' k
  case VT_I4 : . q7 @4 m! r! m5 x4 }
  wprintf(L"%d",V_I4(&vValue));
9 w) D6 c- D- K$ e  break ; * x' [" H. W8 S' X( y+ v
  case VT_BOOL : 1 U8 m4 \3 r' B& |2 k
  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE"); 0 C) Z- h% L& G" m* {
  break ; $ `6 o; c& g6 ^5 A$ |
  default:
  _. D) A# o7 R  /*WCHAR tmp[100];
) A, I0 s; j6 v% t  wcscpy(tmp, V_BSTR(&vValue));
. }" A# T) f# k: k4 o8 A$ `5 E( ?  char tmp1[MAX_PATH];
( p  t5 k! a* v- N+ ~2 z  O  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1, ! v  [. ~4 s* u2 N* H
  tmp1,sizeof(tmp1),NULL,NULL); 1 O0 R  j- g/ j# t; M
  . F5 S8 K, U& A- R% d. V# d: Y2 `7 d
  cout<<tmp1;*/ ! K7 S1 u5 W% {5 O' X
  break;
$ Z6 Z8 H8 h' t, w. k6 Z1 p  G  } ! r& J% e4 z9 `' \9 ^+ X8 g
  cout<<endl ; , R& L1 u$ k8 s5 r" w4 |8 r
  }
! j5 G" K4 {' b1 G' J  3 x- w6 R3 N& E! @  g1 g* N
  SysFreeString(wsName); $ c- d+ N5 B$ O% q- |/ C) u: O( b
  } $ K) ^& a( \$ \7 Y# d3 u  M
  1 N, `$ I4 u+ n1 x2 ^
  } ; w4 N! t2 Y- r/ z) M
  else 1 i+ _8 j. J4 f) Y# I6 V" x9 j/ L
  {
1 R) S  Q5 l; J' n) q, r) O  cout<<"Query for print queues failed. Error code = 0x" 2 c5 E& i, k% a% D# z( o
  <<hex<<hres<<endl ;
( w- H) h6 Z2 g, i3 U2 W: I  pSvc->Release(); / F6 N1 J, _" B, T/ l4 g
  pLoc->Release(); & W1 t& W2 `5 n* Z3 P* |
  CoUninitialize();
( U1 {  O  z6 ?/ i; k: E' U  return 1 ;
: j2 M, P! J9 M/ k8 A4 i) q  // Program has failed. 4 z$ M' e, R  `. P# Q( V
  } $ H( K  h$ e" ^; Z4 Z' E" \6 @
  if(pvNames)SafeArrayDestroy(pvNames);
( t# [1 F  a+ V: S* a$ H  S  }
" u) O. _0 w( x1 l/ [# ?  if(pInstance)pInstance->Release();
5 x5 a% [9 {- H" F; X8 N' ^3 l  / e2 B* a  C" M# t- o3 W9 A* D% N
  }
+ p( s* M: P* d& ^  // Cleanup & ~0 b9 j% F4 r0 {* s
  // ======== 9 f( ^, a# H% n- i' h
  pEnumerator->Release();
0 R" ]8 T4 ?, l4 L  pSvc->Release();
) u% L% [3 ?1 i$ P0 L  pLoc->Release(); # m+ ~4 a; v" A* N$ D# k
  CoUninitialize(); 2 F0 b9 s1 o$ T0 \5 Z
  8 C' v: ?! ]7 X
  return 0;
( Q% q, @/ k# X% U8 }  // Program successfully completed.
' ]) P. a9 s6 B6 \  }
9 F# Y' v) l( S6 {  //-----------------------------------8 D3 x  c; ?! v& o" ^  \
  
, F8 E& q/ H: Z+ {  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到.
4 {2 N! \$ N7 ]4 m5 H3 j( k% Z  + o  x- ?9 R7 F
  void GetWmiInfo(TStrings *lpList, WideString wsClass)
7 i# n) A' l4 }# A: E& S" d) n  {
8 G0 _7 b' A! G  IWbemLocator *pWbemLocator = NULL;
9 t' y' z1 U, a1 _1 [+ U$ ]  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 {- m3 x0 Z" G  w# R8 ?% m$ F5 A7 D0 t  { # h% R$ x$ v+ n1 E  g8 N* {3 n
  IWbemServices *pWbemServices = NULL;
/ D$ k) X  z" T$ z) d  WideString wsNamespace = (L"root\cimv2");
' N. h- `: U0 L# v: `: Q  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
( W8 t0 ?, I  M" _  {
* ?. w. P( P! i" c, l' r. t9 ^: `  IEnumWbemClassObject *pEnumClassObject = NULL; 9 k2 C+ l( v1 b8 O. ?
  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
, M8 x8 S4 w' S+ c' @6 W+ F  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) 1 N; @; c+ N. I' R1 w! P
  {
: J$ B. ?6 }6 q9 U. [1 h3 D0 W  IWbemClassObject *pClassObject = NULL; 3 D& m( p7 x; Y4 i/ P
  ULONG uCount = 1, uReturned; 3 S- |8 g4 m- T" j5 N
  if(pEnumClassObject->Reset() == S_OK)
8 O! h0 q" d+ k  {
6 c; I1 x7 ?. x& a5 \! |/ m2 y5 y0 J  int iEnumIdx = 0; 8 M* Z( q8 H! B4 t
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
7 `5 i' I' J) k9 u( h7 ?- r  { ! D- p, p" p6 s0 }# a' x" x( P
  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
9 q) A' Y% q, S. s6 h  
  P  j' X! \4 H" s+ M6 o& v  SAFEARRAY *pvNames = NULL; ' h. ?3 ^" s4 C2 i7 m0 e
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK) ( d' V+ t2 ~, S/ q6 v- d
  { ' ^, X1 q: |5 X- h" x3 g/ Z
  long vbl, vbu; 5 D. e% g* n& w4 T) n0 T
  SafeArrayGetLBound(pvNames, 1, &vbl);
( i) w% G9 x6 U, w) ~  SafeArrayGetUBound(pvNames, 1, &vbu); . y/ |5 F. V0 u5 }
  for(long idx=vbl; idx<=vbu; idx++)
1 l- _5 l  X! b2 I* {  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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