Comment obtenir le nom d'utilisateur actuel dans Windows PowerShell?
windows
powershell
scripting
Thomas Bratt
la source
la source
$env:username
de récupérer le nom d'utilisateur de la variable d'environnement correspondante.la source
$env:USERNAME
peut être modifiée par l'utilisateur, mais cela ne sera pas dupe en faisant cela.J'ai pensé qu'il serait utile de résumer et de comparer les réponses données.
Si vous souhaitez accéder à la variable d'environnement :
(option plus facile / plus courte / mémorable)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktorSi vous souhaitez accéder au jeton d'accès Windows :
(option plus fiable)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemannSi vous voulez le nom de l'utilisateur connecté
(plutôt que le nom de l'utilisateur exécutant l'instance PowerShell)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn sur cet autre forumComparaison
Le commentaire de @Kevin Panko sur la réponse de @Mark Seemann concerne le choix d'une des catégories par rapport à l'autre:
En bref, l'option de variable d'environnement est plus succincte et l'option de jeton d'accès Windows est plus fiable.
J'ai dû utiliser l'approche des jetons d'accès Windows de @Mark Seemann dans un script PowerShell que j'exécutais à partir d'une application C # avec emprunt d'identité.
L'application C # est exécutée avec mon compte d'utilisateur et exécute le script PowerShell en tant que compte de service. En raison d'une limitation de la façon dont j'exécute le script PowerShell à partir de C #, l'instance PowerShell utilise les variables d'environnement de mon compte d'utilisateur, même si elle est exécutée en tant qu'utilisateur du compte de service.
Dans cette configuration, les options de variable d'environnement renvoient mon nom de compte, et l'option de jeton d'accès Windows renvoie le nom du compte de service (ce que je voulais), et l'option utilisateur connecté renvoie mon nom de compte.
Essai
De plus, si vous souhaitez comparer les options vous-même, voici un script que vous pouvez utiliser pour exécuter un script en tant qu’autre utilisateur. Vous devez utiliser l'applet de commande Get-Credential pour obtenir un objet d'informations d'identification, puis exécuter ce script avec le script à exécuter en tant qu'autre utilisateur en tant qu'argument 1 et l'objet d'informations d'identification en tant qu'argument 2.
Usage:
Contenu du script Run-AsUser.ps1:
la source
[Environment]::UserName
est la meilleure option, car il fonctionne sur plusieurs plates-formes.whoami
semble également fonctionner, mais dépend de lawhoami
disponibilité de l' outil sur la plateforme.$env:USERNAME
produit àSYSTEM
moins que je n'exécute en tant qu'administrateur, tout en[Environment]::UserName]
donnant mon nom d'utilisateur dans les deux cas.Get-WmiObject
méthode ne fonctionne plus dans pwsh. Même essayé d'importer le module de compatibilité et celuiMicrosoft.PowerShell.Management
qui a la cmdlet. Une idée de ce qui se passe?$env:username
est le moyen le plus simplela source
Je voudrais ajouter la commande whoami , qui est fondamentalement un joli alias pour faire
%USERDOMAIN%\%USERNAME%
comme proposé dans d'autres réponses.la source
$env:USERNAME
peut être modifié par l'utilisateur, mais cela ne sera pas dupe en faisant cela.[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)whoami
est un exécutable. Il ne peut pas être supprimé de PowerShell. Il pourrait potentiellement être supprimé de Windows, mais il est toujours là à partir de non-Nano Windows Server 2012.[Environment]::UserName
renvoie uniquement le nom d'utilisateur. Par exemple, bob[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
renvoie le nom d'utilisateur, préfixé par son domaine, le cas échéant. Par exemple SOMEWHERENICE \ bobla source
J'ai utilisé
$env:username
dans le passé, mais un collègue a souligné qu'il s'agit d'une variable d'environnement et qu'elle peut être modifiée par l'utilisateur.Par conséquent, si vous voulez vraiment obtenir le nom d'utilisateur de l'utilisateur actuel, vous ne devriez pas lui faire confiance.Je voterais pour la réponse de Mark Seemann: [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Name
Mais je n'y suis pas autorisé. Avec la réponse de Mark, si vous avez juste besoin du nom d'utilisateur, vous devrez peut-être l'analyser car sur mon système, il revient
hostname\username
et sur les machines jointes au domaine avec des comptes de domaine, il reviendradomain\username
.Je ne l'utiliserais pas
whoami.exe
car il n'est pas présent sur toutes les versions de Windows, et c'est un appel à un autre binaire et peut convenir à certaines équipes de sécurité.la source
[Environment]::UserName
est moins typant, indépendant$env:username
et multiplateforme: Voir pastebin.com/GsfR6HrpMaintenant que PowerShell Core (alias v6) est sorti, et que les gens voudront peut-être écrire des scripts multiplateformes, de nombreuses réponses ici ne fonctionneront pas sur autre chose que Windows.
[Environment]::UserName
semble être le meilleur moyen d'obtenir le nom d'utilisateur actuel sur toutes les plates-formes prises en charge par PowerShell Core si vous ne souhaitez pas ajouter la détection de plate-forme et un boîtier spécial à votre code.la source
S'appuyant simplement sur le travail des autres ici:
la source
$username
Le deuxième nom d'utilisateur est uniquement à des fins d'affichage uniquement si vous le copiez et collez.
la source
Je n'ai vu aucun exemple basé sur Add-Type . En voici un qui utilise GetUserName directement depuis advapi32.dll.
la source
UNLEN+1
, etUNLEN
est 256), il ignore toute erreur qui pourrait être renvoyée par GetUserName (via il conserve GetLastError, un bon point), il ne nettoie pas le tampon de chaîne; et probablement quelques autres. Et comme d'autres l'ont dit, les commentaires manquent cruellement aussi.Je trouve le plus simple à utiliser: cd $ home \ Desktop \
vous amènera au bureau de l'utilisateur actuel
Dans mon cas, j'avais besoin de récupérer le nom d'utilisateur pour permettre au script de changer le chemin, c'est-à-dire. c: \ users \% username%. J'avais besoin de démarrer le script en changeant le chemin vers le bureau des utilisateurs. J'ai pu le faire, avec l'aide d'en haut et d'ailleurs, en utilisant l'applet get-location.
Vous pouvez avoir une autre, ou même une meilleure façon de le faire, mais cela a fonctionné pour moi:
$ Path = Get-Location
Set-Location $ Path \ Desktop
la source
Si vous êtes habitué au batch, vous pouvez appeler
Cela vole essentiellement la sortie de ce que vous obtiendriez si vous aviez un fichier batch avec juste "echo% username%".
la source
$(...)
est superflu:$a = cmd.exe /c echo %username%
fonctionne, b) ce n'est pas portable, c) il ne répond pas réellement à la question de savoir comment le faire en PowerShell, il répond à la façon de le faire en dos, et c'est mieux donner à un homme une canne à pêche que lui donner un poisson, par exemplepowershell puts environment variables into $env, so %username% = $env:username
.get-content "cm.txt"
write-host "entr file name" $file = read-host get-content $file
$content = get-content "cm.txt"
$content = get-content "cn.txt" for each ($line in $count) {write-host $line}
la source
Dans mon cas, j'avais besoin de récupérer le nom d'utilisateur pour permettre au script de changer le chemin, c'est-à-dire.
c:\users\%username%\
. J'avais besoin de démarrer le script en changeant le chemin vers le bureau des utilisateurs. J'ai pu le faire, avec l'aide d'en haut et d'ailleurs, en utilisant le applet get-location .Vous pouvez avoir une autre, ou même une meilleure façon de le faire, mais cela a fonctionné pour moi:
la source
Set-Location Desktop
. (Get-Location
renvoie simplement l'emplacement actuel, ce qui est implicite pour unSet-Location
avec un chemin relatif.)