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

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

#include  #include  #include  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 () :
Если текущий stream олицетворяет другого клиента, функция GetUserName возвращает имя пользователя клиента, выдающего stream.

Вопрос

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

2 Solutions collect form web for “C ++ – GetUserName (), когда процесс запускается как администратор”

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

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

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

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

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

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

Interesting Posts

Где разместить и как читать файлы ресурсов конфигурации в приложении на основе сервлета?

Изменение цвета дисплея с Ч / Б до цвета (наоборот) с помощью программы.

JSON для экземпляра classа TypeScript?

Команда MSG в Windows 7

Linux, найти все файлы, соответствующие шаблону и удалить

Создайте много tar-файлов из каталога с 500000 файлами

C # Игнорировать ошибки сертификата?

Как предотвратить автоматическое опорожнение удаленных элементов при выходе из Outlook 2010?

Плюсы / минусы баз данных на основе документов и реляционных баз данных

Как упрощенная инструкция оператора работает для массивов и как получить iterator для массива?

Захват данных, отправляемых моим модемом ADSL

Декодирование длины пробега в MATLAB

Установка объектов на Null / Nothing после использования в .NET.

Почему не меняется префикс до приращения записи в итерационной части цикла for?

Что использует дисковое пространство?

Давайте будем гением компьютера.