Comment obtenir le nom d'utilisateur actuel dans Windows PowerShell?

324

Comment obtenir le nom d'utilisateur actuel dans Windows PowerShell?

Thomas Bratt
la source

Réponses:

398

Je l'ai trouvé:

$env:UserName

Il y a aussi:

$env:UserDomain
$env:ComputerName
Thomas Bratt
la source
10
Une alternative rapide et sale serait $env:usernamede récupérer le nom d'utilisateur de la variable d'environnement correspondante.
guillermooo
7
Je pense que $ env: username et [Environment] :: UserName pointent tous deux vers la même chose.
Cephas
16
Merci d'être revenu pour répondre à votre propre question. Rien de plus frustrant quand quelqu'un trouve lui-même la réponse et répond simplement: "Tant pis, j'ai compris!"
Matt DiTrolio
6
@MattDiTrolio C'est certainement frustrant, mais vous pensez qu'il n'y a rien de plus frustrant que ça?!
Code Jockey du
5
@CodeJockey Rien. Pas dans l'histoire de jamais. :)
Matt DiTrolio
181
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
Mark Seemann
la source
16
C'est la réponse la plus sécurisée car elle $env:USERNAMEpeut être modifiée par l'utilisateur, mais cela ne sera pas dupe en faisant cela.
Kevin Panko
6
@KevinPanko Certes, mais au moment où vous ne pouvez pas faire confiance à votre utilisateur, il y a d'autres questions plus philosophiques qui doivent être posées. ;-)
jpaugh
4
Cette méthode inclut le nom de domaine et le nom d'utilisateur. Certainement bénéfique si vous avez plusieurs domaines en jeu.
Ryan Gates
Fonctionne comme prévu. Testé pour la réservation d'adresse URL.
Marek Bar
En outre, cela semble fonctionner également dans PowerShell 6, ce qui signifie qu'il est compatible avec plusieurs plates-formes (.Net Standard). J'ai pensé que cela valait la peine d'être mentionné car je l'ai remis en question lorsque j'ai vu l'espace de noms.
deadlydog
120

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 - @Eoin
  • whoami - @galaktor

Si vous souhaitez accéder au jeton d'accès Windows :

(option plus fiable)

  • [System.Security.Principal.WindowsIdentity]::GetCurrent().Name - @MarkSeemann

Si 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 forum

Comparaison

Le commentaire de @Kevin Panko sur la réponse de @Mark Seemann concerne le choix d'une des catégories par rapport à l'autre:

[L'approche des jetons d'accès Windows] est la réponse la plus sûre, car $ env: USERNAME peut être modifié par l'utilisateur, mais cela ne sera pas dupe en faisant cela.

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:

$cred = Get-Credential UserTo.RunAs
Run-AsUser.ps1 "whoami; pause" $cred
Run-AsUser.ps1 "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name; pause" $cred

Contenu du script Run-AsUser.ps1:

param(
  [Parameter(Mandatory=$true)]
  [string]$script,
  [Parameter(Mandatory=$true)]
  [System.Management.Automation.PsCredential]$cred
)

Start-Process -Credential $cred -FilePath 'powershell.exe' -ArgumentList 'noprofile','-Command',"$script"
alexanderbird
la source
Pour PowerShell 6 sur Mac OS X et Linux, [Environment]::UserNameest la meilleure option, car il fonctionne sur plusieurs plates-formes. whoamisemble également fonctionner, mais dépend de la whoamidisponibilité de l' outil sur la plateforme.
Florian Feldhaus
Pour Powershell 6 sur Windows, $env:USERNAMEproduit à SYSTEMmoins que je n'exécute en tant qu'administrateur, tout en [Environment]::UserName]donnant mon nom d'utilisateur dans les deux cas.
kfsone
1
Il semble que la Get-WmiObjectméthode ne fonctionne plus dans pwsh. Même essayé d'importer le module de compatibilité et celui Microsoft.PowerShell.Managementqui a la cmdlet. Une idée de ce qui se passe?
not2qubit
Correct. Il a été transféré à Get-CimInstance il y a longtemps pour des raisons de performances ... et CIM doit être utilisé sur WMI dans la v6 pour des raisons de compatibilité croisée. Si vous voyez une commande avec GWMI, vérifiez si vous pouvez exécuter GCIM à la place.
Hicsy
105

$env:username est le moyen le plus simple

Eoin
la source
Vous pouvez l'affecter de cette façon et créer des répertoires et autres.
Droogans
51

Je voudrais ajouter la commande whoami , qui est fondamentalement un joli alias pour faire %USERDOMAIN%\%USERNAME%comme proposé dans d'autres réponses.

