Как выдать себя за вошедшего в систему пользователя для чтения раздела / значений реестра в HKEY_CURRENT_USER? - PullRequest
0 голосов
/ 10 июля

Я пытаюсь выдать себя за уже вошедшего в систему пользователя из 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? И если да, то что не так в этом коде?

...