我正在尝试创建一个流程来启动需要UI的应用程序。因此它不能在 session 0中。
我的想法是获取当前登录用户的winlogon.exe的进程ID。这样,我可以复制winlogon token 并使用CreateProcessAsUser函数运行我的应用程序。
到目前为止我的代码:(当需要运行我想要的应用程序时,将调用此代码)
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
this function()
{
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
DWORD dwPriorityClass;
// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
// Set the size of the structure before using it.
pe32.dwSize = sizeof( PROCESSENTRY32 );
//get the active session id
DWORD sessionID = WTSGetActiveConsoleSessionId();
// Now walk through the snapshot of processes
//I want to narrow this down to processes called winlogon
//if multiple users logged on system i want to make sure the active user
//will get the application run the their screen
do
{
// Retrieve the priority class.
dwPriorityClass = 0;
//here i want to compare the sessionID with session IDs of each winlogon process
//stuck for implementation here
//when i find a match i can use the processID to gain the token and create
//a duplicate so it can be used in CreateAsUser function.
}while( Process32Next( hProcessSnap, &pe32 ) );
}
因此,基本上,我需要一些帮助来将进程的快照范围缩小到“winlogon”,并遍历这些进程的 session ID以匹配 Activity 用户的sessionID。
先谢谢了
最佳答案
您可以使用ProcessIdToSessionId获取与“winlogon.exe”匹配的每个进程的 session ID,然后将结果与WTSGetActiveConsoleSessionId进行比较。
您可以在循环中使用以下代码片段:
if (_wcsicmp(pe32.szExeFile, L"winlogon.exe") == 0)
{
DWORD ProcessSessionId = 0;
ProcessIdToSessionId(pe32.th32ProcessID, &ProcessSessionId);
if (ProcessSessionId == sessionID)
{
DoYourMagic(pe32.th32ProcessID);
break;
}
}
关于c++ - 获取winlogon.exe的 session ID和进程ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13480344/