Я пытаюсь выдать себя за уже вошедшего в систему пользователя из windows службы (которая запускается с локальной системной учетной записью). Моя основная цель - иметь возможность читать некоторые определенные c ключи / значения реестра в HKEY_CURRENT_USER.
Я уже могу запустить новый процесс с «идентификатором» пользователя, но, похоже, я не могу чтобы практиковать олицетворение из любого потока внутри моей службы.
Вот код, который я использую, кажется, все в порядке, кроме случаев, когда я пытаюсь открыть ключ, который существует только в HKEY_CURRENT_USER для вошедшего в систему пользователя:
#include <windows.h>
#include <wil/resource.h>
#include <Wtsapi32.h>
// The *wil* namespace comes from the microsoft wil package: https://github.com/microsoft/wil.
// You can just replace unique_handle by HANDLE and unique_hkey by HKEY to make this sample work.
void Impersonate()
{
DWORD sessionId = WTSGetActiveConsoleSessionId();
// Get the primary user token
wil::unique_handle hUserToken;
if (!WTSQueryUserToken(sessionId, &hUserToken))
return;
// Get the impersonation token
wil::unique_handle hImpersonationToken;
if (!DuplicateToken(
hUserToken.get(), SECURITY_IMPERSONATION_LEVEL::SecurityImpersonation, &hImpersonationToken))
return;
// Impersonate ?
if (!SetThreadToken(NULL, hImpersonationToken.get()))
return;
// Also tried by using ImpersonateLoggedOnUser :
// if (!ImpersonateLoggedOnUser(hUserToken.get()))
// return;
// Not working
// (I just created a 'Fake' key under HKEY_CURRENT_USER for the logged on user)
wil::unique_hkey hKey;
LSTATUS status = RegOpenKeyEx(HKEY_CURRENT_USER, L"Fake", 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
if (ERROR_SUCCESS != status)
{
// Get ERROR_FILE_NOT_FOUND error
}
RevertToSelf();
}
Возможно ли (с помощью олицетворения) читать значения реестра в HKEY_CURRENT_USER? И если да, то что не так в этом коде?