【进程处理】2,枚举进程方法二,可获取进程用户名等

1,目的

 

在第一篇介绍了枚举当前进程及关闭进程的方法。

这里介绍另一种方法,枚举的同时我们能获取到更多信息。比如是用户名(System或Administrator等)

 

2,代码

未使用Unicode字符集。
#include "stdafx.h"
#include <Windows.h>
#include <WtsApi32.h>
#pragma comment( lib, "Wtsapi32.lib" )

int main(int argc, char* argv[])
{
	DWORD				dwCount			= 0;
	PWTS_PROCESS_INFO	pi				= { 0 };
	int					i				= 0;
	DWORD				dwSize			= 0;
	char				szUserName[128]	= { 0 };
	SID_NAME_USE		nameuse			= SidTypeUser;
	
	if( WTSEnumerateProcesses(NULL, 0, 1, &pi, &dwCount) ) 
	{
		//这里就已经获取了进程个数:dwCount,和一个存储各进程WTS_PROCESS_INFOW中4个信息的列表:pi
		//遍历列表
		for( i = 0; i < dwCount; i++ ) 
		{
			//进程ID =	pi[i].ProcessId
			//进程名 =	pi[i].pProcessName
			//进程SessionId = pi[i].SessionId
			//进程UserSid   = pi[i].pUserSid

			//下面通过UserSid获取这个进程的用户名,保存在szUSerName
			memset( szUserName, 0, sizeof(char) * 128 );
			dwSize = 128;
			LookupAccountSid(NULL, pi[i].pUserSid, szUserName, &dwSize, NULL, &dwSize, &nameuse);

		}
	}
	WTSFreeMemory( pi );

	return 0;
}

3,说明

 

函数WTSEnumerateProcesses 枚举当前进程,得到进程总数,存储每个进程的WTS_PROCESS_INFO结构信息到一个列表pi。

WTS_PROCESS_INFO结构内容:(这里就列出ANSI版)

typedef struct _WTS_PROCESS_INFOA {
    DWORD SessionId;     // session id
    DWORD ProcessId;     // process id
    LPSTR pProcessName;  // name of process
    PSID pUserSid;       // user's SID
} WTS_PROCESS_INFOA, * PWTS_PROCESS_INFOA;

我们自己遍历这个列表,获取相关信息。

这里使用 LookupAccountSid函数可以通过UserSid获取进程的用户名。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享