Windows 7 — 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 возвращает имя пользователя клиента, который олицетворяет поток.

Вопрос

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

4

Решение

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

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

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

7

Другие решения

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

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

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

4

По вопросам рекламы [email protected]