¿Cómo encuentra al usuario actual en un entorno Windows?

159

Al ejecutar un script de línea de comandos, ¿es posible obtener el nombre del usuario actual?

Geo
fuente
Relacionado (desde .NET): ¿Cómo obtengo el nombre de usuario actual en .NET usando C #?
Peter Mortensen
@ PeterMortensen, no creo que ese hilo esté súper relacionado con este. Uno es sobre el uso de .NET y otro sobre el uso de la API cmd . Además del hecho de que ambos quieren la misma información, ciertamente hay toneladas de otras API que también hacen algo similar
KyleMit

Respuestas:

202

Puede usar la variable de nombre de usuario: %USERNAME%

JRL
fuente
90

Nombre de usuario

echo %USERNAME%

Nombre de dominio:

echo %USERDOMAIN%

Puede obtener una lista completa de variables de entorno ejecutando el comando setdesde el símbolo del sistema.

Magnus Lindhe
fuente
La información adicional con todas las variables de entorno hace que esta sea una maravillosa respuesta extendida.
bballdave025
63

Simplemente use este comando en el símbolo del sistema

C:\> whoami
Hombre libre
fuente
Esta es una buena respuesta, pero hay algunas advertencias. Si entro whoami, me sale desktop-machine\bballdave025. Hay dos partes, vistas a través de: 1) echo %USERNAME%, resultado bballdave025; 2) echo %USERDOMAIN%, resultado DESKTOP-MACHINE. Supongo que uno podría decir que el 'nombre de usuario completo' está disponible a través de echo %USERDOMAIN%\%USERNAME%(este resultado DESKTOP-MACHINE\bballdave025, coincide con el de whoami, ignorando mayúsculas y minúsculas), o incluso a través de echo %USERNAME%@%USERDOMAIN%, resultado bballdave025@DESKTOP-MACHINE. Todo depende de lo que el usuario (para nosotros, el OP) necesite , es decir, si la parte del dominio es importante.
bballdave025
46

Debería estar adentro %USERNAME%. Obviamente, esto se puede suplantar fácilmente, así que no confíes en él por seguridad.

Consejo útil: escriba setun símbolo del sistema que enumerará todas las variables de entorno.

the_mandrill
fuente
2
Su 'net config Workstation | encontrar el comentario "Nombre de usuario" es muy útil. Debería haber sido una respuesta en lugar de solo un comentario
Alpay
17

%USERNAME% es la respuesta correcta en lotes y otros en entornos Windows.

Otra opción es usar %USERPROFILE%para obtener la ruta del usuario, como C:\Users\username.

Recon
fuente
6

La respuesta depende del idioma en que se encuentre el "script de línea de comandos".

Cmd

En el cmd.exesímbolo del sistema anterior o en un script .bato .cmd, puede usar lo siguiente:

%USERNAME% - Obtiene solo el nombre de usuario.

%USERDOMAIN% - Obtiene el dominio del usuario.

Potencia Shell

En el símbolo del sistema de PowerShell o un script .ps1o .psm1, puede usar lo siguiente:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name- Le da el nombre de usuario completo (por ejemplo, Dominio \ Nombre de usuario). Este también es el método más seguro porque el usuario no puede anularlo como las otras $Envvariables a continuación.

$Env:Username - Obtiene solo el nombre de usuario.

$Env:UserDomain - Obtiene el dominio del usuario.

$Env:ComputerName - Obtiene el nombre de la computadora.

perro mortal
fuente
Esta es una gran respuesta ya que esta pregunta depende de 'shell'. Hay muchos shells que puedes usar con Windows. No solo CMD. En estos días, la mayoría de la gente se ha mudado a PowerShell y hay otros por ahí. stackoverflow.com/questions/17349022/…
G_Style
5

