bool AddinHelper::LaunchJsEngineFromService(const std::wstring& jsEnginePath)
{
	if (::PathFileExists(jsEnginePath.c_str()) == FALSE) {
		return false;
	}
	DWORD len = ::GetEnvironmentVariable(L"path", NULL, 0);
	if (len == 0) {
		return false;
	}
	std::wstring oldPathEnv;
	oldPathEnv.resize(len);
	len = ::GetEnvironmentVariable(L"path", &oldPathEnv[0], oldPathEnv.size());
	if (len == 0 || len >= oldPathEnv.size()) {
		return false;
	}
	oldPathEnv.resize(len);
	std::size_t lastBackSlashPos =  jsEnginePath.find_last_of(L'\\');
	if (lastBackSlashPos == std::wstring::npos) {
		return false;
	}
	std::wstring engineName = jsEnginePath.substr(lastBackSlashPos + 1);
	std::wstring newPathEnv = jsEnginePath.substr(0, lastBackSlashPos);
	newPathEnv.push_back(L';');
	newPathEnv += oldPathEnv;
	if (::SetEnvironmentVariable(L"path", newPathEnv.c_str()) == FALSE) {
		return false;
	}

	DWORD dwSessionId = ::WTSGetActiveConsoleSessionId();
	HANDLE hUserToken = NULL;
	if(!::WTSQueryUserToken(dwSessionId, &hUserToken)) {
		TSERROR4CXX("WTSQueryUserToken fail. Error: " << ::GetLastError());
		return false;
	}

	ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseUserToken(hUserToken, ::CloseHandle);

	HANDLE hDuplicateToken = NULL;
	if (this->IsVistaOrHigher()) {
		TOKEN_ELEVATION_TYPE tokenElevationType;
		DWORD dwSize = sizeof(TOKEN_ELEVATION_TYPE);
		if(!::GetTokenInformation(hUserToken, TokenElevationType, &tokenElevationType, dwSize, &dwSize)) {
			TSERROR4CXX("GetTokenInformation TokenElevationType fail." << ::GetLastError());
			return false;
		}

		if(tokenElevationType == TokenElevationTypeLimited) {
			TOKEN_LINKED_TOKEN linkedToken; 
			dwSize = sizeof(TOKEN_LINKED_TOKEN);
			if (!::GetTokenInformation(hUserToken, TokenLinkedToken, &linkedToken, dwSize, &dwSize)) {
				TSERROR4CXX("GetTokenInformation TokenLinkedToken fail. Error: " << ::GetLastError());
				return false;
			}

			ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseLinkedToken(linkedToken.LinkedToken, ::CloseHandle);

			if(!::DuplicateTokenEx(linkedToken.LinkedToken, MAXIMUM_ALLOWED, NULL,  SecurityImpersonation, TokenPrimary, &hDuplicateToken)) {
				TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError());
				return false;
			}
		}
		else {
			if(!::DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL,  SecurityImpersonation, TokenPrimary, &hDuplicateToken)) {
				TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError());
				return false;
			}
		}
	}
	else {
		if(!::DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL,  SecurityImpersonation, TokenPrimary, &hDuplicateToken)) {
			TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError());
			return false;
		}
	}

	ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseDuplicateToken(hDuplicateToken, ::CloseHandle);
	if (::SetEnvironmentVariable(L"path", newPathEnv.c_str()) == FALSE) {
		return false;
	}

	wchar_t rundll32Path[MAX_PATH];
	if (::GetAndCheckX86Rundll32ExeFilePath(rundll32Path, MAX_PATH) == FALSE) {
		return false;
	}
	std::wstring commandLine = rundll32Path;
	commandLine.push_back(L' ');
	commandLine += engineName + L",ScreenSaverEx /src:service";
	STARTUPINFO startupInfo;
	std::memset(&startupInfo, 0, sizeof(STARTUPINFO));
	startupInfo.cb = sizeof(STARTUPINFO);
	startupInfo.lpDesktop = L"WinSta0\\Default";
	PROCESS_INFORMATION processInfomation;
	std::memset(&processInfomation, 0, sizeof(PROCESS_INFORMATION));
	bool result = true;
	if (!::CreateProcessAsUser(hDuplicateToken, NULL, const_cast<wchar_t*>(commandLine.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfomation)) {
		TSERROR4CXX("CreateProcessAsUser fail. Error: " << ::GetLastError());
		result = false;
	}
	//::SetEnvironmentVariable(L"path", oldPathEnv.c_str());
	return result;
}
DWORD AddinHelper::GetIntervalTime() const
{
	TSAUTO();
	DWORD dwResult = 3600;
	std::wstring subKey = L"Software\\";
	subKey += this->m_productName;
	subKey += L"Host";
	if (this->m_isService) {
		DWORD dwSessionId = ::WTSGetActiveConsoleSessionId();
		HANDLE hUserToken = NULL;
		if(!::WTSQueryUserToken(dwSessionId, &hUserToken)) {
			TSERROR4CXX("WTSQueryUserToken fail. Error: " << ::GetLastError());
			return dwResult;
		}
		
		ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseUserToken(hUserToken, ::CloseHandle);

		TOKEN_ELEVATION_TYPE tokenElevationType;
		DWORD dwSize = sizeof(TOKEN_ELEVATION_TYPE);
		if(!::GetTokenInformation(hUserToken, TokenElevationType, &tokenElevationType, dwSize, &dwSize)) {
			TSERROR4CXX("GetTokenInformation TokenElevationType fail." << ::GetLastError());
			return dwResult;
		}
		HANDLE hDuplicateToken = NULL;
		if(tokenElevationType == TokenElevationTypeLimited) {
			TOKEN_LINKED_TOKEN linkedToken; 
			dwSize = sizeof(TOKEN_LINKED_TOKEN);
			if (!::GetTokenInformation(hUserToken, TokenLinkedToken, &linkedToken, dwSize, &dwSize)) {
				TSERROR4CXX("GetTokenInformation TokenLinkedToken fail. Error: " << ::GetLastError());
				return dwResult;
			}

			ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseLinkedToken(linkedToken.LinkedToken, ::CloseHandle);

			if(!::DuplicateTokenEx(linkedToken.LinkedToken, MAXIMUM_ALLOWED, NULL,  SecurityImpersonation, TokenPrimary, &hDuplicateToken)) {
				TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError());
				return dwResult;
			}
		}
		else {
			if(!::DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL,  SecurityImpersonation, TokenPrimary, &hDuplicateToken)) {
				TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError());
				return dwResult;
			}
		}

		ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseDuplicateToken(hDuplicateToken, ::CloseHandle);
		TCHAR szUsername[MAX_PATH];
		DWORD dwUsernameLen = MAX_PATH;
		PROFILEINFO pi;
		std::memset(&pi, 0, sizeof(PROFILEINFO));
		pi.dwSize = sizeof(PROFILEINFO);
		if(!ImpersonateLoggedOnUser(hDuplicateToken)) {
			TSERROR4CXX("ImpersonateLoggedOnUser failed.");
			return dwResult;
		}
		DWORD dwUserNameLength = MAX_PATH;
		if(!::GetUserName(szUsername, &dwUserNameLength)) {
			TSERROR4CXX("GetUserName failed.");
			::RevertToSelf();
			return dwResult;
		}
		::RevertToSelf();
		pi.lpUserName = szUsername;
		pi.dwFlags = 1;
		if(!::LoadUserProfile(hDuplicateToken, &pi)) {
			TSERROR4CXX("LoadUserProfile failed.");
			return dwResult;
		}
		do {
			ATL::CRegKey key;
			if (key.Open((HKEY)pi.hProfile, subKey.c_str()) != ERROR_SUCCESS) {
				break;
			}
			DWORD dwInterval = 0;
			if(key.QueryDWORDValue(L"interval", dwInterval)!= ERROR_SUCCESS) {
				break;
			}
			dwResult = dwInterval;
		} while(false);
		::UnloadUserProfile(hDuplicateToken, pi.hProfile);
	}
	else {
		ATL::CRegKey key;
		TSERROR4CXX("GetIntervalTime subKey: " << subKey.c_str());
		if(key.Open(HKEY_CURRENT_USER, subKey.c_str()) != ERROR_SUCCESS) {
			return dwResult;
		}
		DWORD dwInterval = 0;
		if(key.QueryDWORDValue(L"interval", dwInterval)!= ERROR_SUCCESS) {
			return dwResult;
		}
		dwResult = dwInterval;
		TSERROR4CXX("GetIntervalTime dwInterval: " << dwInterval);
	}
	if (dwResult < 600) {
		dwResult = 600;
	}
	return dwResult;
}
Beispiel #3
0
bool LaunchGreenShield(DWORD browserProcessId)
{
	TSAUTO();
	const wchar_t launchParameters[] = L" /sstartfrom service /embedding /showbubble";
	if(!IsVistaOrLatter()) {
		// XP
		TSTRACE4CXX("XP");
		HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, browserProcessId);
		if(hProcess == NULL) {
			TSERROR4CXX("OpenProcess fail. Error: " << ::GetLastError());
			return false;
		}
		ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseProcessHandle(hProcess, ::CloseHandle);

		HANDLE hProcessToken = NULL;
		if(!::OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hProcessToken)) {
			TSERROR4CXX("OpenProcessToken fail. Error: " << ::GetLastError());
			return false;
		}
		ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseProcessToken(hProcessToken, ::CloseHandle);

		HANDLE hDuplicateToken = NULL;
		if(!::DuplicateTokenEx(hProcessToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hDuplicateToken)) {
			TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError());
			return false;
		}

		ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseDuplicateToken(hDuplicateToken, ::CloseHandle);

		wchar_t exeFilePath[MAX_PATH];
		// buffer 长度为MAX_PATH * 2 但这里只传MAX_PATH
		if(!GetGreenShiledExeFilePath(&exeFilePath[1], MAX_PATH)) {
			TSERROR4CXX("Failed to get ExeFilePath");
			return false;
		}
		else {
			TSINFO4CXX("GreenShield ExeFilePath: " << exeFilePath);
		}

		exeFilePath[0] = L'\"';
		std::size_t exeFilePathLength = std::wcslen(exeFilePath);
		exeFilePath[exeFilePathLength++] = L'\"';
		std::copy(launchParameters, launchParameters + sizeof(launchParameters) / sizeof(launchParameters[0]), exeFilePath + exeFilePathLength);

		STARTUPINFO startupInfo;
		std::memset(&startupInfo, 0, sizeof(STARTUPINFO));
		startupInfo.cb = sizeof(STARTUPINFO);
		startupInfo.lpDesktop = TEXT("WinSta0\\Default");

		PROCESS_INFORMATION processInfomation;
		std::memset(&processInfomation, 0, sizeof(PROCESS_INFORMATION));

		if(!::CreateProcessAsUser(hDuplicateToken, NULL, exeFilePath, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfomation)) {
			TSERROR4CXX("CreateProcessAsUser fail. Error: " << ::GetLastError());
			return false;
		}
		return true;
	}
	else {
		TSTRACE4CXX("Vista Or Higher");
		// Vista Or Higher
		DWORD sessionId = 0;
		if(!::ProcessIdToSessionId(browserProcessId, &sessionId)) {
			TSERROR4CXX("ProcessIdToSessionId fail. Error: " << ::GetLastError());
			return false;
		}

		WTSProvider wtsProvider;

		WTSProvider::WTSQueryUserTokenFuncType wtsQueryUserTokenPtr = wtsProvider.GetWTSQueryUserTokenFunctionPtr();
		if(!wtsQueryUserTokenPtr) {
			TSERROR4CXX("wtsQueryUserTokenPtr == NULL.");
			return false;
		}

		HANDLE hUserToken = NULL;
		if(!wtsQueryUserTokenPtr(sessionId, &hUserToken)) {
			TSERROR4CXX("WTSQueryUserToken fail. Error: " << ::GetLastError());
			return false;
		}
		
		ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseUserToken(hUserToken, ::CloseHandle);

		TOKEN_ELEVATION_TYPE tokenElevationType;
		DWORD dwSize = sizeof(TOKEN_ELEVATION_TYPE);
		if(!::GetTokenInformation(hUserToken, TokenElevationType, &tokenElevationType, dwSize, &dwSize)) {
			TSERROR4CXX("GetTokenInformation TokenElevationType fail." << ::GetLastError());
			return false;
		}
		HANDLE hDuplicateToken = NULL;
		if(tokenElevationType == TokenElevationTypeLimited) {
			TOKEN_LINKED_TOKEN linkedToken; 
			dwSize = sizeof(TOKEN_LINKED_TOKEN);
			if (!::GetTokenInformation(hUserToken, TokenLinkedToken, &linkedToken, dwSize, &dwSize)) {
				TSERROR4CXX("GetTokenInformation TokenLinkedToken fail. Error: " << ::GetLastError());
				return false;
			}

			ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseLinkedToken(linkedToken.LinkedToken, ::CloseHandle);

			if(!::DuplicateTokenEx(linkedToken.LinkedToken, MAXIMUM_ALLOWED, NULL,  SecurityImpersonation, TokenPrimary, &hDuplicateToken)) {
				TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError());
				return false;
			}
		}
		else {
			if(!::DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL,  SecurityImpersonation, TokenPrimary, &hDuplicateToken)) {
				TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError());
				return false;
			}
		}

		ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseDuplicateToken(hDuplicateToken, ::CloseHandle);

		wchar_t exeFilePath[MAX_PATH * 2];
		// buffer 长度为MAX_PATH * 2 但这里只传MAX_PATH
		if(!GetGreenShiledExeFilePath(&exeFilePath[1], MAX_PATH)) {
			TSERROR4CXX("Failed to get ExeFilePath");
			return false;
		}
		else {
			TSINFO4CXX("GreenShield ExeFilePath: " << exeFilePath);
		}
		
		exeFilePath[0] = L'\"';
		std::size_t exeFilePathLength = std::wcslen(exeFilePath);
		exeFilePath[exeFilePathLength++] = L'\"';
		std::copy(launchParameters, launchParameters + sizeof(launchParameters) / sizeof(launchParameters[0]), exeFilePath + exeFilePathLength);

		STARTUPINFO startupInfo;
		std::memset(&startupInfo, 0, sizeof(STARTUPINFO));
		startupInfo.cb = sizeof(STARTUPINFO);
		startupInfo.lpDesktop = TEXT("WinSta0\\Default");

		PROCESS_INFORMATION processInfomation;
		std::memset(&processInfomation, 0, sizeof(PROCESS_INFORMATION));

		if(!::CreateProcessAsUser(hDuplicateToken, NULL, exeFilePath, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfomation)) {
			TSERROR4CXX("CreateProcessAsUser fail. Error: " << ::GetLastError());
			return false;
		}
		return true;
	}
}