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获取进程的用户名。