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:USERNAMEsie 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]::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.
$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.
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?
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:USERNAMEkann vom Benutzer geändert werden, aber dies wird dadurch nicht getäuscht.
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
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.
[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
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.
[Environment]::UserNameweniger Typisierung, unabhängig von $env:usernameund 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+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.
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:usernameAbrufen des Benutzernamens aus der entsprechenden Umgebungsvariablen.