Получить имя пользователя сеанса Windows в C ++ - PullRequest
1 голос
/ 25 декабря 2010

Я пытаюсь лучше понять, как работают сеансы Windows (сеансы TS и сеансы входа в систему) (в настоящее время в XP), поэтому, возможно, весь мой вопрос или то, что я пытаюсь сделать, невозможно.

Яработает служба Windows (в XP), которая выполняется в сеансе 0, и я пытаюсь привязать имя пользователя к этому сеансу, используя WTSQueryUserToken().Теперь в сеансе 0 есть несколько имен пользователей: SYSTEM, theuser (вошли в систему), NETWORK SERVICE, LOCAL SERVICE.

Когда я использую WTSQueryUserToken(), я получаю «theuser» (которыйэто активный сеанс), но я пытаюсь получить имя пользователя моей службы (которая является SYSTEM).Это возможно, или я просто все неправильно понял?

1 Ответ

1 голос
/ 25 декабря 2010

Я использую следующий код для получения токена пользователя для моего процесса

HANDLE GetProcessOwnerToken(DWORD pid)
{
    if (!pid) return NULL;

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    if (!hProcess) return NULL;

    HANDLE hToken = NULL;
    if(OpenProcessToken(hProcess, MAXIMUM_ALLOWED, &hToken))
    {
        HANDLE result = INVALID_HANDLE_VALUE;
        if(DuplicateTokenEx(hToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &result))
        {
            if(result != INVALID_HANDLE_VALUE)
            {
                CloseHandle(hToken);
                CloseHandle(hProcess);
                return result;
            }
        }
        CloseHandle(hToken);
    }
    CloseHandle(hProcess);

    return NULL;
}

Я понятия не имею, работает ли он также и для сервисов, думаю, так и должно быть.

...