Comment obtenir le nom d'utilisateur actuel dans Windows Powershell?
Comment obtenir le nom d'utilisateur actuel dans Windows Powershell?
12 réponses
Trouvé:
$env:UserName
Il y a aussi:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
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"
[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
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é.
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é.
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.
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()
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%".
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