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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^:
2 A# X1 B& N" ~7 ]7 x  --------------------------------------------------------------------------------
; n' Y1 }0 m' E# Q8 [; }  #define _WIN32_DCOM % @- a5 F+ c/ W, F" r
  #include <iostream>
+ B) U- d8 D- ]+ B5 z+ c  using namespace std ; / }0 Q9 M( A. ~7 V" Y. X- O
  #include <windows.h> & n7 P7 d: y, j3 h! e
  #include <comdef.h> 8 u; v3 e- h8 T
  #include <wbemcli.h>
2 o1 v; `  K) ^' J& G3 X' N  $ L* N% Y4 v% Q$ R* s0 Z
  #pragma comment(lib, "Wbemuuid") 2 o; k, h$ o& Q' U/ {$ `! q; H
  1 @+ w: E& \. `. W
  int main(int argc,char**argv) - W7 O& e" V3 }. W
  {   [8 M2 X  X# ~6 z! W! v; \
  HRESULT hres ;
: L3 ^. T# {; e  s5 u  & F% d9 D( Z; I
  // Initialize COM.
( Y+ z" m7 E! q! c& a( G  hres=CoInitializeEx(0,COINIT_MULTITHREADED);
2 t& q7 U* N7 @  if(FAILED(hres)) : G6 ^- X+ D0 R( F1 o) c
  {
, |( j6 q0 Q7 G8 e+ W$ J  cout<<"Failed to initialize COM library. Error code = 0x" , n4 u! s" L" K
  <<hex<<hres<<endl ; & M; k* P# l, g1 G9 U
  return 1 ; # E- Z; Q' G) R* Q+ ~- A8 I
  // Program has failed. / U; `& `* D; ~+ G7 @) o
  }
$ }) `6 v  H/ r5 m7 t4 n$ T6 ?  [    Z2 U' C4 a: J( ]6 o' G7 J5 X
  // Initialize ! p/ Q  f- B7 L: T$ ?  z% R
  hres=CoInitializeSecurity( * R2 L. B6 L- S1 C' K/ @
  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT, 2 o7 ^; S; `1 Q5 t% G8 W  ?
  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL); 8 Z9 L& \* Z+ {+ G- E- T# x) v, n+ G
  
# V7 M# `, o& w" j7 N  $ K/ e& o  Z" c# b( ~% n# k. h, ]2 n  _& c
  if(FAILED(hres))
4 a6 ^/ _! D9 ]& o  X  {
8 l7 V% U( P1 E% K! p; r  cout<<"Failed to initialize security. Error code = 0x"
2 U' ^- {) d' P+ E6 p  |$ k. y+ f' l  <<hex<<hres<<endl ; ( @5 k- p' f/ t6 \! T6 o
  CoUninitialize();
; N! b: L9 x7 o, j4 u6 J: M  return 1 ;
3 F4 i$ P, r1 ~8 p+ J  // Program has failed. # E+ Y7 X  S& ?# W6 t3 V: Z( o
  }
4 o7 ^6 D7 F  s  # c& l- j  M# [+ ?' T1 Y
  // Obtain the initial locator to Windows Management on a particular host computer. & ~$ G. B! g& K9 m
  IWbemLocator*pLoc=0 ; ' n( P6 v! B2 l3 S2 j& `$ o
  
6 N5 q, M& N2 E  V* z& Y  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
, z! h3 I( g) k4 r! b  IID_IWbemLocator,(LPVOID*)&pLoc);
' G+ M0 {3 y0 d, {  8 W" h9 E- w1 u$ o
  if(FAILED(hres)) 3 z2 s& F: n1 t. {
  {
( M6 h7 ]! v" f& d# L  n# o  cout<<"Failed to create IWbemLocator object. Err code = 0x" 5 s  `0 q; T, O) R' A# @
  <<hex<<hres<<endl ;
9 \; M9 A* v9 d+ a/ \  CoUninitialize();
4 W0 i) |! u1 Y0 o5 C$ v  return 1 ;   e1 H$ I" M! `' w$ a3 m/ a* [
  // Program has failed. 1 z7 y* u; P! j8 I- O9 ~
  }
: m! M3 F7 P& x  / \& b" V! k2 L, f1 w
  IWbemServices*pSvc=0 ;
' {2 V( e, {; X/ V% j: b! y3 |  . X6 |: Y# P% B7 q% b6 p+ T' A
  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc / U) S$ t' e2 {( t% P
  // to make IWbemServices calls. ; F9 `) ^) N. I7 t# J
  
+ t3 a2 s- L0 K' h+ G6 R  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"), & ]7 u! I/ V4 o, G6 U6 R
  NULL,NULL,0,NULL,0,0,&pSvc); . P+ m. k6 c7 O' s: i( X
  + s/ O( e' m( z0 |3 Q  c( X# F7 F
  if(FAILED(hres))
1 U$ p! G8 M! S0 k: n  {
+ t- Q7 _2 v/ K5 J9 p' H  cout<<"Could not connect. Error code = 0x"
! Y7 ^$ k/ I. W% ?0 S  <<hex<<hres<<endl ;
, E& ~4 }, V; x5 q* C9 f3 A# `  pLoc->Release(); 2 f8 H7 M: c1 s2 k) a' C, z: p
  CoUninitialize();
4 o. T1 c4 B. f6 L  G! Y- G% u  return 1 ;
% U6 ~6 c; u+ B- x$ s, q* w  // Program has failed. . I' H6 ?- _- T1 Y  y6 Q
  }
) k6 u, e2 T, S% t4 t  4 O9 h! G6 y( I0 c& O. W
  cout<<"Connected to WMI"<<endl ;
- c7 c4 g2 V: w* v7 y3 n  5 o2 K& l( I8 T
  // Set the IWbemServices proxy so that impersonation of the user (client) occurs.
% N; E4 u6 m% M  ?  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL, ( x. s- M' R/ F7 r* J2 f# ?
  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
0 a- R7 b6 q) _% T& I$ w7 Q  
% E1 p2 m% H; w  if(FAILED(hres))
, P; ^: ~* r: U1 \, k  {
3 l5 C) ~  H* r$ u4 ^$ s% y  cout<<"Could not set proxy blanket. Error code = 0x"
% Q+ Y. E! q2 p2 D  <<hex<<hres<<endl ; - f( ~8 o1 h# n. c  D8 p- v
  pSvc->Release(); 3 ?8 n0 w6 _8 g8 t1 A9 V
  pLoc->Release();
& q  D: }9 B/ r7 H2 F  CoUninitialize(); 2 @/ }0 C- I6 Y& E7 s, ^
  return 1 ; ' j& {/ v- g: K2 z3 A
  // Program has failed. 4 o- @7 V/ c( J% K- r
  } ( O  G0 d; J7 Z& i9 B) h4 u4 Z
  ; f9 |; F. N/ X( W
  0 l% \( J2 w6 _+ P. r  l
  // Use the IWbemServices pointer to make requests of WMI.
7 H7 y' r% F! G1 q4 b2 Y7 f  // Make requests here:
5 W0 Z3 u* r8 Q6 x: \# E- x0 J& T  - A! y* ~8 o( f
  // For example, query for print queues that have more than 10 jobs
8 U6 e% E  {6 `2 B1 d  IEnumWbemClassObject*pEnumerator=NULL ; 9 i7 d6 z# ^+ R9 ?  ~) a. i7 r
  hres=pSvc->ExecQuery( - D. U) g# u: y8 {& M# N
  bstr_t("WQL"),
1 T' G9 q# z% \( U7 d) j$ l* d  bstr_t("SELECT * from Win32_BIOS"), & V+ ]2 G# B0 A" L9 Z/ _
  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
1 D* G8 g$ F$ B, T  NULL, 5 n( _) o/ a% h" I  @: y# w
  &pEnumerator); 9 D; k- j% Z: y" C/ p) A1 J  q! r
  6 M* X2 n- Q) H" H' Q! Q
  if(FAILED(hres))
: y3 @3 c! k! ^% X  {
+ d' E& `- z) C" W  cout<<"Query for print queues failed. Error code = 0x"
, z8 I8 H/ r2 l% [# u  <<hex<<hres<<endl ;
* Z+ M; W6 i  d3 O4 [  pSvc->Release(); 1 K' w- @% G2 q, i- O  b! n3 L
  pLoc->Release();
: w% t  u) I. |9 a, B# z3 r  CoUninitialize(); ! Z6 T. W4 {9 t$ ]2 f: L
  return 1 ; ' `% d  l- Q2 M, j9 D& w
  // Program has failed. " \1 e( T, v+ I0 s  O
  }
+ J* n( k# o; i' x! B2 c  else / k6 o/ ]% D% {6 `% w. v
  { " B7 J- X3 l: m0 Q/ S  c1 E
  IWbemClassObject*pInstance=NULL ; 8 [: d0 J. F4 f/ Q$ S2 j, x: n% M( l8 V
  ULONG dwCount ; 6 t; \6 f9 H: B, I8 s) t
  while(pEnumerator->Next( / S" p0 j$ {9 I2 v! K" D7 t7 K
  WBEM_INFINITE, 7 u& f) J+ ^( `
  1,
0 M/ ?. J' k$ z0 O  {' m1 D  &pInstance,
4 V6 Q# @, r/ N9 ?  &dwCount)==S_OK) ) @- J  Y0 l  P! O, K! S
  { 4 R9 ~1 @) h! ], A+ r
  SAFEARRAY*pvNames=NULL ; 9 u4 P/ c3 L, p, o% N% k
  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK) : b) l* l7 {1 g0 j  m
  { ; J/ F; u8 L8 y( V$ W. |
  long vbl,vbu ; 1 F5 F' r5 L) e! U$ R# }
  SafeArrayGetLBound(pvNames,1,&vbl); - a6 x- ~3 B  d- p$ H6 P, F9 c
  SafeArrayGetUBound(pvNames,1,&vbu); 0 \3 g" \5 O0 |: ^
  for(long idx=vbl;idx<=vbu;idx++)
  v1 O3 [" o8 L: E/ R* B( n8 ]  {
9 ?0 E$ k/ I& l0 E2 Q  long aidx=idx ; / ^7 ^+ C; O* k
  wchar_t *wsName=0 ; ! u% n, M+ z9 r* X, V
  VARIANT vValue ; # P& i2 T  q" m
  VariantInit(&vValue); 5 |+ T' N2 y9 ^; }  D9 W5 g
  4 }3 G  S  F. r# J! g
  SafeArrayGetElement(pvNames,&aidx,&wsName); 7 E, s1 g& B, p: X: k  \2 q  k# z9 J
  - P  z$ U  V0 A6 `: b
  BSTR bs=SysAllocString(wsName); 7 f+ x6 Q2 L! J9 i
  hres=pInstance->Get(bs,0,&vValue,NULL,0);
: i' {- Q. I; E; `  SysFreeString(bs); 7 {& A2 q- l% @, T2 f
  6 J1 G! D# C# k9 g6 r8 q! M
  
( A. ^' [, \6 G. ^" a1 z0 l" A# U  if(SUCCEEDED(hres))
( k- {! R8 h0 [7 T  }- T, }  {
4 C  m# `* k  ~: P  char szANSIString[MAX_PATH]; 5 \4 G# t$ e: b- z9 X0 u" `
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
( o- x! _8 ?5 V3 R9 A  szANSIString,sizeof(szANSIString),NULL,NULL);
$ p' f* {; m+ Y! U( H; J& m  
! k8 A! o; y/ Q4 B. `& w  cout<<szANSIString<<" : " ;
" a- x7 r( _0 _6 s, ]) K& f  switch(vValue.vt) 8 v9 Q* H/ `4 ?
  { ; Y  i5 f3 j& `0 {& t2 b, d) [
  case VT_BSTR :
3 o+ N8 ?: [: m1 Y0 Q: P  wprintf(L"%s",V_BSTR(&vValue));
5 }3 ]) }$ I" d. v) I! A; T) e  break ;
& i6 O5 a; r) A$ a# M: S. V; Z  case VT_I2 :
, m) q0 T' P  n2 c  wprintf(L"%d",V_I2(&vValue));
. ~8 K4 O0 \0 c! O5 m  break ; 9 Y; d# H9 t% b1 a) W, z2 R
  case VT_I4 :
+ n$ a, U" `$ ~& x  f; m2 s2 _  Y  wprintf(L"%d",V_I4(&vValue)); + D. U( d$ L: C) y) q3 ~# r
  break ;
( D9 n# m0 l; R8 \7 \2 {: f$ Q  case VT_BOOL :
. ^7 m- b, t' T9 \6 e0 J9 }  W  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE"); 1 Z& D( i" W5 w, h/ _- W* D
  break ;
. i& X9 Y/ d* k4 y) K5 Q; [6 t  default:
# i. q. W) X& ~( |0 [/ ~% l7 c, a* G  /*WCHAR tmp[100]; 5 k, j, i/ D1 Q* x2 ?
  wcscpy(tmp, V_BSTR(&vValue));
- @  `9 I# n8 G- G. `, g; |  char tmp1[MAX_PATH]; ; K- f; G! R. q: c: K; I
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1,
7 A, L  ~9 y3 h+ h  tmp1,sizeof(tmp1),NULL,NULL); 9 N% X; J+ o( i- s: g) x+ s; @
  
: S& r6 V( _0 M+ D6 u  cout<<tmp1;*/ ( I7 Y. P) y9 s
  break;
9 j% @( j/ P6 x, H' G% l% p  \, L  }
" A$ \/ E, f% Z3 f( K8 e8 o3 B  cout<<endl ; 1 ?$ g9 {. I+ K9 n& Q9 {1 h
  } ' D3 \$ S- W8 \2 @
  : {* e( n- Q* c0 A: q! L  y% c) S7 b
  SysFreeString(wsName);
7 ~/ K8 ?, K( w; D" T  }
* N% u+ x  M7 y) W$ a$ O' I  ( w8 s! t4 \) R1 b
  }
* d: N" E6 y4 Q6 h( p; U8 v0 o  else 0 d! }' f* ^7 z4 L# X6 _- M
  {
- t+ L! U( U, E5 Q  cout<<"Query for print queues failed. Error code = 0x" ) ~9 p! c  V% G
  <<hex<<hres<<endl ; / }* Z3 y0 I5 V2 g
  pSvc->Release();
7 o& D+ x$ R/ j- m! e" S  pLoc->Release(); , a+ ]0 b. K, K- x. U! B, q
  CoUninitialize(); 6 P3 Q9 u9 _0 E  T
  return 1 ; / h( n+ X9 J; o
  // Program has failed. + o- c$ L; K* @: q2 F
  } 8 G& g9 A) X! p% R# E% B
  if(pvNames)SafeArrayDestroy(pvNames);
9 ^$ p& x! @" U9 \% }  }
+ }6 [% v5 M5 a$ A) W" `; ^  if(pInstance)pInstance->Release(); 7 P$ G8 Y0 E: X
  
# i  W" b' B- L" k$ R" H# r  }
. d4 s! W5 Q6 s7 p8 Y5 h. O% Z) z  // Cleanup # @' p8 u6 s- ]
  // ======== ( @/ K$ x( z% p( e2 m( t
  pEnumerator->Release(); 8 a! u2 F0 j3 L$ B' \& f5 x
  pSvc->Release();
0 W' f& a% N7 y% s" j$ O9 E  pLoc->Release();
8 V5 s. Q* Q1 X; \& a& o! x1 @4 ~  CoUninitialize(); 1 a: {; R" W$ i8 Z0 U& k0 K
  
$ l+ q+ V) |5 |/ a  return 0; 3 _8 g# Z# w% D. E( h! v
  // Program successfully completed. ( {1 k) c( V* p% v2 o0 c
  } 8 |) z/ A$ I( `
  //-----------------------------------
0 b+ f$ z( t. |4 t/ q' M  
( m* R: `. @6 J- u3 Z  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到.
& q& v& J# e  j7 Z4 T. i" G  - ^4 r  J  |7 p3 w8 \/ H$ R  T$ V( }
  void GetWmiInfo(TStrings *lpList, WideString wsClass)
- X3 U* P* y9 I  {
9 x; U0 v& Q/ z  IWbemLocator *pWbemLocator = NULL;
# i4 g( P2 H: C# ]! f2 g  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) ! A4 d( K1 M/ ~: [! X8 F) _
  {
: @9 t+ z6 h7 {  IWbemServices *pWbemServices = NULL;
1 Z% H( h% I; K. y5 F: V' V  WideString wsNamespace = (L"root\cimv2"); 1 D7 }( P. K6 N1 V9 Z' n
  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
0 J, `% n) @# E( g* V- {  G5 T  {
7 ?6 }! @5 l* a  IEnumWbemClassObject *pEnumClassObject = NULL;
' Y) t! q6 q! H' t  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass; ( k& A8 h0 W3 K! u) m) p" m* b
  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) ! m: n& U5 K' `
  {
5 I2 i( e( V! z! }  IWbemClassObject *pClassObject = NULL;
# G& G2 }) {6 E- w& u  ULONG uCount = 1, uReturned; ; {' l  v# n/ g5 D) C9 ~
  if(pEnumClassObject->Reset() == S_OK) 9 y/ D2 g% l! p) e  s: C* S
  {
& Q5 K3 S/ i" a: D7 l, X& n0 B  int iEnumIdx = 0; 3 S0 y" A+ O  @+ v+ s
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK) $ {( T1 g( ~' ~3 M4 G
  { 7 c$ K. _3 @, f4 Z  T( N! O& s
  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); 9 E7 P$ C& c3 i5 D  A* p
  , k0 U# A1 f; V6 [* m
  SAFEARRAY *pvNames = NULL;
: g. p" n6 f  S  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK) 3 b4 T( _* t7 s( ]4 G
  {
/ F- d* R. C( Q/ A) }7 M; I  long vbl, vbu;
. v2 |; Y" M! o# n' ?  SafeArrayGetLBound(pvNames, 1, &vbl);
( g$ L4 A3 K6 L5 R7 a8 R/ W  SafeArrayGetUBound(pvNames, 1, &vbu);
8 N; g! i4 e. A; e* ^" P  for(long idx=vbl; idx<=vbu; idx++)
$ ^% W& i9 s) E, g0 i  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 04:28 , Processed in 0.034748 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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