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

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

225
demandé sur Thomas Bratt 2010-01-18 14:50:32

12 réponses

Trouvé:

$env:UserName

Il y a aussi:

$env:UserDomain
$env:ComputerName
282
répondu Thomas Bratt 2017-01-21 02:40:44
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
132
répondu Mark Seemann 2010-01-18 11:54:21

$env:username est le moyen le plus facile

98
répondu Eoin 2011-11-25 07:52:51

J'ai pensé qu'il serait utile de résumer et de comparer les réponses données.

Si vous souhaitez accéder à l'la variable d'environnement:

(plus facile/plus courte/mémorable option)

  • [Environment]::UserName -- @ ThomasBratt
  • $env:username -- @ Eoin
  • whoami -- @ galaktor

Si vous souhaitez accéder à l'jeton d'accès windows:

(de plus fiable option)

  • [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 traite du choix de l'une des catégories par rapport à l'autre:

[l'approche du jeton d'accès windows] est la réponse la plus sécurisée 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 de jeton d'accès windows de @ Mark Seemann dans un script PowerShell que j'exécutais à partir d'une application C# avec usurpation d'identité. L'application C# est exécutée avec mon compte 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 la 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 le nom de mon compte.


Test

Aussi, si vous voulez 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 credential, puis exécuter ce script avec le script à exécuter en tant qu'autre utilisateur en tant qu'argument 1, et l'objet credential en tant qu'argument 2.

Utilisation:

$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"
73
répondu alexanderbird 2017-10-25 20:01:21

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

Write-Host "current user:"
Write-Host $(whoami)
45
répondu galaktor 2011-11-14 09:08:35

[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 \ bob

32
répondu WaffleSouffle 2011-07-14 12:19:30

J'ai utilisé $env:username dans le passé, mais un collègue l'a souligné, c'est une variable d'environnement et peut être modifiée par l'utilisateur et donc, si vous voulez vraiment obtenir le nom d'utilisateur de l'utilisateur actuel, vous ne devriez pas lui faire confiance.

J'upvote la réponse de Mark Seemann:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name

, Mais je ne suis pas autorisé à le faire. 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 renvoie hostname\username et sur les machines jointes au domaine avec des comptes de domaine sera de retour de domaine\nom d'utilisateur.

Je n'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 donner des ajustements à certaines équipes de sécurité.

6
répondu Dave Hull 2017-01-24 17:21:08

Juste en s'appuyant sur le travail des autres ici:

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")

Et merci pour l'info car j'aime obtenir les données simplement et à partir d'une source faisant autorité.

4
répondu Stef 2016-08-04 17:00:46

Maintenant que Powershell Core (aka v6) a été publié, et que les gens peuvent vouloir écrire des scripts multiplateformes, beaucoup de 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 voulez pas ajouter de détection de plate-forme et de boîtier spécial à votre code.

2
répondu Edouard Poor 2018-03-15 20:37:59

Je n'ai vu aucun exemple basé sur add-type, En voici un utilisant le GetUserName directement à partir d'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()
-1
répondu Knuckle-Dragger 2014-08-03 20:09:19

Si vous êtes habitué au lot, 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%".

-1
répondu shaws 2017-07-06 21:37:03

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'appletget-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
-3
répondu kjp 2015-12-30 17:57:55