Comment obtenir le nom d'utilisateur actuel dans Windows PowerShell?
Comment obtenir le nom d'utilisateur actuel dans Windows PowerShell?
Réponses:
Je l'ai trouvé:
$env:UserName
Il y a aussi:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$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.
(option plus facile / plus courte / mémorable)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktor(option plus fiable)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemann(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 forumLe 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.
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"
[Environment]::UserName
est la meilleure option, car il fonctionne sur plusieurs plates-formes. whoami
semble également fonctionner, mais dépend de la whoami
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 celui Microsoft.PowerShell.Management
qui a la cmdlet. Une idée de ce qui se passe?
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)
$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 \ bob
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 reviendra domain\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é.
[Environment]::UserName
est moins typant, indépendant $env:username
et multiplateforme: Voir pastebin.com/GsfR6Hrp
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.
$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.
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()
UNLEN+1
, et UNLEN
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 \
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
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%".
$(...)
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
.
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}
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
Set-Location Desktop
. ( Get-Location
renvoie simplement l'emplacement actuel, ce qui est implicite pour un Set-Location
avec un chemin relatif.)
$env:username
de récupérer le nom d'utilisateur de la variable d'environnement correspondante.