Wie erhalte ich den aktuellen Benutzernamen in Windows PowerShell?

323

Wie erhalte ich den aktuellen Benutzernamen in Windows PowerShell?

Thomas Bratt
quelle

Antworten:

396

Ich habe es gefunden:

$env:UserName

Es gibt auch:

$env:UserDomain
$env:ComputerName
Thomas Bratt
quelle
10
Eine schnelle und schmutzige Alternative wäre das $env:usernameAbrufen des Benutzernamens aus der entsprechenden Umgebungsvariablen.
Guillermooo
7
Ich denke, $ env: Benutzername und [Umgebung] :: Benutzername zeigen beide auf dasselbe.
Cephas
16
Vielen Dank, dass Sie zurückgekommen sind, um Ihre eigene Frage zu beantworten. Nichts Frustrierenderes, wenn jemand die Antwort selbst herausfindet und einfach antwortet: "Macht nichts, verstanden!"
Matt DiTrolio
6
@MattDiTrolio Das ist sicherlich frustrierend, aber du denkst, es gibt nichts Frustrierenderes als das?!
Code Jockey
5
@ CodeJockey Nichts. Nicht in der Geschichte von je. :)
Matt DiTrolio
180
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
Mark Seemann
quelle
16
Dies ist die sicherste Antwort, da $env:USERNAMEsie vom Benutzer geändert werden kann. Dies lässt sich jedoch nicht täuschen.
Kevin Panko
6
@ KevinPanko Stimmt, aber an dem Punkt, an dem Sie Ihrem Benutzer nicht vertrauen können, müssen andere, philosophischere Fragen gestellt werden. ;-)
jpaugh
4
Diese Methode enthält den Domainnamen und den Benutzernamen. Auf jeden Fall von Vorteil, wenn Sie mehrere Domains im Spiel haben.
Ryan Gates
Funktioniert wie erwartet. Getestet auf URL-Adressreservierung.
Marek Bar
Dies scheint auch in PowerShell 6 zu funktionieren, was bedeutet, dass es plattformübergreifend (.Net Standard) kompatibel ist. Ich dachte, es wäre erwähnenswert, da ich es in Frage stellte, als ich den Namespace sah.
tödlicher Hund
120

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 möchten

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

  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username- @TwonOfAn in diesem anderen Forum

Vergleich

@ Kevin Pankos Kommentar zu @ Mark Seemanns Antwort befasst sich mit der Auswahl einer der Kategorien gegenüber der anderen:

[Der Windows-Zugriffstoken-Ansatz] ist die sicherste Antwort, da $ env: USERNAME vom Benutzer geändert werden kann, dies wird jedoch nicht getäuscht.

Kurz gesagt, die Option für Umgebungsvariablen ist prägnanter und die Option für Windows-Zugriffstoken ist zuverlässiger.

Ich musste den Windows-Zugriffstoken-Ansatz von @Mark Seemann in einem PowerShell-Skript verwenden, das ich von einer C # -Anwendung mit Identitätswechsel ausführte.

Die C # -Anwendung wird mit meinem Benutzerkonto ausgeführt und führt das PowerShell-Skript als Dienstkonto aus. Aufgrund einer Einschränkung der Art und Weise, wie ich das PowerShell-Skript über C # ausführe, 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 angemeldete Benutzeroption 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 mit dem Skript ausführen, das als anderer Benutzer als Argument 1 und dem Berechtigungsnachweisobjekt als Argument 2 ausgeführt wird.

Verwendungszweck:

$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"
Alexanderbird
quelle
Für PowerShell 6 unter Mac OS X und Linux [Environment]::UserNameist dies die beste Option, da es plattformübergreifend funktioniert. whoamischeint auch zu funktionieren, hängt aber davon ab, welches whoamiTool auf der Plattform verfügbar ist.
Florian Feldhaus
$env:USERNAMEProduziert für Powershell 6 unter Windows, SYSTEMsofern ich nicht als Administrator ausgeführt werde, während [Environment]::UserName]mein Benutzername so oder so ausgegeben wird.
KFSONE
1
Get-WmiObjectAnscheinend funktioniert die Methode in pwsh nicht mehr. Sogar versucht, Kompatibilitätsmodul zu importieren und das Microsoft.PowerShell.Managementhat das Cmdlet. Irgendeine Idee, was passiert?
not2qubit
Richtig. Es wurde vor einiger Zeit aus Leistungsgründen auf Get-CimInstance umgestellt ... und CIM muss aus Gründen der Kreuzkompatibilität über WMI in Version 6 verwendet werden. Wenn Sie einen Befehl mit GWMI sehen, prüfen Sie, ob Sie stattdessen GCIM ausführen können.
Hicsy
105

$env:username ist der einfachste Weg

