zoukankan      html  css  js  c++  java
  • 基于visual c++之windows核心编程代码分析(52)使用WMI 获取进程启动参数

    WMI,是Windows 2K/XP管理系统的核心;对于其他的Win32操作系统,WMI是一个有用的插件。WMI以CIMOM为基础,CIMOM即公共信息模型对象管理器(Common Information Model Object Manager),是一个描述操作系统构成单元的对象数据库,为MMC和脚本程序提供了一个访问操作系统构成单元的公共接口。

    有了WMI,工具软件和脚本程序访问操作系统的不同部分时不需要使用不同的API;相反,操作系统的不同部分都可以插入WMI。

     WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远程计算机。
    Windows 2K/XP和Windows 98 都支持WMI;如果为NT 4.0和Windows 95加上了 Service Pack 4或更高版本,N  WMIT 4.0和Win95也支持WMI。因此,用WMI进行远程管理时,并非一定要用Windows 2K/XP(当然,如果WMI脚本在一台没有性能监视器的Win9x机器上运行,就不能在远程Win9x系统上查询Windows 2K/XP的性能监视器。  

     如前所述,WMI允许通过一个公共的接口访问多种操作系统构成单元,因此不必分别对待各种底层接口或所谓的“提供者”。利用WMI可以高效地管理远程和本地的计算机;与此相对,并非所有的Windows 2K/XP命令行工具都支持远程运行。   

    WMI是WBEM模型的一种实现。WBEM即Web-Based Enterprise Management,或基于Web的企业管理,WBEM由DMTF(Distributed Management Task Force,分布式管理任务组)在许多厂商的帮助下创立,包括Compaq、Sun、Microsoft等。WBEM的目标是,为管理企业环境开发一个标准的接口集。WBEM模型最关键的部分是它的数据模型(或描述和定义对象的方式)、编码规范(Encoding Specification),以及在客户端和服务器端之间传输数据的模式。  

     WBEM的数据模型是CIM(Common Information Model,公共信息模型)。CIM是一个用来命名计算机的物理和逻辑单元的标准的命名系统(或称为命名模式),例如硬盘的逻辑分区、正在运行的应用的一个实例,或者一条电缆。

      CIM是一个面向对象的模型,使用一组面向对象的术语进行描述。CIM包含类(Class),类是被管理单元的模板。类的实例称为对象(Object),对象代表着底层系统的一个具体单元。名称空间(Namespace)是一个类的集合,每个名称空间面向一个特定的管理领域。类包含属性(Property)和方法(Method)。  

     CIM分三层。

    第一层是核心模型(Core Model),这一层包含的类定义对于所有管理领域来说都是共同的。

    第二层是公共模型(Common Model),这一层包含的类定义对于特定的管理领域来说是公共的,但与具体的操作系统和系统设计无关。

    第三层是扩展模型(Extension model),这一层包含的类定义与特定的操作系统或技术有关。  

     WMI是Microsoft扩展CIM 2.0得到的面向Win32系统的扩展模型。引用WMI类和属性的形式是“扩展前缀_类名称.属性名称”,例如Win32_ComputerSystem. Name,其中Win32是CIM模式cimv2名称空间内WMI扩展类的前缀,ComputerSystem是类,Name是属性。  

     编写WMI脚本的很大一部分工作涉及到读取和设置属性值。当前,WMI提供的方法还很有限,但随着时间的推移,相信WMI和CIM提供的方法都会越来越丰富。

    下面我们基于VC++实现使用WMI 获取进程启动参数

    #include "stdafx.h"
    #include "stdio.h"
    #include "stdlib.h"
    #include "Wbemcli.h"
    #include "comutil.h"
    #include "atlbase.h"
    #pragma comment(lib, "wbemuuid.lib")//wmi
    #pragma comment(lib, "comsuppw.lib ")
     
    void GETProcess(wchar_t* path,wchar_t* Instances)
    {
    	USES_CONVERSION;
    	VARIANT processname,process_cmdline;
    	ZeroMemory((wchar_t*)&processname,sizeof(VARIANT));
    	HRESULT hres;
    	CoInitializeEx(0,COINIT_MULTITHREADED);//有可能已经初始化了,就返回错误。
    	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
    
    		);
    	IWbemLocator *pLoc = NULL;
    	hres = CoCreateInstance(
    		CLSID_WbemLocator,
    		0,
    		CLSCTX_INPROC_SERVER,
    		IID_IWbemLocator, 
    		(LPVOID *) &pLoc
    		);
    	IWbemServices *pSvc = NULL;
    	hres = pLoc->ConnectServer(	_bstr_t(path), 	NULL, NULL, 0, 	NULL, 0, 0, &pSvc);
    	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 identity
    		EOAC_NONE // proxy capabilities
    		);
    	IEnumWbemClassObject* pEnumerator = NULL;
    	wchar_t select[1000]=L"SELECT * FROM ";
    	wcscat(select,Instances);
    	hres = pSvc->ExecQuery(
    		bstr_t("WQL"),
    		bstr_t(select),
    		WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
    		NULL,
    		&pEnumerator
    		);
    	IWbemClassObject *pclsObj;
    	ULONG uReturn = 0;
    	wchar_t cmd[2500];
    	ZeroMemory(cmd,5000);
    	while (pEnumerator)//如果有多条记录
    	{
    		HRESULT hr = pEnumerator->Next(WBEM_INFINITE,1,&pclsObj,&uReturn);
    		if (S_OK!=hr)//已经没有记录了
    			break;
    		VariantInit(&processname);
    		VariantInit(&process_cmdline);
    		process_cmdline.bstrVal=NULL;
    		pclsObj->Get(L"Name", 0, &processname, 0, 0);
    		pclsObj->Get(L"CommandLine", 0, &process_cmdline, 0, 0);
    
    		if (process_cmdline.bstrVal==NULL)//判断指针是否有效
    			continue;
    		wsprintf(cmd,L"[%s]   %s\r\n",processname.bstrVal,process_cmdline.bstrVal);
    		wprintf(L"%s",cmd);
    
    	}
    	VariantClear(&processname);
    	VariantClear(&process_cmdline);
    	pSvc->Release();
    	pLoc->Release();
    	pEnumerator->Release();
    	pclsObj->Release();
    	CoUninitialize();
    }
    int main()
    {	GETProcess(L"ROOT\\CIMv2",L"Win32_process");
    	GetLastError();
    }
    


     

  • 相关阅读:
    Python学习之路:MINST实战第一版
    Python学习之路:NumPy进阶
    Python学习之路:NumPy初识
    Python学习之路:一天搞定基础部分
    7. 整数反转(leetcode)
    1. 两数之和(leetcode)
    172. 阶乘后的零(leetcode)
    Java模拟斗地主发牌(Collections工具类的应用)
    CF刷题-Codeforces Round #481-G. Petya's Exams
    【android】安卓平台版本和API版本的对应关系
  • 原文地址:https://www.cnblogs.com/new0801/p/6177773.html
Copyright © 2011-2022 走看看