it-swarm.com.de

Wie erhalte ich den aktuellen Benutzernamen in Windows PowerShell?

Wie erhalte ich den aktuellen Benutzernamen in Windows PowerShell?

275
Thomas Bratt

Ich habe es gefunden:

$env:UserName

Es gibt auch:

$env:UserDomain
$env:ComputerName
346
Thomas Bratt
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
159
Mark Seemann

$env:username ist der einfachste Weg

103
Eoin

Ich dachte, es wäre wertvoll, die gegebenen Antworten zusammenzufassen und zu vergleichen.

Wenn Sie auf die - Umgebungsvariable zugreifen möchten:

(einfachere/kürzere/einprägsame Option)

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

Wenn Sie auf das Windows-Zugriffstoken zugreifen möchten:

(zuverlässigere Option)

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

Wenn Sie den Namen des angemeldeten Benutzers wünschen

(anstelle des Namens des Benutzers, der die PowerShell-Instanz ausführt)

  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username - @TwonOfAn on this other forum

Vergleich

Bei @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.


Testen

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"
102
alexanderbird

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)
49
galaktor

[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

34
WaffleSouffle

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.

10
Dave Hull

Bauen Sie hier einfach auf die Arbeit anderer:

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

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.

6
Edouard Poor
$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.

0
clayton.nichols