Ao executar um script de linha de comando, é possível obter o nome do usuário atual?
Ao executar um script de linha de comando, é possível obter o nome do usuário atual?
Respostas:
Nome do usuário:
echo %USERNAME%
Nome do domínio:
echo %USERDOMAIN%
Você pode obter uma lista completa de variáveis de ambiente executando o comando set
no prompt de comando.
Basta usar este comando no prompt de comando
C:\> whoami
whoami
, eu recebo desktop-machine\bballdave025
. Existem duas partes, vistas via: 1) echo %USERNAME%
, resultado bballdave025
; 2) echo %USERDOMAIN%
, resultado DESKTOP-MACHINE
. Acho que se poderia dizer que o 'nome de usuário completo' está disponível via echo %USERDOMAIN%\%USERNAME%
(esse resultado DESKTOP-MACHINE\bballdave025
, corresponde ao de whoami
ignorar maiúsculas e minúsculas) ou mesmo via echo %USERNAME%@%USERDOMAIN%
, resultado bballdave025@DESKTOP-MACHINE
. Tudo depende do que o usuário (para nós, o OP) precisa , ou seja, se a parte do domínio é importante.
Ele deve estar em %USERNAME%
. Obviamente, isso pode ser facilmente falsificado, portanto, não confie nele para segurança.
Dica útil: digite set
um prompt de comando e listará todas as variáveis de ambiente.
A resposta depende de qual idioma do "script de linha de comando" você está.
No velho cmd.exe
prompt de comando ou em um .bat
ou .cmd
script, você pode usar o seguinte:
%USERNAME%
- Obtém apenas o nome de usuário.
%USERDOMAIN%
- Obtém o domínio do usuário.
No comando PowerShell alerta ou um .ps1
ou .psm1
script, você pode usar o seguinte:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- Fornece o nome de usuário completo (por exemplo, Domínio \ Nome de usuário). Esse também é o método mais seguro, pois não pode ser substituído pelo usuário, como as outras $Env
variáveis abaixo.
$Env:Username
- Obtém apenas o nome de usuário.
$Env:UserDomain
- Obtém o domínio do usuário.
$Env:ComputerName
- Obtém o nome do computador.
% USERNAME% fornece o nome de usuário do processo em execução no momento. Dependendo de como você está executando seu arquivo em lotes, este não é necessariamente o mesmo que o nome do usuário atual. Por exemplo, você pode estar executando seu arquivo em lotes através de uma tarefa agendada, de um serviço etc.
Aqui está uma maneira mais segura de obter o nome de usuário do usuário conectado no momento, raspando o nome do usuário que iniciou a tarefa 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
Eu uso esse método para escrever arquivos em lotes para teste.
echo %userdomain%\%username%
Como você deve incluir a senha em texto sem formatação, se a autenticação for necessária, eu a utilizarei apenas em um ambiente completamente privado onde outros usuários não possam visualizá-la ou se um usuário que visualizar a senha não sofrerá consequências.
Espero que isso ajude alguém.
Sempre me incomodou como o Windows não possui alguns utilitários de script mais úteis do Unix, como who / whoami , sed e AWK . De qualquer forma, se você quiser algo infalível, obtenha o Visual Studio Express e compile o seguinte:
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
printf("%s", GetUserName());
}
E apenas use isso no seu arquivo em lotes.
net config Workstation | find "User name"
whoami
está disponível a partir do Windows Vista.
Na maioria dos casos, a variável% USERNAME% será o que você deseja.
echo %USERNAME%
No entanto, se você estiver executando um shell cmd elevado,% USERNAME% relatará o nome do administrador em vez do seu próprio nome de usuário. Se você quiser conhecer o último, execute:
for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u
Esta é a principal diferença entre a variável de nome de usuário e o 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)
Em um contexto padrão, cada usuário conectado mantém um processo explorer.exe: O comando [tasklist / V | find "explorer"] retorna uma linha que contém o proprietário do processo explorer.exe. Com um regex adaptado, é possível obter o requerido valor. Isso também funciona perfeitamente no Windows 7.
Em casos raros, o explorer.exe é substituído por outro programa, o filtro de localização pode ser adaptado para corresponder a esse caso. Se o comando retornar uma linha vazia, é provável que nenhum usuário esteja conectado. No Windows 7, também é possível executar [query session | find ">"].
No que diz respeito à melhor resposta do BlueBearr (enquanto estou executando meu script em lote com, por exemplo, direitos de sistema), tenho que adicionar algo a ele. Como na linha da versão do idioma do Windows (polonês) que deve ser capturada por "%% a %% b" == "Nome do usuário:" fica REALMENTE COMPLICADO (contém alguns caracteres diacríticos no meu idioma), pulo as 7 primeiras linhas e operar no dia 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