设为首页 收藏本站
查看: 2251|回复: 0

[经验分享] 通过WMI访问Windows系统信息

[复制链接]

尚未签到

发表于 2018-6-27 12:46:06 | 显示全部楼层 |阅读模式
// wmi.cpp : Defines the entry point for the console application.  //
  #include "stdafx.h"
  #define _WIN32_DCOM
  #include <iostream>
  using namespace std;
  #include <comdef.h>
  #include <Wbemidl.h>
  # pragma comment(lib, "wbemuuid.lib")
  int _tmain(int argc, _TCHAR* argv[])
  {
  HRESULT hres;
  // Step 1: --------------------------------------------------
  // Initialize COM. ------------------------------------------
  hres =    CoInitializeEx(0, COINIT_MULTITHREADED);
  if (FAILED(hres))
  {
  cout << "Failed to initialize COM library. Error code = 0x"
  << hex << hres << endl;
  return 1;                                    // Program has failed.
  }
  // Step 2: --------------------------------------------------
  // Set general COM security levels --------------------------
  // Note: If you are using Windows 2000, you need to specify -
  // the default authentication credentials for a user by using
  // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
  // parameter of CoInitializeSecurity ------------------------
  hres =    CoInitializeSecurity(
  NULL,
  -1,                                                    // COM authentication
  NULL,                                                // Authentication services
  NULL,                                                // Reserved
  RPC_C_AUTHN_LEVEL_DEFAULT,     // Default authentication
  RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
  NULL,                                                // Authentication info
  EOAC_NONE,                                     // Additional capabilities
  NULL                                                 // Reserved
  );
  if (FAILED(hres))
  {
  cout << "Failed to initialize security. Error code = 0x"
  << hex << hres << endl;
  CoUninitialize();
  return 1;                                        // Program has failed.
  }
  // Step 3: ---------------------------------------------------
  // Obtain the initial locator to WMI -------------------------
  IWbemLocator *pLoc = NULL;
  hres = CoCreateInstance(
  CLSID_WbemLocator,
  0,
  CLSCTX_INPROC_SERVER,
  IID_IWbemLocator, (LPVOID *) &pLoc);
  if (FAILED(hres))
  {
  cout << "Failed to create IWbemLocator object."
  << " Err code = 0x"
  << hex << hres << endl;
  CoUninitialize();
  return 1;                                 // Program has failed.
  }
  // Step 4: -----------------------------------------------------
  // Connect to WMI through the IWbemLocator::ConnectServer method
  IWbemServices *pSvc = NULL;
  // Connect to the root\cimv2 namespace with
  // the current user and obtain pointer pSvc
  // to make IWbemServices calls.
  hres = pLoc->ConnectServer(
  _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
  NULL,                                        // User name. NULL = current user
  NULL,                                        // User password. NULL = current
  0,                                             // Locale. NULL indicates current
  NULL,                                        // Security flags.
  0,                                             // Authority (e.g. Kerberos)
  0,                                             // Context object
  &pSvc                                        // pointer to IWbemServices proxy
  );
  if (FAILED(hres))
  {
  cout << "Could not connect. Error code = 0x"
  << hex << hres << endl;
  pLoc->Release();
  CoUninitialize();
  return 1;                                // Program has failed.
  }
  cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;
  // Step 5: --------------------------------------------------
  // Set security levels on the proxy -------------------------
  hres = CoSetProxyBlanket(
  pSvc,                                                // Indicates the proxy to set
  RPC_C_AUTHN_WINNT,                     // RPC_C_AUTHN_xxx
  RPC_C_AUTHZ_NONE,                        // RPC_C_AUTHZ_xxx
  NULL,                                                // Server principal name
  RPC_C_AUTHN_LEVEL_CALL,            // RPC_C_AUTHN_LEVEL_xxx
  RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx

  NULL,                                                // client>  EOAC_NONE                                        // proxy capabilities
  );
  if (FAILED(hres))
  {
  cout << "Could not set proxy blanket. Error code = 0x"
  << hex << hres << endl;
  pSvc->Release();
  pLoc->Release();
  CoUninitialize();
  return 1;                             // Program has failed.
  }
  // Step 6: --------------------------------------------------
  // Use the IWbemServices pointer to make requests of WMI ----
  // For example, get the name of the operating system
  IEnumWbemClassObject* pEnumerator = NULL;
  hres = pSvc->ExecQuery(
  bstr_t("WQL"),
  bstr_t("SELECT * FROM Win32_OperatingSystem"),
  WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
  NULL,
  &pEnumerator);
  if (FAILED(hres))
  {
  cout << "Query for operating system name failed."
  << " Error code = 0x"
  << hex << hres << endl;
  pSvc->Release();
  pLoc->Release();
  CoUninitialize();
  return 1;                             // Program has failed.
  }
  // Step 7: -------------------------------------------------
  // Get the data from the query in step 6 -------------------
  IWbemClassObject *pclsObj;
  ULONG uReturn = 0;
  while (pEnumerator)
  {
  HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
  &pclsObj, &uReturn);
  if(0 == uReturn)
  {
  break;
  }
  VARIANT vtProp;
  VariantInit(&vtProp);
  // Get the value of the Name property
  hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
  wcout << " OS Name : " << vtProp.bstrVal << endl;
  VariantClear(&vtProp);
  }
  // Cleanup
  // ========
  pSvc->Release();
  pLoc->Release();
  pEnumerator->Release();
  pclsObj->Release();
  CoUninitialize();
  return 0;     // Program successfully completed.
  }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-531377-1-1.html 上篇帖子: Microsoft.Windows.Vista.SP1.32Bit.Build.6001.16549 下篇帖子: windows server 2003 版本的识别 及 小技巧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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