Comment trouvez-vous l'utilisateur actuel dans un environnement Windows?

159

Lors de l'exécution d'un script de ligne de commande, est-il possible d'obtenir le nom de l'utilisateur actuel?

Géo
la source
@PeterMortensen, je ne pense pas que le fil soit super lié à celui-ci. L'un concerne l'utilisation de .NET et l'autre l'utilisation de l' API cmd . Outre le fait qu'ils veulent tous les deux la même information, il existe certainement des tonnes d'autres API qui font également la même chose
KyleMit

Réponses:

202

Vous pouvez utiliser la variable username: %USERNAME%

JRL
la source
91

Nom d'utilisateur:

echo %USERNAME%

Nom de domaine:

echo %USERDOMAIN%

Vous pouvez obtenir une liste complète des variables d'environnement en exécutant la commande à setpartir de l'invite de commande.

Magnus Lindhe
la source
Les informations supplémentaires avec toutes les variables d'environnement en font une merveilleuse réponse étendue.
bballdave025
63

Utilisez simplement cette commande dans l'invite de commande

C:\> whoami
Homme libre
la source
C'est une bonne réponse, mais il y a quelques mises en garde. Si j'entre whoami, je reçois desktop-machine\bballdave025. Il y a deux parties, vues via: 1) echo %USERNAME%, résultat bballdave025; 2) echo %USERDOMAIN%, résultat DESKTOP-MACHINE. Je suppose que l'on pourrait dire que le 'nom d'utilisateur complet' est disponible via echo %USERDOMAIN%\%USERNAME%(ce résultat DESKTOP-MACHINE\bballdave025, correspond à celui de whoami, en ignorant la casse), ou même via echo %USERNAME%@%USERDOMAIN%, result bballdave025@DESKTOP-MACHINE. Tout dépend de ce dont l'utilisateur (pour nous, l'OP) a besoin , c'est-à-dire si la partie domaine est importante.
bballdave025
46

Ça devrait être dedans %USERNAME%. Évidemment, cela peut être facilement usurpé, alors ne vous fiez pas à cela pour la sécurité.

Conseil utile: tapez setune invite de commande listera toutes les variables d'environnement.

the_mandrill
la source
2
Votre poste de travail 'net config | Le commentaire find "Nom d'utilisateur" est très utile. Cela aurait dû être une réponse plutôt qu'un simple commentaire
Alpay
17

%USERNAME% est la bonne réponse en batch et autre dans les environnements Windows.

Une autre option consiste à utiliser %USERPROFILE%pour obtenir le chemin de l'utilisateur, comme C:\Users\username.

Reconnaître
la source
6

La réponse dépend du langage de "script de ligne de commande" dans lequel vous vous trouvez.

Cmd

Dans l'ancienne cmd.exeinvite de commande ou dans un script .batou .cmd, vous pouvez utiliser les éléments suivants:

%USERNAME% - Obtient juste le nom d'utilisateur.

%USERDOMAIN% - Obtient le domaine de l'utilisateur.

PowerShell

Dans l'invite de commandes PowerShell ou un script .ps1ou .psm1, vous pouvez utiliser les éléments suivants:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name- Vous donne le nom d'utilisateur complet (par exemple, domaine \ nom d'utilisateur). C'est également la méthode la plus sûre car elle ne peut pas être remplacée par l'utilisateur comme les autres $Envvariables ci-dessous.

$Env:Username - Obtient juste le nom d'utilisateur.

$Env:UserDomain - Obtient le domaine de l'utilisateur.

$Env:ComputerName - Obtient le nom de l'ordinateur.

chien mortel
la source
C'est une excellente réponse car cette question dépend du «shell». Il existe de nombreux shells que vous pouvez utiliser avec Windows. Pas seulement CMD. Ces jours-ci, la plupart des gens sont passés à PowerShell et il y en a d'autres. stackoverflow.com/questions/17349022/…
G_Style
5

% USERNAME% vous obtiendra le nom d'utilisateur du processus en cours d'exécution. Selon la façon dont vous exécutez votre fichier de commandes, ce n'est pas nécessairement le même que le nom de l'utilisateur actuel. Par exemple, vous pouvez exécuter votre fichier de commandes via une tâche planifiée, à partir d'un service, etc.

Voici un moyen plus sûr d'obtenir le nom d'utilisateur de l'utilisateur actuellement connecté en grattant le nom de l'utilisateur qui a lancé la tâche 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
la source
4

J'utilise cette méthode pour écrire des fichiers batch pour les tests.

echo %userdomain%\%username%

Puisque vous devez inclure le mot de passe en texte brut si une authentification est requise, je ne l'utiliserai que dans un environnement complètement privé où les autres utilisateurs ne peuvent pas le voir ou si un utilisateur voyant le mot de passe n'aurait aucune conséquence.

J'espère que cela aide quelqu'un.

Chad Harrington Mitchell
la source
4

Je suis toujours ennuyé de voir que Windows n'a pas certains des petits utilitaires de script plus utiles d'Unix, tels que who / whoami , sed et AWK . Quoi qu'il en soit, si vous voulez quelque chose d'infaillible, obtenez Visual Studio Express et compilez ce qui suit:

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

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

Et utilisez simplement cela dans votre fichier de commandes.

Chris K
la source
Ouais, ça aurait été bien d'avoir un intégré.
Geo
8
Je suis d'accord que sed & awk serait utile, mais cela vous amène à 50% du chemin: net config Workstation | find "User name"
the_mandrill
9
whoamiest disponible à partir de Windows Vista.
Joey
2
Certes, l'utilitaire whoami est inclus avec Vista. Pour XP, c'est dans les outils de support SP2 et pour W2K, c'est dans la boîte à outils de ressources.
RealHowTo
4

Dans la plupart des cas, la variable% USERNAME% sera ce que vous voulez.

echo %USERNAME%

Cependant, si vous exécutez un shell cmd élevé,% USERNAME% indiquera le nom de l'administrateur au lieu de votre propre nom d'utilisateur. Si vous voulez connaître ce dernier, lancez:

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

C'est la principale différence entre la variable username et la commande 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)
intégrateurIT
la source
0

Dans un contexte standard, chaque utilisateur connecté détient un processus explorer.exe: La commande [tasklist / V | find "explorer"] retourne une ligne qui contient le propriétaire du processus explorer.exe, avec une regex adaptée il est possible d'obtenir les valeur. Cela fonctionne également parfaitement sous Windows 7.

Dans de rares cas, explorer.exe est remplacé par un autre programme, le filtre de recherche peut être adapté pour correspondre à ce cas. Si la commande renvoie une ligne vide, il est probable qu'aucun utilisateur ne soit connecté. Avec Windows 7, il est également possible d'exécuter [session de requête | trouver ">"].

Armand Poulenard
la source
0

Pour ce qui est de trouver la meilleure réponse de BlueBearr (pendant que j'exécute mon script batch avec par exemple les droits SYSTEM), je dois y ajouter quelque chose. Parce que dans ma version linguistique Windows (polonais), la ligne qui doit être interceptée par "%% a %% b" == "Nom d'utilisateur:" devient VRAIMENT COMPLIQUE (elle contient des caractères diacritiques dans ma langue), je saute les 7 premières lignes et opérer le 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
la source