Eoin
quelle
Sie können es auf diese Weise zuweisen und Verzeichnisse aufbauen und was nicht.
Droogans
51

Ich möchte den whoami- Befehl eingeben , der im Grunde ein netter Alias ​​dafür ist, %USERDOMAIN%\%USERNAME%wie in anderen Antworten vorgeschlagen.

Write-Host "current user:"
Write-Host $(whoami)
Galaktor
quelle
es funktioniert für mich auf PS Version 2. Wollen Sie damit sagen, dass es in PS3 gelöscht wurde? C: \> Powershell Windows PowerShell Copyright (C) 2009 Microsoft Corporation. Alle Rechte vorbehalten. PS C: \> whoami mydomain \ myusername
galaktor
2
$env:USERNAMEkann vom Benutzer geändert werden, aber dies wird dadurch nicht getäuscht.
Kevin Panko
3
whoami gewinnt für den interaktiven Einsatz. Es ist kurz genug, dass ich mich daran erinnern kann, wie man es tippt, ohne SO zu konsultieren :-)
Iain Samuel McLean Elder
Keine Sache in Nano Server. Verwenden Sie es nicht in Skripten, machen Sie das Richtige ( [System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
Noch ein Benutzer
whoamiist eine ausführbare Datei. Es kann nicht aus PowerShell entfernt werden. Es könnte möglicherweise von Windows entfernt werden, ist aber ab Nicht-Nano Windows Server 2012 noch vorhanden.
jpmc26
37

[Environment]::UserNameGibt nur den Benutzernamen zurück. Zum Beispiel gibt bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Name den Benutzernamen zurück, dem gegebenenfalls die Domain vorangestellt ist. ZB SOMEWHERENICE \ bob

Waffel Souffle
quelle
12

Ich habe $env:usernamein der Vergangenheit verwendet, aber ein Kollege wies darauf hin, dass es sich um eine Umgebungsvariable handelt, die vom Benutzer geändert werden kann. Wenn Sie also wirklich den Benutzernamen des aktuellen Benutzers erhalten möchten, sollten Sie ihm nicht vertrauen.

Ich würde Mark Seemanns Antwort positiv bewerten: [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Name

Aber ich darf nicht. Wenn Sie mit Marks Antwort nur den Benutzernamen benötigen, müssen Sie ihn möglicherweise analysieren, da er auf meinem System zurückgegeben wird hostname\usernameund auf Domänencomputern mit Domänenkonten zurückgegeben wird domain\username.

Ich würde es nicht verwenden, whoami.exeda es nicht in allen Windows-Versionen vorhanden ist und eine andere Binärdatei aufruft und möglicherweise einige Sicherheitsteams fit macht.

Dave Hull
quelle
1
Da die OP tat über Windows-Powershell fragen, die gültig ist, aber [Environment]::UserNameweniger Typisierung, unabhängig von $env:usernameund Cross-Plattform: Siehe pastebin.com/GsfR6Hrp
kfsone
12

Nachdem PowerShell Core (auch bekannt als v6) veröffentlicht wurde und Benutzer möglicherweise plattformübergreifende Skripts schreiben möchten, funktionieren viele der Antworten hier nur noch unter Windows.

[Environment]::UserName Dies scheint der beste Weg zu sein, um den aktuellen Benutzernamen auf allen von PowerShell Core unterstützten Plattformen abzurufen, wenn Sie Ihrem Code keine Plattformerkennung und kein spezielles Gehäuse hinzufügen möchten.

Edouard Arm
quelle
10

Bauen Sie einfach auf die Arbeit anderer hier auf:

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
Stef
quelle
1
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

Der zweite Benutzername dient nur zur Anzeige, wenn Sie ihn kopieren und einfügen.

Clayton.Nichols
quelle
$ fullname = Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty Benutzername $ Benutzername = $ vollständiger Name.Replace ("DOMAIN \", "") $ Benutzername
Clayton.Nichols
-1

Ich habe keine Add-Type- basierten Beispiele gesehen. Hier ist eine, die den GetUserName direkt von advapi32.dll verwendet.

$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()
Knöchel-Dragger
quelle
1
Bitte erläutern Sie, was dieser Code tut und warum er nützlicher ist als eine der kürzeren Methoden.
Benjamin Hubbard
@BenjaminHubbard Die Frage stellt nicht die kürzeste Methode, sondern die Frage, wie das Kunststück mit Powershell erreicht werden kann. Dies führt den Trick anders aus als die anderen Beispiele, indem die Funktion in der DLL aufgerufen und mit der Add-Type-Methode auf .NET zugegriffen wird.
Knöchel-Dragger
1
Obwohl dies ein neuartiger Codeblock ist, wäre es großartig, wenn ich wüsste, was zum Teufel es tut. Können Sie es vielleicht mit Kommentaren versehen? Vielen Dank!
Jpaugh
1
Ich wollte fast abstimmen, da ich den Verdienst des Vorschlags sah. Der Code weist jedoch einige Mängel auf: Er führt einen neuen Namespace ein, verwendet eine magische Konstante (64), deren Wert nicht dem vom Arzt vorgeschriebenen Wert entspricht (sollte UNLEN+1und UNLEN256 ist), und ignoriert alle Fehler, die möglicherweise von GetUserName (bis) zurückgegeben werden GetLastError bleibt erhalten (ein guter Punkt), der Zeichenfolgenpuffer wird nicht bereinigt. und wahrscheinlich einige andere. Und wie andere sagten, fehlen auch Kommentare.
AntoineL
-1

Ich finde es am einfachsten zu verwenden: cd $ home \ Desktop \

Sie gelangen zum aktuellen Benutzer-Desktop

In meinem Fall musste ich den Benutzernamen abrufen, damit das Skript den Pfad ändern konnte, d. H. c: \ Benutzer \% Benutzername%. Ich musste das Skript starten, indem ich den Pfad zum Desktop des Benutzers änderte. Ich konnte dies mit Hilfe von oben und anderswo mithilfe des Get-Location-Applets tun.

Sie haben vielleicht einen anderen oder noch besseren Weg, dies zu tun, aber das hat bei mir funktioniert:

$ Path = Get-Location

Set-Location $ Path \ Desktop

Kes tas
quelle
Das Treffen von Annahmen, die auf dem Home-Verzeichnis basieren, funktioniert nur unter ganz bestimmten Bedingungen.
Raúl Salinas-Monteagudo
Wenn Sie in einem Powershell-Terminal arbeiten und nur schnell herausfinden möchten, welcher Benutzer Sie sind, sollten Sie "ls ~" eingeben. Wie beim obigen Poster kann es Ausnahmen geben, und dies ist definitiv nicht gut für Skripte. Verwenden Sie in diesem Fall das Beispiel von Edouard Poor.
MrBerta
-2

Wenn Sie an Batch gewöhnt sind, können Sie anrufen

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

Dies stiehlt im Grunde die Ausgabe von dem, was Sie erhalten würden, wenn Sie eine Batch-Datei mit nur "echo% username%" hätten.

Schals
quelle
1
Ich stimme ab, weil: a) Sie $(...)überflüssig sind: $a = cmd.exe /c echo %username%funktioniert, b) es ist nicht portabel, c) es beantwortet nicht wirklich die Frage, wie es in Powershell gemacht wird, es beantwortet, wie es in Dos gemacht wird, und es ist Es ist besser, einem Mann eine Angelrute zu geben, als ihm einen Fisch zu geben, z powershell puts environment variables into $env, so %username% = $env:username.
KFSONE
-2
  1. get-content "cm.txt"
  2. write-host "entr file name" $file = read-host get-content $file
  3. $content = get-content "cm.txt"
  4. $content = get-content "cn.txt" for each ($line in $count) {write-host $line}
ammy
quelle
$ content = get-content "cm.txt" ---- $ count = 0 ----- foreach ($ line in $ count) ---- {$ count = $ count + 1} ---- write -host "Sie haben diese vielen Zeilen:" $ count
ammy
1. $ a = $ com1, $ com2 ------ Schreib-Host "cm-Namen eingeben" ---- $ c = Lese-Host ----- Schreib-Host $ a [$ c-1] .Benutzername , schreibe-host $ a [$ c-1] .password
ammy
$ com1 = neues Objekt PSobject ----- $ com1 = $ com1 | add-member noteproperty -name username -value 2016
ammy
1
Gibt es einen Grund, warum Sie Code als Kommentar zu Ihrer eigenen Antwort hinzufügen?
aldr
1
Warum bearbeitest du deine Antwort nicht und fügst den Code hinzu, anstatt ihn in solche Kommentare aufzuteilen, wo niemand ihn verstehen wird?
Aldr
-4

In meinem Fall musste ich den Benutzernamen abrufen, damit das Skript den Pfad ändern konnte, d. H. c:\users\%username%\. Ich musste das Skript starten, indem ich den Pfad zum Desktop des Benutzers änderte. Ich konnte dies mit Hilfe von oben und anderswo mithilfe des Get-Location- Applets tun .

Sie haben vielleicht einen anderen oder noch besseren Weg, dies zu tun, aber das hat bei mir funktioniert:

$Path = Get-Location

Set-Location $Path\Desktop
kjp
quelle
1
Willkommen bei Stack Overflow ! Dies entspricht Set-Location Desktop. ( Get-LocationSet-Location
Gibt