Wie erhalte ich den aktuellen Benutzernamen in Windows PowerShell?
Ich habe es gefunden:
$env:UserName
Es gibt auch:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:username
ist der einfachste Weg
Ich dachte, es wäre wertvoll, die gegebenen Antworten zusammenzufassen und zu vergleichen.
(einfachere/kürzere/einprägsame Option)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktor(zuverlässigere Option)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemann(anstelle des Namens des Benutzers, der die PowerShell-Instanz ausführt)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn on this other forumBei @Kevin Pankos Kommentar zu @Mark Seemanns Antwort geht es darum, eine der Kategorien der anderen vorzuziehen:
[Der Windows-Zugriffstoken-Ansatz] ist die sicherste Antwort, da $ env: USERNAME vom Benutzer geändert werden kann, dies wird jedoch dadurch nicht getäuscht.
Kurz gesagt, ist die Umgebungsvariablenoption prägnanter und die Windows-Zugriffstokenoption zuverlässiger.
Ich musste den Windows-Zugriffstoken-Ansatz von @Mark Seemann in einem PowerShell-Skript verwenden, das ich in einer C # -Anwendung mit Identitätswechsel ausgeführt habe.
Die C # -Anwendung wird mit meinem Benutzerkonto ausgeführt und das PowerShell-Skript wird als Dienstkonto ausgeführt. Aufgrund einer Einschränkung der Ausführung des PowerShell-Skripts in C # verwendet die PowerShell-Instanz die Umgebungsvariablen meines Benutzerkontos, obwohl sie als Benutzer des Dienstkontos ausgeführt wird.
In diesem Setup geben die Umgebungsvariablenoptionen meinen Kontonamen zurück, und die Windows-Zugriffstokenoption gibt den Dienstkontonamen zurück (was ich wollte), und die Option für angemeldete Benutzer gibt meinen Kontonamen zurück.
Wenn Sie die Optionen selbst vergleichen möchten, finden Sie hier ein Skript, mit dem Sie ein Skript als anderer Benutzer ausführen können. Sie müssen das Cmdlet Get-Credential verwenden, um ein Berechtigungsnachweisobjekt abzurufen, und dann dieses Skript ausführen, wobei das Skript als ein anderer Benutzer als Argument 1 und das Berechtigungsnachweisobjekt als Argument 2 ausgeführt wird.
Verwendung:
$cred = Get-Credential UserTo.RunAs
Run-AsUser.ps1 "whoami; pause" $cred
Run-AsUser.ps1 "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name; pause" $cred
Inhalt des Skripts "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"
Ich möchte den Befehl whoami einfügen, der im Grunde genommen ein Nizza-Alias für das Ausführen von %USERDOMAIN%\%USERNAME%
ist, wie in anderen Antworten vorgeschlagen.
Write-Host "current user:"
Write-Host $(whoami)
[Environment]::UserName
gibt nur den Benutzernamen zurück. Z.B. bob[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
gibt den Benutzernamen zurück, gegebenenfalls mit dem Präfix seiner Domäne. Z.B. SOMEWHERENICE\bob
Ich habe $env:username
in der Vergangenheit verwendet, aber ein Kollege hat darauf hingewiesen, dass es sich um eine Umgebungsvariable handelt, die vom Benutzer geändert werden kann. Wenn Sie also den Benutzernamen des aktuellen Benutzers wirklich erhalten möchten, sollten Sie ihm nicht vertrauen.
Ich würde die Antwort von Mark Seemann positiv bewerten: [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Name
Aber das darf ich nicht. Wenn Sie nur den Benutzernamen benötigen, müssen Sie ihn möglicherweise mit Marks Antwort analysieren, da er auf meinem System hostname\username
zurückgibt und auf Computern mit Domänenbeitritt mit Domänenkonten domain\username
zurückgibt.
Ich würde whoami.exe
nicht verwenden, da es nicht in allen Windows-Versionen vorhanden ist und ein Aufruf an eine andere Binärdatei ist und möglicherweise einige Sicherheitsteams fit macht.
Bauen Sie hier einfach auf die Arbeit anderer:
[String] ${stUserDomain},[String] ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
Nachdem PowerShell Core (aka v6) veröffentlicht wurde und Benutzer möglicherweise plattformübergreifende Skripts schreiben möchten, funktionieren viele der hier aufgeführten Antworten nur unter Windows.
[Environment]::UserName
ist anscheinend die beste Methode, um den aktuellen Benutzernamen auf allen von PowerShell Core unterstützten Plattformen abzurufen, wenn Sie Ihrem Code keine Plattformerkennung und keine spezielle Schreibweise hinzufügen möchten.
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
Das zweiteBenutzername dient nur zur Anzeige, wenn Sie es kopieren und einfügen.