Como você encontra o usuário atual em um ambiente Windows?

159

Ao executar um script de linha de comando, é possível obter o nome do usuário atual?

Geo
fonte
Relacionado (do .NET): Como obtenho o nome de usuário atual no .NET usando C #?
Peter Mortensen
@ PeterMortensen, eu não acho que esse tópico esteja super relacionado a esse. Um é sobre o uso do .NET e o outro é sobre o uso da API do cmd . Além do fato de os dois quererem as mesmas informações, certamente existem muitas outras APIs que também fazem uma coisa semelhante
KyleMit

Respostas:

202

Você pode usar a variável username: %USERNAME%

JRL
fonte
90

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 setno prompt de comando.

Magnus Lindhe
fonte
As informações extras com todas as variáveis ​​de ambiente fazem desta uma maravilhosa resposta estendida.
bballdave025
63

Basta usar este comando no prompt de comando

C:\> whoami
Freeman
fonte
Esta é uma boa resposta, mas existem algumas ressalvas. Se eu entrar 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 whoamiignorar 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.
bballdave025
46

Ele deve estar em %USERNAME%. Obviamente, isso pode ser facilmente falsificado, portanto, não confie nele para segurança.

Dica útil: digite setum prompt de comando e listará todas as variáveis ​​de ambiente.

the_mandrill
fonte
2
Sua 'net config Workstation | O comentário "localizar nome de usuário" é muito útil. Deveria ter sido uma resposta ao invés de apenas um comentário
Alpay
17

%USERNAME% é a resposta correta em lote e outra em ambientes Windows.

Outra opção é usar %USERPROFILE%para obter o caminho do usuário, como C:\Users\username.

Recon
fonte
6

A resposta depende de qual idioma do "script de linha de comando" você está.

Cmd

No velho cmd.exeprompt de comando ou em um .batou .cmdscript, você pode usar o seguinte:

%USERNAME% - Obtém apenas o nome de usuário.

%USERDOMAIN% - Obtém o domínio do usuário.

PowerShell

No comando PowerShell alerta ou um .ps1ou .psm1script, 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 $Envvariá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.

cão mortal
fonte
Esta é uma ótima resposta, pois esta pergunta depende do 'shell'. Existem muitos shells que você pode usar com o Windows. Não apenas CMD. Hoje em dia, a maioria das pessoas mudou para o PowerShell e há outros por aí. stackoverflow.com/questions/17349022/…
G_Style
5

% 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
BlueBearr
fonte
4

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.

Chad Harrington Mitchell
fonte
4

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.

Chris K
fonte
Sim, teria sido bom ter um built-in.
Geo
8
Concordo que o sed & awk seria útil, mas isso leva você a 50% do caminho: net config Workstation | find "User name"
the_mandrill
9
whoamiestá disponível a partir do Windows Vista.
22410 Joey
2
É verdade que o utilitário whoami está incluído no Vista. Para o XP, ele está nas ferramentas de suporte do SP2 e, no W2K, no kit de ferramentas de recursos.
RealHowTo 22/10/09
4

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
Jean-François Larvoire
fonte
1

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)
integratorIT
fonte
0

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 ">"].

Armand Poulenard
fonte
0

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
ITMarka
fonte