web-dev-qa-db-fra.com

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

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

275
Thomas Bratt

Je l'ai trouvé:

$env:UserName

Il y a aussi:

$env:UserDomain
$env:ComputerName
346
Thomas Bratt
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
159
Mark Seemann

$env:username est le moyen le plus simple

103
Eoin

J'ai pensé qu'il serait intéressant de résumer et de comparer les réponses fournies.

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 à 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 on cet autre forum

Comparaison

Le commentaire de @Kevin Panko sur la réponse de @Mark Seemann consiste à choisir l'une des catégories plutôt que l'autre:

[L’approche par 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 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 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 manière dont j'exécute le script PowerShell à partir de C #, l'instance de 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 de l'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'utilisateur différent. Vous devez utiliser la cmdlet 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.

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"
102
alexanderbird

J'aimerais ajouter la commande whoami , qui est fondamentalement un alias de Nice pour faire %USERDOMAIN%\%USERNAME% comme proposé dans d'autres réponses.

Write-Host "current user:"
Write-Host $(whoami)
49
galaktor

[Environment]::UserName ne renvoie que 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

34
WaffleSouffle

J'ai déjà utilisé $env:username, mais un collègue a souligné qu'il s'agissait d'une variable d'environnement pouvant être modifiée par l'utilisateur. Par conséquent, si vous voulez vraiment obtenir le nom d'utilisateur de l'utilisateur actuel, vous ne devez pas lui faire confiance.

Je préviens la réponse de Mark Seemann: [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Name

Mais je ne suis pas autorisé à. Avec la réponse de Mark, si vous n'avez besoin que du nom d'utilisateur, vous devrez peut-être l'analyser car sur mon système, il retourne hostname\username et sur les machines jointes à un domaine avec des comptes de domaine, il retournera domain\username.

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 qui risque de plaire à certaines équipes de sécurité.

10
Dave Hull

Construire simplement sur le travail des autres ici:

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

Maintenant que PowerShell Core (aka v6) a été publié et que les utilisateurs peuvent vouloir écrire des scripts multiplates-formes, bon nombre des réponses fournies ici ne fonctionneront que sur 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 de détection de plate-forme et de casse spéciale à votre code.

6
Edouard Poor
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

Le secondnom d'utilisateur sert uniquement à l'affichage, si vous le copiez et le collez.

0
clayton.nichols