Write-Host "current user:"
Write-Host $(whoami)
galaktor
la source
cela fonctionne pour moi sur PS version 2. Êtes-vous en train de dire qu'il a été supprimé sur PS3? C: \> powershell Windows PowerShell Copyright (C) 2009 Microsoft Corporation. Tous les droits sont réservés. PS C: \> whoami mydomain \ myusername
galaktor
2
$env:USERNAMEpeut être modifié par l'utilisateur, mais cela ne sera pas dupe en faisant cela.
Kevin Panko
3
whoami gagne pour une utilisation interactive. Il est assez court pour que je me souvienne comment le taper sans consulter SO :-)
Iain Samuel McLean Elder
Pas une chose dans Nano Server. Ne l'utilisez pas dans les scripts, faites ce qu'il faut ( [System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
Yet Another User
whoamiest 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.
jpmc26
37

[Environment]::UserNamerenvoie 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 \ bob

WaffleSouffle
la source
12

J'ai utilisé $env:usernamedans 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\usernameet sur les machines jointes au domaine avec des comptes de domaine, il reviendra domain\username.

Je ne l'utiliserais pas whoami.execar 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é.

Dave Hull
la source
1
Étant donné que l'OP a posé des questions sur Windows-Powershell, cela est valide, mais [Environment]::UserNameest moins typant, indépendant $env:usernameet multiplateforme: Voir pastebin.com/GsfR6Hrp
kfsone
12

Maintenant 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.

Edouard Poor
la source
10

S'appuyant simplement sur le travail des autres ici:

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
Stef
la source
1
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

Le deuxième nom d'utilisateur est uniquement à des fins d'affichage uniquement si vous le copiez et collez.

clayton.nichols
la source
$ fullname = Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username $ username = $ fullname.Replace ("DOMAIN \", "") $ username
clayton.nichols
-1

Je n'ai vu aucun exemple basé sur Add-Type . En voici un qui utilise GetUserName directement depuis advapi32.dll.

$sig = @'
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool GetUserName(System.Text.StringBuilder sb, ref Int32 length);
'@

Add-Type -MemberDefinition $sig -Namespace Advapi32 -Name Util

$size = 64
$str = New-Object System.Text.StringBuilder -ArgumentList $size

[Advapi32.util]::GetUserName($str, [ref]$size) |Out-Null
$str.ToString()
Knuckle-Dragger
la source
1
Veuillez expliquer ce que fait ce code et pourquoi il serait plus utile que l'une des méthodes les plus courtes.
Benjamin Hubbard
@BenjaminHubbard La question ne demande pas la méthode la plus courte, elle demande comment accomplir l'exploit avec PowerShell. Cela fait l'affaire différemment des autres exemples en appelant la fonction à l'intérieur de la DLL et en utilisant la méthode Add-Type pour accéder à .NET.
Knuckle-Dragger
1
Bien qu'il s'agisse d'un nouveau bloc de code, ce serait formidable si je savais ce qu'il faisait. Pouvez-vous l'annoter avec des commentaires, peut-être? Merci!
jpaugh
1
J'ai presque voulu voter, car j'ai vu le mérite de la proposition. Pourtant, le code a quelques défauts: il introduit un nouvel espace de noms, il utilise une constante magique (64) dont la valeur n'est pas celle prescrite par le médecin (devrait être UNLEN+1, et UNLENest 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.
AntoineL
-1

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

Kes tas
la source
Faire des suppositions basées sur le répertoire personnel ne fonctionnera que dans des conditions très spécifiques.
Raúl Salinas-Monteagudo
Si vous travaillez dans un terminal PowerShell et que vous voulez rapidement savoir quel utilisateur vous êtes, alors tapez "ls ~" devrait faire l'affaire. Comme l'affiche ci-dessus, il peut y avoir des exceptions, et ce n'est certainement pas bon pour les scripts, alors utilisez l'exemple d'Edouard Poor dans ce cas.
MrBerta
-2

Si vous êtes habitué au batch, vous pouvez appeler

$user=$(cmd.exe /c echo %username%)

Cela vole essentiellement la sortie de ce que vous obtiendriez si vous aviez un fichier batch avec juste "echo% username%".

Shaws
la source
1
Je vote en aval parce que: a) vous le $(...)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 exemple powershell puts environment variables into $env, so %username% = $env:username.
kfsone
-2
  1. get-content "cm.txt"
  2. write-host "entr file name" $file = read-host get-content $file
  3. $content = get-content "cm.txt"
  4. $content = get-content "cn.txt" for each ($line in $count) {write-host $line}
ammy
la source
$ contents = get-content "cm.txt" ---- $ count = 0 ----- foreach ($ line in $ count) ---- {$ count = $ count + 1} ---- write -host "vous avez ces nombreuses lignes:" $ count
ammy
1. $ a = $ com1, $ com2 ------ host-write "enter cm name" ---- $ c = readhost ----- write-host $ a [$ c-1] .username , write-host $ a [$ c-1] .password
ammy
$ com1 = nouvel objet PSobject ----- $ com1 = $ com1 | add-member noteproperty -name username -value 2016
ammy
1
Y a-t-il une raison pour laquelle vous ajoutez du code en tant que commentaires sur votre propre réponse?
2018
1
pourquoi ne modifiez-vous pas votre réponse et n'ajoutez-vous pas le code au lieu de le diviser en commentaires comme celui-là où personne ne le comprendra?
aldr
-4

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:

$Path = Get-Location

Set-Location $Path\Desktop
kjp
la source
1
Bienvenue dans Stack Overflow ! C'est équivalent à Set-Location Desktop. ( Get-Locationrenvoie simplement l'emplacement actuel, ce qui est implicite pour un Set-Locationavec un chemin relatif.)
jpaugh