文章目录
进程遍历-WTSEnumerateProcesses枚举
1. 相关函数及结构体
1.1 WTSEnumerateProcesses
检索有关指定远程桌面会话主机 (RD 会话主机) 服务器上的活动进程的信息
BOOL WTSEnumerateProcessesA(
[in] HANDLE hServer,
[in] DWORD Reserved,
[in] DWORD Version,
[out] PWTS_PROCESS_INFOA *ppProcessInfo,
[out] DWORD *pCount
);
hServer RD 会话主机服务器的句柄。 指定由 WTSOpenServer 函数打开的句柄,或指定 WTS_CURRENT_SERVER_HANDLE 以指示运行应用程序的 RD 会话主机服务器
Reserved 必须为零
Version 指定枚举请求的版本,必须为 1。
ppProcessInfo 接收指向 WTS_PROCESS_INFO 结构的数组的指针。 数组中的每个结构都包含有关指定 RD 会话主机服务器上的活动进程的信息
pCount 接收 ppProcessInfo 缓冲区中返回的WTS_PROCESS_INFO结构的数目
1.2 WTS_PROCESS_INFOA
包含有关远程桌面会话主机 (RD 会话主机) 服务器上运行的进程的信息
typedef struct _WTS_PROCESS_INFOA {
DWORD SessionId;
DWORD ProcessId;
LPSTR pProcessName;
PSID pUserSid;
} WTS_PROCESS_INFOA, *PWTS_PROCESS_INFOA;
SessionId 与进程关联的会话的远程桌面服务会话标识符
ProcessId 唯一标识 RD 会话主机服务器上的进程的进程标识符
pProcessName 指向以 null 结尾的字符串的指针,其中包含与进程关联的可执行文件的名称
pUserSid 指向进程的主要访问令牌中的用户 安全标识符 的指针
2. 遍历进程
2.1 遍历进程思路分析
- 通过WTSEnumerateProcessesW 直接遍历相关信息
- 处理进程信息结构体
2.2 遍历进程具体实现
#include <windows.h>
#include <wtsapi32.h>
#include <stdio.h>
#include <locale.h>
#pragma comment(lib, "Wtsapi32.lib")
int main(int argc, char* argv[]) {
setlocale(LC_ALL, "zh_CN.UTF-8");
PWTS_PROCESS_INFOW processInfo;
DWORD pCount;
WTSEnumerateProcessesW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &processInfo, &pCount);
for (int index = 0; index < pCount; index++) {
printf_s("%ws\n", processInfo[index].pProcessName);
}
WTSFreeMemory(processInfo);
return 1;
}
关注我们,咱们在安全的路上,扬帆起航
参考文献
[1] https://learn.microsoft.com/zh-cn/windows/win32/api/wtsapi32/nf-wtsapi32-wtsenumerateprocessesa?redirectedfrom=MSDN
[2] https://learn.microsoft.com/zh-cn/windows/win32/api/wtsapi32/ns-wtsapi32-wts_process_infoa