| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 
 | #include "windows.h"#include <WtsApi32.h>
 #include <UserEnv.h>
 #include <tlhelp32.h>
 #include "base/charset.h"
 #include <tchar.h>
 #include <winbase.h>
 #pragma comment(lib, "WtsApi32.lib")
 #pragma comment(lib, "UserEnv.lib")
 
 BOOL RunExec(const TCHAR* path)
 {
 HANDLE hToken = 0;
 HANDLE hProcessSnap = 0;
 PROCESSENTRY32 pe32 = { 0 };
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 pe32.dwSize = sizeof(PROCESSENTRY32);
 wchar_t name[] = L"explorer.exe";
 for (Process32First(hProcessSnap, &pe32); Process32Next(hProcessSnap, &pe32);)
 {
 if (_wcsicmp((pe32.szExeFile), (name)))
 continue;
 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID);
 auto res = OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken);
 CloseHandle(hProcessSnap);
 }
 if (hToken == 0) return 0;
 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 ZeroMemory(&si, sizeof(STARTUPINFO));
 si.cb = sizeof(STARTUPINFO);
 wchar_t aa[] = L"winsta0\\default";
 si.lpDesktop = aa;
 si.dwFlags = STARTF_USESHOWWINDOW;
 si.wShowWindow = SW_SHOW;
 
 #ifdef UNICODE
 int l = wcslen(path);
 #else
 int l = strlen(path);
 #endif
 TCHAR* cmd = new TCHAR[l+1];
 cmd[l] = 0;
 memcpy(cmd, path, l*sizeof(TCHAR));
 BOOL res{ FALSE };
 DWORD err{ 0 };
 res = CreateProcessAsUser(hToken, L"run.bat", cmd, 0, 0, FALSE, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);
 if (!res)
 {
 LOG_ERROR("run error! LastError=%ld", GetLastError());
 }
 delete[] cmd;
 return res;
 }
 
 |