|
发表于 2016-11-23 13:52:11
|
显示全部楼层
不一定非要win7.h的,主要是要实现功能的关键代码,贴出来,自己研究下吧
- HANDLE RunInActiveSession(LPCTSTR lpCommandLine)
- {
- HANDLE hProcess;
- HANDLE result;
- HANDLE hProcessInfo;
-
- HINSTANCE userenv = LoadLibrary("userenv.dll");
- typedef DWORD (WINAPI *CEB)(LPVOID *lpEnvironment,HANDLE hToken,BOOL bInherit);
- CEB myCreateEnvironmentBlock= (CEB )GetProcAddress(userenv,"CreateEnvironmentBlock");
-
- LPVOID lpEnvironment = NULL;
- DWORD TokenInformation = 0;
- HANDLE hExistingToken = NULL;
- HANDLE hObject = NULL;
-
- STARTUPINFO StartupInfo;
- PROCESS_INFORMATION ProcessInfo;
- ZeroMemory(&StartupInfo,sizeof(STARTUPINFO));
- ZeroMemory(&ProcessInfo,sizeof(PROCESS_INFORMATION));
-
- ProcessInfo.hProcess = 0;
- ProcessInfo.hThread = 0;
- ProcessInfo.dwProcessId = 0;
- ProcessInfo.dwThreadId = 0;
- StartupInfo.cb = 68;
- StartupInfo.lpDesktop = "WinSta0\\Default";
-
- hProcess = GetCurrentProcess();
- OpenProcessToken(hProcess, 0xF01FFu, &hExistingToken);
- DuplicateTokenEx(hExistingToken, 0x2000000u, NULL, SecurityIdentification, TokenPrimary, &hObject);
- typedef DWORD (WINAPI *TWTSGetActiveConsoleSessionId)(void);
-
- TWTSGetActiveConsoleSessionId MyWTSGetActiveConsoleSessionId;
- MyWTSGetActiveConsoleSessionId = (TWTSGetActiveConsoleSessionId )GetProcAddress(LoadLibrary("Kernel32.dll"),"WTSGetActiveConsoleSessionId");
-
- if ( MyWTSGetActiveConsoleSessionId )
- {
- TokenInformation = MyWTSGetActiveConsoleSessionId();
-
- SetTokenInformation(hObject, TokenSessionId, &TokenInformation, sizeof(DWORD));
- myCreateEnvironmentBlock(&lpEnvironment, hObject, false);
- // WTSQueryUserToken(TokenInformation,&hObject);
- CreateProcessAsUser(
- hObject,
- NULL,
- (TCHAR*)lpCommandLine,
- NULL,
- NULL,
- false,
- 0x430u,
- lpEnvironment,
- NULL,
- &StartupInfo,
- &ProcessInfo);
- hProcessInfo = ProcessInfo.hProcess;
- CloseHandle(hObject);
- CloseHandle(hExistingToken);
- result = hProcessInfo;
- }
- else
- {
- result = 0;
- }
-
- if(userenv)
- FreeLibrary(userenv);
-
- return result;
- }
复制代码 |
|