Hoe krijg ik de huidige gebruikersnaam in Windows PowerShell?

Hoe krijg ik de huidige gebruikersnaam in Windows PowerShell?


Antwoord 1, autoriteit 100%

Ik heb het gevonden:

$env:UserName

Er is ook:

$env:UserDomain
$env:ComputerName

Antwoord 2, autoriteit 45%

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

Antwoord 3, autoriteit 33%

Ik dacht dat het waardevol zou zijn om de gegeven antwoorden samen te vatten en te vergelijken.

Als je toegang wilt tot de omgevingsvariabele:

(gemakkelijkere/kortere/onthoudbare optie)

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

Als u toegang wilt tot de Windows-toegangstoken:

(betrouwbarere optie)

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

Als je de naam van de ingelogde gebruiker wilt

(in plaats van de naam van de gebruiker die de PowerShell-instantie uitvoert)

  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username— @TwonOfAn op dit andere forum

Vergelijking

@Kevin Panko’s commentaar op het antwoord van @Mark Seemann gaat over het kiezen van een van de categorieën boven de andere:

[De Windows-toegangstokenbenadering] is het veiligste antwoord, omdat $env:USERNAME door de gebruiker kan worden gewijzigd, maar dit laat zich niet misleiden door dat te doen.

Kortom, de optie voor omgevingsvariabelen is beknopter en de optie voor Windows-toegangstoken is betrouwbaarder.

Ik heb de Windows-toegangstokenbenadering van @Mark Seemann moeten gebruiken in een PowerShell-script dat ik uitvoerde vanuit een C#-toepassing met imitatie.

De C#-toepassing wordt uitgevoerd met mijn gebruikersaccount en voert het PowerShell-script uit als een serviceaccount. Vanwege een beperking van de manier waarop ik het PowerShell-script vanuit C# uitvoer, gebruikt de PowerShell-instantie de omgevingsvariabelen van mijn gebruikersaccount, ook al wordt deze uitgevoerd als de serviceaccountgebruiker.

In deze configuratie retourneren de omgevingsvariabele-opties mijn accountnaam, en de Windows-toegangstokenoptie retourneert de serviceaccountnaam (wat ik wilde), en de ingelogde gebruikersoptie retourneert mijn accountnaam.


Testen

Als je de opties zelf wilt vergelijken, is hier een script dat je kunt gebruiken om een script als een andere gebruiker uit te voeren. U moet de cmdlet Get-Credential gebruiken om een referentieobject op te halen en vervolgens dit script uitvoeren met het script om als een andere gebruiker als argument 1 uit te voeren en het referentieobject als argument 2.

Gebruik:

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

Inhoud van het 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"

Antwoord 4, Autoriteit 23%

$env:usernameis de eenvoudigste manier


Antwoord 5, Autoriteit 11%

Ik wil graag de whami commando gooien, die in principe een leuke alias is voor het doen van %USERDOMAIN%\%USERNAME%zoals voorgesteld in andere antwoorden.

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

Antwoord 6, Autoriteit 8%

[Environment]::UserNameRetourneert alleen de gebruikersnaam. B.v. Bob
[System.Security.Principal.WindowsIdentity]::GetCurrent().NameRETURNT DE GEBRUIKERSNAAM, INWEGGELIJKE GEBRUIKTE NAAMHEID, PREFEGEED DOOR HAAR DIENTELIJK. B.v. Smitchenice \ Bob


Antwoord 7, Autoriteit 4%

Nu dat Powershell Core (aka v6) is vrijgegeven en mensen Mogelijk wil je cross-platform-scripts schrijven, veel van de antwoorden hier zullen niet anders werken, anders dan Windows.

[Environment]::UserNamelijkt de beste manier te zijn om de huidige gebruikersnaam te krijgen op alle platforms die door PowerShell Core worden ondersteund als u geen platformdetectie en speciale behuizing aan uw code wilt toevoegen .


Antwoord 8, Autoriteit 4%

Ik heb $env:usernamein het verleden gebruikt, maar een collega wees erop dat het een omgeving variabele is en kan door de gebruiker worden gewijzigd en daarom, als u echt de gebruikersnaam van de huidige gebruiker wilt ontvangen , je zou het niet moeten vertrouwen.

Ik zou het antwoord van Mark Seemann upveren:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name

Maar dat mag ik niet. Met het antwoord van Mark, als je alleen de gebruikersnaam nodig hebt, moet je deze misschien ontleden, omdat het op mijn systeem hostname\usernameretourneert en op domein-gekoppelde machines met domeinaccounts het domain\username.

Ik zou whoami.exeniet gebruiken omdat het niet in alle versies van Windows aanwezig is, en het is een oproep naar een ander binair bestand en kan sommige beveiligingsteams aanvallen.


Antwoord 9, autoriteit 2%

Gewoon voortbouwen op het werk van anderen hier:

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

Antwoord 10

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

$username

De tweedegebruikersnaamis alleen voor weergavedoeleinden als u deze kopieert en plakt.


Antwoord 11

Ik heb geen Toevoegen -Typgebaseerde voorbeelden. Hier is er een die de GetUserName rechtstreeks van advapi32.dll gebruikt.

$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()

Antwoord 12

Als je gewend bent aan batches, kun je bellen

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

Dit steelt in feite de uitvoer van wat je zou krijgen als je een batchbestand had met alleen “echo %username%”.


Antwoord 13

Ik vind het gemakkelijkst te gebruiken: cd $home\Desktop\

gaat u naar de huidige gebruikersdesktop

In mijn geval moest ik de gebruikersnaam ophalen om het script in staat te stellen het pad te wijzigen, dwz. c:\gebruikers\%gebruikersnaam%. Ik moest het script starten door het pad naar het bureaublad van de gebruiker te wijzigen. Ik heb dit kunnen doen, met hulp van bovenaf en elders, door de get-location-applet te gebruiken.

Misschien heb je een andere, of zelfs betere manier om het te doen, maar dit werkte voor mij:

$Path = Get-Location

Set-Location $Path\Desktop


Antwoord 14

In mijn geval moest ik de gebruikersnaam ophalen om het script in staat te stellen het pad te wijzigen, dwz. c:\users\%username%\. Ik moest het script starten door het pad naar het bureaublad van de gebruiker te wijzigen. Ik heb dit kunnen doen, met hulp van bovenaf en elders, door de get-location-applet te gebruiken.

Misschien heb je een andere, of zelfs betere manier om het te doen, maar dit werkte voor mij:

$Path = Get-Location
Set-Location $Path\Desktop

Other episodes