
Diferentes métodos para obtener el nombre de usuario actual sin usar whoami
Algunos experimentos para obtener el nombre de usuario actual sin llamar a whoami.exe o binarios similares.
Obtener las variables de entorno de la estructura PEB y analizarlas para encontrar el nombre de usuario.
La función NtQueryInformationProcess devuelve una estructura "PROCESS_BASIC_INFORMATION" que contiene un puntero a la dirección base del PEB.
La estructura PEB contiene un puntero "ProcessParameters" a una estructura RTL_USER_PROCESS_PARAMETERS.
De esa estructura se puede obtener un puntero "Environment" a las variables de entorno y un puntero "EnvironmentSize" al tamaño de las variables de entorno.
Leyendo el número de bytes indicado en "EnvironmentSize" desde la dirección "Environment" como texto UNICODE, analizar las variables de entorno e imprimir la llamada "USERNAME". Si desea todas las variables de entorno, consulte este repositorio


Obtener acceso a un token, encontrar el SID del usuario en formato cadena y traducirlo usando la función LookupAccountSid.
La función NtOpenProcessToken crea un token de acceso asociado al proceso actual.
La función NtQueryInformationToken obtiene información del token que creamos, usando el valor "tokenUser" (1) en el campo "TOKEN_INFORMATION_CLASS" obtenemos información sobre el nombre de usuario que se almacena en el puntero "TokenInformation".
La función ConvertSidToStringSid convierte el SID del nombre de usuario en formato binario a formato cadena.
La función LookupAccountSid toma el SID en formato cadena y devuelve el nombre de usuario.


Obtener acceso a un token y un objeto Policy y obtener el nombre de usuario con la función LsaLookupSids.
Las funciones NtOpenProcessToken y NtQueryInformationToken se usan como en el método 2, devuelven un puntero "TokenInformation" con el SID del usuario en formato binario.
La función LsaOpenPolicy crea un identificador al objeto Policy en el sistema actual.
La función LsaLookupSids toma un puntero al SID y devuelve una estructura LSA_TRANSLATED_NAME que contiene el nombre de usuario.


Crear una tubería con nombre (named pipe) y un hilo secundario, escribir y leer desde la tubería con nombre y obtener el nombre de usuario de la función no documentada NpGetUsername.


Obtener el nombre de usuario si el equipo está unido a un dominio usando la función CoCreateInstance como en el ejemplo de MSDN. Utiliza la clase ADSystemInfoClass y las interfaces ADSystemInfo y IADsADSystemInfo de ActiveDS.dll, que ya están en la carpeta del proyecto, por lo que no necesita la DLL.
Si no hay conexión con el AD:

Si hay conexión:
