Возможно ли запустить процесс в системном контексте из родительского процесса, который выполняется под учетной записью администратора с увеличением (например, командной строки). Проблема похожа на то, что psexec делает, но больше того, как она на самом деле реализует это.Выполнение процесса в системном контексте
Я думал, открывая процесс crss.exe/winlogon.exe, дублируя токен и запуская новый процесс, используя этот токен процесса. Но я даже не могу открыть дескриптор процесса (Getlasterror return 5). Может ли кто-нибудь сообщить мне, если это правильный подход или процесс должен запускаться по-другому?
HANDLE hWinLogonProcess;
for(const auto& ps : running_processes)
{
if(ps.id == GetCurrentProcessId() ||
0 != ps.short_name.CompareNoCase(L"winlogon.exe"))
{
continue;
}
DWORD dwWinLogonSessionId(0);
if(FALSE == ProcessIdToSessionId(GetCurrentProcessId(), &dwWinLogonSessionId))
{
std::wcerr<<"Could not get Winlogon process session id"<<std::endl;
continue;
}
if(dwWinLogonSessionId != dwCurSessionId)
{
continue;
}
hWinLogonProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ps.id);
if(FALSE == hWinLogonProcess)
{
std::wcerr<<"Failed to get winlogon process handle"<<std::endl;
return;
}
else
{
std::wcout<<"Able to open process "<<ps.short_name.GetString()<<" handle"<<std::endl;
break;
}
}
Я уверен, что его можно, как есть рабочий инструмент (PsExec), но я не смог найти каких-либо ссылок в Интернете, чтобы сделать это.
Также это похоже на question, но публикуется отдельно, поскольку были детали о том, как это должно было быть достигнуто.
См. [Как работает psexec] (http://forum.sysinternals.com/topic9674_post41829.html#41829). В двух словах, psexec регистрируется администратором и устанавливает и запускает временную службу для получения доступа к системе, затем эта служба запускает команду, а затем psexec останавливает и удаляет службу. psexec использует каналы для обмена ввода/вывода между собой и службой, а служба использует каналы для обмена ввода/вывода с помощью текущей команды. –
Спасибо @RemyLebeau, я вижу, что psexec создает сервис, чтобы достичь этого. Но я получил dll и не хочу вводить в него новый exe. Можно ли добиться этого программно. Поскольку мой текущий процесс уже запущен с правами администратора. – user3279954
Только служба может получить Системные привилегии, и только Администратор может установить службу. Вы не можете запускать DLL напрямую в качестве службы (если только это не драйвер), но вам также не нужно писать отдельный EXE. Вы можете: 1) спроектировать DLL для вызова из ['Rundll32'] (https://support.microsoft.com/en-us/kb/164787), а затем использовать этот EXE в качестве службы или 2) иметь main EXE устанавливает себя как службу с параметром командной строки, а затем добавляет соответствующие вызовы API-сервиса к вашей функции 'WinMain()', когда EXE запускается с этим параметром, и при необходимости ваша «служба» использует DLL. –