C++ - GetUserName(), когда процесс запускается от имени администратора

У меня есть простая программа C++, которая запрашивает имя пользователя

#include <windows.h>
#include <Lmcons.h>
#include <winbase.h>

int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t username[UNLEN + 1];
    DWORD username_len = UNLEN + 1;
    ::GetUserName(username, &username_len);

    MessageBox(NULL, username, NULL, 1);
    return 1;
}

GetUserName() работает должным образом в учетных записях администратора, то есть выдает реальное имя пользователя.

Однако при запуске от имени администратора с учетной записью без прав администратора я получаю имя администратора, а не реального зарегистрированного пользователя.

Я считаю, что такое поведение ожидается, так как оно задокументировано в GetUserName():
Если текущий поток олицетворяет другого клиента, функция GetUserName возвращает имя пользователя клиента, который олицетворяет поток.

Вопрос

Есть ли способ получить реального вошедшего в систему пользователя (без прав администратора), даже если процесс запускается от имени администратора?

2 ответа

Решение

Я считаю, что вопрос, который вы хотите задать Windows, "какой пользователь вошел в текущий сеанс".

Для этого вызовите ProcessIdToSessionId() с вашим собственным идентификатором процесса, чтобы определить текущий идентификатор сеанса.

Затем вызовите WTSQuerySessionInformation() с WTSUserName возможность получить имя пользователя.

Проблема не в нити, которая подражает. Вы запускаете все приложение под логином администратора. Вот почему Windows попросила вас войти в систему с учетной записью администратора, когда вы запустили ее с учетной записью без прав администратора.

Таким образом, результат, который вы получаете от GetUserName() верно. Это имя реального пользователя вашего приложения.

Если вам нужно другое имя, стандартное решение - запускать как обычный пользователь и иметь кнопку "поднять", которая перезапускает ваше приложение с повышенными привилегиями. Посмотрите как диспетчер задач, он делает это, если вы хотите увидеть все запущенные процессы. На этом этапе вы, конечно, можете передать в новый процесс все, что захотите, включая это имя пользователя.

Другие вопросы по тегам