
Различные методы получения текущего имени пользователя без использования whoami
Некоторые эксперименты по получению текущего имени пользователя без вызова whoami.exe или аналогичных бинарных файлов.
Получить переменные окружения из структуры PEB и проанализировать их, чтобы найти имя пользователя.
Функция NtQueryInformationProcess возвращает структуру "PROCESS_BASIC_INFORMATION", содержащую указатель на базовый адрес PEB.
Структура PEB содержит указатель "ProcessParameters" на структуру RTL_USER_PROCESS_PARAMETERS.
Из этой структуры можно получить указатель "Environment" на переменные окружения и указатель "EnvironmentSize" на размер переменных окружения.
Считав количество байтов, указанное в "EnvironmentSize", по адресу "Environment" как текст в кодировке UNICODE, проанализировать переменные окружения и вывести ту, которая называется "USERNAME". Если нужны все переменные окружения, загляните в этот репозиторий.


Получить доступ к токену, найти SID пользователя в строковом формате и преобразовать его с помощью функции LookupAccountSid.
Функция NtOpenProcessToken создает токен доступа, связанный с текущим процессом.
Функция NtQueryInformationToken получает информацию из созданного токена; используя значение "tokenUser" (1) в поле "TOKEN_INFORMATION_CLASS", мы получаем информацию об имени пользователя, которая хранится в указателе "TokenInformation".
Функция ConvertSidToStringSid преобразует SID пользователя из бинарного формата в строковый.
Функция LookupAccountSid принимает SID в строковом формате и возвращает имя пользователя.


Получить доступ к токену и объекту Policy и получить имя пользователя с помощью функции LsaLookupSids.
Функции NtOpenProcessToken и NtQueryInformationToken используются, как в методе 2, возвращают указатель "TokenInformation" с SID пользователя в бинарном формате.
Функция LsaOpenPolicy создает дескриптор объекта Policy в текущей системе.
Функция LsaLookupSids принимает указатель на SID и возвращает структуру LSA_TRANSLATED_NAME, содержащую имя пользователя.


Создать именованный канал (named pipe) и дополнительный поток, записать и прочитать из именованного канала и получить имя пользователя из недокументированной функции NpGetUsername.


Получить имя пользователя, если компьютер присоединен к домену, с помощью функции CoCreateInstance как в примере MSDN. Используются класс ADSystemInfoClass и интерфейсы ADSystemInfo и IADsADSystemInfo из ActiveDS.dll, которые уже находятся в папке проекта, поэтому DLL не требуется.
Если нет соединения с AD:

Если соединение есть:
