Wie erhalte ich den aktuellen Benutzernamen in Windows PowerShell?
Wie erhalte ich den aktuellen Benutzernamen in Windows PowerShell?
Antworten:
Ich habe es gefunden:
$env:UserName
Es gibt auch:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$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.
(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 in diesem anderen Forum@ 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.
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"
[Environment]::UserName
ist dies die beste Option, da es plattformübergreifend funktioniert. whoami
scheint auch zu funktionieren, hängt aber davon ab, welches whoami
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 das Microsoft.PowerShell.Management
hat das Cmdlet. Irgendeine Idee, was passiert?
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)
$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 \ bob
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 wird domain\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.
[Environment]::UserName
weniger Typisierung, unabhängig von $env:username
und Cross-Plattform: Siehe pastebin.com/GsfR6Hrp
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.
$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.
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()
UNLEN+1
und UNLEN
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 \
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
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.
$(...)
ü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
.
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}
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
$env:username
Abrufen des Benutzernamens aus der entsprechenden Umgebungsvariablen.