512 Stimmen

Wie kann ich den aktuellen Benutzernamen in Windows PowerShell abrufen?

Wie kann ich den aktuellen Benutzernamen in Windows PowerShell abrufen?

597voto

Thomas Bratt Punkte 43640

Ich habe es gefunden:

$env:UserName

Außerdem gibt es:

$env:UserDomain
$env:ComputerName

0 Stimmen

Die Antwort ist die Verwendung einer statischen .NET-Methode aus der Powershell heraus, die auch an anderer Stelle nützlich sein kann.

1 Stimmen

Nicht aktuell angemeldete Benutzer, sondern einfach Umgebungsvariablen! Beantworten Sie die Frage nicht.

289voto

Mark Seemann Punkte 216836

Unter Windows können Sie das:

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

32 Stimmen

Dies ist die sicherste Antwort, weil $env:USERNAME kann vom Benutzer geändert werden, aber das wird nicht durch eine solche Änderung getäuscht.

12 Stimmen

@KevinPanko Stimmt, aber an dem Punkt, an dem man seinem Nutzer nicht mehr trauen kann, müssen andere, philosophischere Fragen gestellt werden ;-)

10 Stimmen

Diese Methode enthält den Domänennamen und den Benutzernamen. Besonders vorteilhaft, wenn Sie mehrere Domains im Einsatz haben.

213voto

alexanderbird Punkte 3655

Ich dachte, es wäre nützlich, die gegebenen Antworten zusammenzufassen und zu vergleichen.

Wenn Sie auf die Umgebungsvariable :

(einfachere/kürzere/erinnerungswürdige Option)

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

Wenn Sie auf die Windows-Zugangs-Token :

(verlässlichere Option)

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

Wenn Sie den Namen des angemeldeten Benutzers wissen wollen

(und nicht den Namen des Benutzers, der die PowerShell-Instanz ausführt)

  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username -- @TwonOfAn on dieses andere Forum

Vergleich

In dem Kommentar von @Kevin Panko zur Antwort von @Mark Seemann geht es darum, eine der Kategorien der anderen vorzuziehen:

[Der Ansatz mit dem Windows-Zugriffstoken ist die sicherste Lösung, da $env:USERNAME vom Benutzer geändert werden kann, was aber nicht zu einer Täuschung führt.

Kurz gesagt, die Option "Umgebungsvariable" ist prägnanter, und die Option "Windows-Zugriffstoken" ist zuverlässiger.

Ich musste den Windows-Zugriffstoken-Ansatz von @Mark Seemann in einem PowerShell-Skript verwenden, das ich aus einer C#-Anwendung mit Impersonation ausgeführt habe.

Die C#-Anwendung wird unter meinem Benutzerkonto ausgeführt, und das PowerShell-Skript wird unter einem Dienstkonto ausgeführt. Aufgrund einer Einschränkung der Art und Weise, wie ich das PowerShell-Skript von C# aus ausführe, verwendet die PowerShell-Instanz die Umgebungsvariablen meines Benutzerkontos, obwohl sie als Benutzer des Dienstkontos ausgeführt wird.

Bei dieser Konfiguration geben die Optionen für die Umgebungsvariable meinen Kontonamen zurück, die Option für das Windows-Zugriffstoken gibt den Namen des Dienstkontos zurück (was ich wollte), und die Option für den angemeldeten Benutzer gibt meinen Kontonamen zurück.


Prüfung

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 Anmeldeinformationsobjekt abzurufen, und dann dieses Skript mit dem Skript für die Ausführung als anderer Benutzer als Argument 1 und dem Anmeldeinformationsobjekt als Argument 2 ausführen.

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"

1 Stimmen

Für PowerShell 6 unter Mac OS X und Linux, [Environment]::UserName ist die beste Option, da sie plattformübergreifend funktioniert. whoami scheint auch zu funktionieren, hängt aber von der whoami das auf der Plattform verfügbar ist.

0 Stimmen

Für Powershell 6 unter Windows, $env:USERNAME produziert SYSTEM es sei denn, ich führe als Administrator aus, während [Environment]::UserName] ergibt so oder so meinen Benutzernamen.

1 Stimmen

Es scheint, dass die Get-WmiObject Methode funktioniert in pwsh nicht mehr. Ich habe sogar versucht, das Kompatibilitätsmodul zu importieren und die Microsoft.PowerShell.Management die das Cmdlet enthält. Haben Sie eine Idee, was passiert ist?

106voto

Eoin Punkte 1059

$env:username ist der einfachste Weg

0 Stimmen

Sie können sie auf diese Weise zuweisen und Verzeichnisse anlegen und so weiter.

61voto

galaktor Punkte 1446

Ich würde gerne die whoami Befehl, der im Grunde ein schöner Alias für die Ausführung von %USERDOMAIN%\%USERNAME% wie in anderen Antworten vorgeschlagen.

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

0 Stimmen

Bei mir funktioniert es mit PS Version 2. Heißt das, dass es auf PS3 nicht mehr funktioniert? C:\>powershell Windows PowerShell Copyright (C) 2009 Microsoft Corporation. Alle Rechte vorbehalten. PS C:\> whoami mydomain \myusername

4 Stimmen

$env:USERNAME kann vom Benutzer geändert werden, aber das wird nicht durch eine solche Änderung getäuscht.

7 Stimmen

Whoami gewinnt für die interaktive Nutzung. Es ist kurz genug, dass ich mich daran erinnern kann, wie man es tippt, ohne SO zu konsultieren :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X