Al ejecutar un script de línea de comandos, ¿es posible obtener el nombre del usuario actual?
Al ejecutar un script de línea de comandos, ¿es posible obtener el nombre del usuario actual?
Respuestas:
Nombre de usuario
echo %USERNAME%
Nombre de dominio:
echo %USERDOMAIN%
Puede obtener una lista completa de variables de entorno ejecutando el comando set
desde el símbolo del sistema.
Simplemente use este comando en el símbolo del sistema
C:\> whoami
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.
Debería estar adentro %USERNAME%
. Obviamente, esto se puede suplantar fácilmente, así que no confíes en él por seguridad.
Consejo útil: escriba set
un símbolo del sistema que enumerará todas las variables de entorno.
La respuesta depende del idioma en que se encuentre el "script de línea de comandos".
En el cmd.exe
símbolo del sistema anterior o en un script .bat
o .cmd
, puede usar lo siguiente:
%USERNAME%
- Obtiene solo el nombre de usuario.
%USERDOMAIN%
- Obtiene el dominio del usuario.
En el símbolo del sistema de PowerShell o un script .ps1
o .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 $Env
variables 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.
% 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
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.
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.
net config Workstation | find "User name"
whoami
está disponible a partir de Windows Vista.
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
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)
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 ">"].
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