Wie erhalte ich den aktuellen Benutzernamen in Windows PowerShell?
windows
powershell
scripting
Thomas Bratt
quelle
quelle
$env:username
Abrufen des Benutzernamens aus der entsprechenden Umgebungsvariablen.quelle
$env:USERNAME
sie vom Benutzer geändert werden kann. Dies lässt sich jedoch nicht täuschen.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
- @Eoinwhoami
- @galaktorWenn Sie auf das Windows-Zugriffstoken zugreifen möchten :
(zuverlässigere Option)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @ MarkSeemannWenn 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 ForumVergleich
@ Kevin Pankos Kommentar zu @ Mark Seemanns Antwort befasst sich mit der Auswahl einer der Kategorien gegenüber der anderen:
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:
Inhalt des Skripts Run-AsUser.ps1:
quelle
[Environment]::UserName
ist dies die beste Option, da es plattformübergreifend funktioniert.whoami
scheint auch zu funktionieren, hängt aber davon ab, welcheswhoami
Tool auf der Plattform verfügbar ist.$env:USERNAME
Produziert für Powershell 6 unter Windows,SYSTEM
sofern ich nicht als Administrator ausgeführt werde, während[Environment]::UserName]
mein Benutzername so oder so ausgegeben wird.Get-WmiObject
Anscheinend funktioniert die Methode in pwsh nicht mehr. Sogar versucht, Kompatibilitätsmodul zu importieren und dasMicrosoft.PowerShell.Management
hat das Cmdlet. Irgendeine Idee, was passiert?$env:username
ist der einfachste Wegquelle
Ich möchte den whoami- Befehl eingeben , der im Grunde ein netter Alias dafür ist,
%USERDOMAIN%\%USERNAME%
wie in anderen Antworten vorgeschlagen.quelle
$env:USERNAME
kann vom Benutzer geändert werden, aber dies wird dadurch nicht getäuscht.[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)whoami
ist 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.[Environment]::UserName
Gibt 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 \ bobquelle
Ich habe
$env:username
in 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\username
und auf Domänencomputern mit Domänenkonten zurückgegeben wirddomain\username
.Ich würde es nicht verwenden,
whoami.exe
da es nicht in allen Windows-Versionen vorhanden ist und eine andere Binärdatei aufruft und möglicherweise einige Sicherheitsteams fit macht.quelle
[Environment]::UserName
weniger Typisierung, unabhängig von$env:username
und Cross-Plattform: Siehe pastebin.com/GsfR6HrpNachdem 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.quelle
Bauen Sie einfach auf die Arbeit anderer hier auf:
quelle
$username
Der zweite Benutzername dient nur zur Anzeige, wenn Sie ihn kopieren und einfügen.
quelle
Ich habe keine Add-Type- basierten Beispiele gesehen. Hier ist eine, die den GetUserName direkt von advapi32.dll verwendet.
quelle
UNLEN+1
undUNLEN
256 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.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
quelle
Wenn Sie an Batch gewöhnt sind, können Sie anrufen
Dies stiehlt im Grunde die Ausgabe von dem, was Sie erhalten würden, wenn Sie eine Batch-Datei mit nur "echo% username%" hätten.
quelle
$(...)
ü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, zpowershell puts environment variables into $env, so %username% = $env:username
.get-content "cm.txt"
write-host "entr file name" $file = read-host get-content $file
$content = get-content "cm.txt"
$content = get-content "cn.txt" for each ($line in $count) {write-host $line}
quelle
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:
quelle
Set-Location Desktop
. (Get-Location
Set-Location