在开发看门狗服务程序拉起外部有UI 界面的程序的过程中,虽然系统显示程序已经在运行且能查到有进程,但是界面并没有显示;无论是用shellExecute 还是CreateProcess 都不行。
后面通过网上资料知道因为服务程序在Windows 中处于session0 的区域,而一般的桌面程序是在session1,2,3…中,若要想把界面显示出来,我们需要做权限击穿来模拟用户启动程序。简单的来说,就是我们要先拿到当前explorer.exe的token,然后模拟当前用户来启动进程。
代码展示
在正式打开/关闭外部程序之前,我们要先建立两个函数来获得进程句柄以及当前explorer.exe的token
// 通过进程ID 来获得进程句柄
HANDLE GetProcessHandle(int ID)
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, ID);
}
// 获取当前explorer.exe的token
BOOL GetTokenByName(HANDLE &hToken, LPSTR lpName)
{
if (!lpName)
{
return FALSE;
}
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = { 0 };
HANDLE hProcess = NULL;
// 获取系统中正在运行的进程信息
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
return FALSE;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hPr