В рамках проекта, который работает как служба, порождающая процесс на экране входа в систему (для управления рабочим столом), мы вызываем OpenProcessToken(), который затем дублируется и создается процесс. Это успешно работает, как и ожидалось, в LocalSystem, однако это не работает под учетной записью домена. Фрагмент кода ниже...
procedure LaunchProcess;
var dwPid, dwSessionId: DWord;
hUserToken, hProcess: THANDLE;
begin
dwPid := GetProcessID('winlogon.exe', WTSGetActiveConsoleSessionId);
hProcess := OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
if (not OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY or TOKEN_DUPLICATE or
TOKEN_ASSIGN_PRIMARY or TOKEN_ADJUST_SESSIONID or TOKEN_READ or TOKEN_WRITE, hUserToken)) then
raise Exception.Create('OpenProcessToken failed (' + SysErrorMessage(GetLastError) + ').');
{...go on to duplicate token, create environment and launch process...}
end;
Полный исходный код вспомогательной функции можно найти здесь.
Вот тут становится немного неясно. Я понимаю, что OpenProcessToken() требует привилегий, поэтому в конечном итоге я получаю сообщение об ошибке, однако было неясно, какие привилегии мне требуются и как эффективно назначить их учетной записи домена.
Это предполагает, что необходимая привилегия — SeTcbPrivilege ("Действовать как часть операционной системы").
Я прочитал страницу Microsoft (не могу связать, недостаточно репутации - извините) о привилегиях, которая предполагает, что SeTcbPrivilege может быть назначен учетной записи домена с использованием локальной или групповой политики безопасности. Также было высказано предположение, что процесс назначения (например, winlogon.exe) может просто не разрешать ничему, кроме LocalSystem, получать свой токен.
Я попытался настроить учетную запись домена явно с помощью учетной записи службы, но в локальной безопасности и групповой политике перезапустил и выполнил gporesult
, чтобы убедиться, что политика вступила в силу, но каждый раз, когда whoami /priv
возвращает, SeTcbPrivilege отключен
Мой вопрос заключается в том, возможно ли это вообще (могу ли я получить токен winlogon.exe, используя учетную запись домена), и если да, то можно ли установить привилегию программно, или это должно быть через GPO? (и если это так, учитывая, что мои предыдущие попытки использования GPO не дали результата, как это возможно)