В моей локальной системной службе я могу запустить процесс пользовательского интерфейса, который должен запускаться с учетными данными вошедшего в систему пользователя Windows, но иногда, когда нет вошедшего в систему пользователя, он может запускаться в Winlogon
или «безопасный рабочий стол».
Таким образом, я использую следующую конструкцию для подготовки к ней токена пользователя:
//The following pseudo-code snippet is run from the local system service
HANDLE hSelfToken = NULL;
HANDLE hToken2 = NULL;
::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, &hSelfToken);
//Remove most of privileges & create restricted token
::CreateRestrictedToken(hSelfToken,
DISABLE_MAX_PRIVILEGE | LUA_TOKEN,
0, NULL,
0, NULL, 0, NULL,
&hToken2);
//Set user session ID for the token where the process will run
::SetTokenInformation(hToken2, TokenSessionId, &dwSessionId, sizeof(dwSessionId));
//The 'hToken2' is later used to call CreateProcessAsUser() to start a user UI process
Это прекрасно работает, за исключением того, что несмотря на то, что нет привилегий и никакого повышения, мой процесс пользовательского интерфейса, который запускается с помощью этого метода, все еще получает слишком много «прав» системной службы. Например, он может создать файл в C:\
корневую папку или открыть HKLM
ключ реестра для записи.
Поэтому мне любопытно, что еще я должен сделать, чтобы понизить привилегии дочернего процесса?
Задача ещё не решена.