web-dev-qa-db-fra.com

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

Lors de l'exécution d'un script de ligne de commande, est-il possible d'obtenir le nom de l'utilisateur actuel? Le système d'exploitation est Windows XP.

135
Geo

Vous pouvez utiliser la variable de nom d'utilisateur: %USERNAME%

177
JRL

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 set à partir de la commande Invite.

76
Magnus Lindhe

Il suffit d'utiliser cette commande dans l'invite de commande

C:\> whoami
51
Freeman

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

Conseil utile: tapez set dans une commande L'invite répertorie toutes les variables d'environnement.

44
the_mandrill

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

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

14
Recon

Cela ne m'a toujours pas gêné que Windows ne dispose pas de certains utilitaires de script Unix plus utiles, tels que who / whoami , sed et AWK . Quoi qu'il en soit, si vous voulez quelque chose de sûr, procurez-vous 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-le dans votre fichier de commandes.

4
Chris K

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

Voici un moyen plus sûr d'obtenir le nom d'utilisateur de l'utilisateur actuellement connecté en récupérant 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
3
BlueBearr

J'utilise cette méthode pour écrire des fichiers de commandes à des fins de test. 

echo %userdomain%\%username%

Étant donné que vous devez inclure le mot de passe en texte brut si une authentification est requise, je ne l'utiliserai que dans un environnement totalement privé où les autres utilisateurs ne peuvent pas le voir ou si un utilisateur qui voit le mot de passe n'entraîne aucune conséquence. 

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

Dans la plupart des cas, la variable% USERNAME% sera celle que vous souhaitez.

echo %USERNAME%

Toutefois, 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

Dans un contexte standard, chaque utilisateur connecté détient un processus Explorer.exe: La commande [liste des tâches/V | find "Explorer"] renvoie une ligne contenant le propriétaire du processus Explorer.exe, avec une expression rationnelle adaptée, il est possible d'obtenir les informations requises. valeur. Cela fonctionne aussi 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 [query session | find ">"].

0
Armand Poulenard

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

Cmd

Dans l'ancienne invite cmd.exe de la commande ou dans un script .bat ou .cmd, vous pouvez utiliser les éléments suivants:

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

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

PowerShell

Dans la commande Invite de la commande PowerShell ou dans un script .ps1 ou .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écurisée car elle ne peut pas être remplacée par l'utilisateur comme les autres variables $Env ci-dessous.

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

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

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

0
deadlydog

Dans la mesure où la réponse BlueBearr est la meilleure (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 de langue Windows (polonais), la ligne qui doit être interceptée par "%% a %% b" == "Nom d'utilisateur:" devient VRAIMENT COMPLIQUÉE (elle contient des caractères diacritiques dans ma langue). 7 lignes et opère 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
0
ITMarka