У меня есть простая программа 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 возвращает имя пользователя клиента, который олицетворяет поток.
Есть ли способ получить реального вошедшего в систему пользователя (без прав администратора), даже если процесс запускается от имени администратора?
Я считаю, что вопрос, который вы хотите задать Windows, «какой пользователь вошел в текущий сеанс».
Для этого позвоните ProcessIdToSessionId () с идентификатором вашего собственного процесса, чтобы определить текущий идентификатор сеанса.
Тогда позвони WTSQuerySessionInformation () с WTSUserName
возможность получить имя пользователя.
Проблема не в нити, которая подражает. Вы запускаете все приложение под логином администратора. Вот почему Windows попросила вас войти в систему с учетной записью администратора, когда вы запустили ее с учетной записью без прав администратора.
Таким образом, результат, который вы получаете от GetUserName()
верно. Это имя реального пользователя вашего приложения.
Если вам нужно другое имя, стандартное решение — запускать как обычный пользователь и иметь кнопку «поднять», которая перезапускает ваше приложение с повышенными привилегиями. Посмотрите как диспетчер задач, он делает это, если вы хотите увидеть все запущенные процессы. На этом этапе вы, конечно, можете передать в новый процесс все, что захотите, включая это имя пользователя.