% USERNAME% le dará el nombre de usuario del proceso actualmente en ejecución. Dependiendo de cómo esté ejecutando su archivo por lotes, esto no es necesariamente el mismo que el nombre del usuario actual. Por ejemplo, puede estar ejecutando su archivo por lotes a través de una tarea programada, desde un servicio, etc.

Aquí hay una forma más segura de obtener el nombre de usuario del usuario actualmente conectado al raspar el nombre del usuario que inició la tarea explorer.exe:

for /f "TOKENS=1,2,*" %%a in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do if /i "%%a %%b"=="User Name:" set _currdomain_user=%%c
for /f "TOKENS=1,2 DELIMS=\" %%a in ("%_currdomain_user%") do set _currdomain=%%a & set _curruser=%%b
BlueBearr
fuente
4

Utilizo este método al escribir archivos por lotes para realizar pruebas.

echo %userdomain%\%username%

Dado que debe incluir la contraseña en texto sin formato si se requiere autenticación, solo la usaré en un entorno completamente privado donde otros usuarios no puedan verla o si un usuario que ve la contraseña no tendría consecuencias.

Espero que esto ayude a alguien.

Chad Harrington Mitchell
fuente
4

Siempre me ha molestado que Windows no tenga algunas de las pequeñas utilidades de scripts más útiles de Unix, como who / whoami , sed y AWK . De todos modos, si quieres algo infalible, obtén Visual Studio Express y compila lo siguiente:

#include <windows.h>
#include <stdio.h>

int main(int argc, char **argv) {
    printf("%s", GetUserName());
}

Y solo utilízalo en tu archivo por lotes.

Chris K
fuente
Sí, hubiera sido bueno tener un incorporado.
Geo
8
Estoy de acuerdo en que sed & awk sería útil, pero esto te lleva al 50% del camino: net config Workstation | find "User name"
the_mandrill
9
whoamiestá disponible a partir de Windows Vista.
Joey el
2
Es cierto que la utilidad whoami se incluye con Vista. Para XP, está en las herramientas de soporte de SP2 y para W2K, está en el kit de herramientas de recursos.
RealHowTo
4

En la mayoría de los casos, la variable% USERNAME% será lo que desee.

echo %USERNAME%

Sin embargo, si está ejecutando un shell de cmd elevado,% USERNAME% informará el nombre del administrador en lugar de su propio nombre de usuario. Si quieres saber lo último, ejecuta:

for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u
Jean-François Larvoire
fuente
1

Esta es la principal diferencia entre la variable de nombre de usuario y el comando whoami:

C:\Users\user.name>echo %username%
user.name

C:\Users\user.name>whoami
domain\user.name

DOMAIN = bios name of the domain (not fqdn)
integratorIT
fuente
0

En un contexto estándar, cada usuario conectado tiene un proceso explorer.exe: el comando [tasklist / V | find "explorer"] devuelve una línea que contiene el propietario del proceso explorer.exe, con una expresión regular adaptada es posible obtener el requerido valor. Esto también funciona perfectamente con Windows 7.

En casos excepcionales, explorer.exe es reemplazado por otro programa, el filtro de búsqueda se puede adaptar para que coincida con este caso. Si el comando devuelve una línea vacía, es probable que ningún usuario haya iniciado sesión. Con Windows 7 también es posible ejecutar [sesión de consulta | buscar ">"].

Armand Poulenard
fuente
0

En lo que respecta a encontrar la mejor respuesta de BlueBearr (mientras estoy ejecutando mi script por lotes con, por ejemplo, derechos de sistema) tengo que agregarle algo. Porque en mi línea de versión de idioma de Windows (polaco) que debe ser captada por "%% a %% b" == "Nombre de usuario:" REALMENTE COMPLICADO (contiene algunos caracteres diacríticos en mi idioma) omito las primeras 7 líneas y operar el día 8

@for /f "SKIP= 7 TOKENS=3,4 DELIMS=\ " %%G in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do @IF %%G==%COMPUTERNAME% set _currdomain_user=%%H
ITMarka
fuente