您的位置:首页 > 其它

vc操作wmi遍历进程信息

2010-11-24 17:47 330 查看
废话不多说,看代码:

#define _WIN32_DCOM
#include <iostream>

#include <comdef.h>
#include <Wbemidl.h>
#include <conio.h>
#include <atlbase.h>
using namespace std;

#pragma comment(lib, "wbemuuid.lib")
void SetPrivilege() 
{
	
    HANDLE hToken;
    LUID destLuid; 
	TOKEN_PRIVILEGES TokenPrivileges; 
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); //获得进程访问令牌的句柄
    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &destLuid);   //操作的类型为SE_DEBUG_NAME        
    TokenPrivileges.PrivilegeCount = 1; 
    TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    TokenPrivileges.Privileges[0].Luid = destLuid; 
    AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL); //提升权限
    CloseHandle(hToken);   //关闭句柄
}

BOOL ManageWMI();
int main(int argc, char* argv[])
{
	 CoInitialize(0); 
	SetPrivilege();
    if(!ManageWMI()) printf("%WMI Error!");
	CoUninitialize();
 _getch(); 
 return 0;
}

BOOL ManageWMI()
{

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
        );

                      
  

    CComPtr<IWbemLocator> pLoc = NULL;

 pLoc.CoCreateInstance(__uuidof(WbemLocator));
   CComPtr<IWbemServices> pSvc = NULL;
	
   
    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
		);
    

     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 identity
       EOAC_NONE                    // proxy capabilities 
    );

    
    CComPtr<IEnumWbemClassObject> pEnumerator = NULL;
    pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t("SELECT * FROM Win32_Process"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);
  
 
    CComPtr<IWbemClassObject> pclsObj;
    ULONG uReturn = 0;
   
    while (1)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
            &pclsObj, &uReturn);

        if(0 == uReturn)
        {
          break;
        }

 CComVariant v;

  

    pclsObj->Get(CComBSTR("commandline"),0, &v, 0, 0);
	if(v.bstrVal)
   std::wcout << v.bstrVal<< std::endl;

  
  
    }

    

    

    return 0;   // Program successfully completed.
 
}




需要提升进程权限,不然会得不到值。

本文有不足之处,还望大家多多指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: