
Diferentes métodos para obter o nome de usuário atual sem usar whoami
Algumas experiências para obter o nome de usuário atual sem chamar whoami.exe ou binários similares.
Obter as variáveis de ambiente da estrutura PEB e analisá-las para encontrar o nome de usuário.
A função NtQueryInformationProcess retorna uma estrutura "PROCESS_BASIC_INFORMATION" contendo um ponteiro para o endereço base do PEB.
A estrutura PEB contém um ponteiro "ProcessParameters" para uma estrutura RTL_USER_PROCESS_PARAMETERS.
A partir dessa estrutura, você pode obter um ponteiro "Environment" para as variáveis de ambiente e um ponteiro "EnvironmentSize" para o tamanho das variáveis de ambiente.
Lendo o número de bytes indicado em "EnvironmentSize" do endereço "Environment" como texto UNICODE, analise as variáveis de ambiente e imprima a chamada "USERNAME". Se você quiser todas as variáveis de ambiente, veja este repositório


Obter acesso a um token, encontrar o SID do usuário em formato de string e traduzi-lo usando a função LookupAccountSid.
A função NtOpenProcessToken cria um token de acesso associado ao processo atual.
A função NtQueryInformationToken obtém informações do token que criamos, usando o valor "tokenUser" (1) no campo "TOKEN_INFORMATION_CLASS" obtemos informações sobre o nome de usuário que estão armazenadas no ponteiro "TokenInformation".
A função ConvertSidToStringSid converte o SID do nome de usuário em formato binário para formato de string.
A função LookupAccountSid recebe o SID em formato de string e retorna o nome de usuário.


Obter acesso a um token e a um objeto Policy e obter o nome de usuário com a função LsaLookupSids.
As funções NtOpenProcessToken e NtQueryInformationToken são usadas como no método 2, retornam um ponteiro "TokenInformation" com o SID do usuário em formato binário.
A função LsaOpenPolicy cria um identificador para o objeto Policy no sistema atual.
A função LsaLookupSids recebe um ponteiro para o SID e retorna uma estrutura LSA_TRANSLATED_NAME contendo o nome de usuário.


Criar um named pipe e uma thread secundária, escrever e ler do named pipe e obter o nome de usuário da função não documentada NpGetUsername.


Obter o nome de usuário se o computador estiver associado a um domínio usando a função CoCreateInstance como no exemplo MSDN. Utiliza a classe ADSystemInfoClass e as interfaces ADSystemInfo e IADsADSystemInfo da ActiveDS.dll, que já estão na pasta do projeto, portanto você não precisa da DLL.
Se não houver conexão com o AD:

Se houver conexão:
