Jak uzyskać bieżącą nazwę użytkownika w Windows PowerShell?

Jak uzyskać bieżącą nazwę użytkownika w Windows PowerShell?

Author: Peter Mortensen, 2010-01-18

14 answers

Znalazłem:

$env:UserName

Istnieje również:

$env:UserDomain
$env:ComputerName
 435
Author: Thomas Bratt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-23 19:58:35
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
 190
Author: Mark Seemann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-18 11:54:21

Pomyślałem, że warto byłoby podsumować i porównać podane odpowiedzi.

Jeśli chcesz uzyskać dostęp do zmienna środowiskowa:

(łatwiejsza/krótsza / niezapomniana opcja)

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

Jeśli chcesz uzyskać dostęp do token dostępu do systemu Windows:

(bardziej niezawodna opcja)

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

Jeśli chcesz podać nazwę zalogowanego użytkownika

Nie jest to jednak tylko nazwa użytkownika, który uruchomił instancję PowerShell.]}
  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username -- @TwonOfAn na to inne forum

Porównanie

Komentarz Kevina Panko do odpowiedzi Marka Seemanna dotyczy wyboru jednej z kategorii nad drugą:

[the Windows access token approach] jest najbezpieczniejszą odpowiedzią, ponieważ $env: USERNAME może być zmieniane przez użytkownika, ale nie da się tego oszukać.

W skrócie, opcja zmiennej środowiskowej jest bardziej zwięzła, a opcja tokenu Windows access jest bardziej niezawodna.

Musiałem użyć podejścia Windows access token @ Mark Seemann w skrypcie PowerShell, który uruchamiałem z aplikacji C# z podszywaniem się.

Aplikacja C# jest uruchamiana z moim kontem użytkownika i uruchamia skrypt PowerShell jako konto usługowe. Z powodu ograniczenie sposób, w jaki uruchamiam skrypt PowerShell z C#, instancja PowerShell wykorzystuje zmienne środowiskowe mojego konta użytkownika, nawet jeśli jest uruchamiana jako użytkownik konta usługi.

W tej konfiguracji opcje zmiennej środowiskowej zwracają nazwę mojego konta, a token Windows access zwraca nazwę konta usługi (co chciałem), a opcja zalogowany użytkownik zwraca nazwę mojego konta.


Testowanie

Również, jeśli chcesz porównać opcje sam, oto skrypt, którego możesz użyć do uruchomienia skryptu jako inny użytkownik. Musisz użyć polecenia Get-Credential cmdlet, aby uzyskać obiekt credential, a następnie uruchomić ten skrypt ze skryptem, aby uruchomić jako inny użytkownik jako argument 1, A obiekt credential jako argument 2.

Użycie:

$cred = Get-Credential UserTo.RunAs
Run-AsUser.ps1 "whoami; pause" $cred
Run-AsUser.ps1 "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name; pause" $cred

Zawartość skryptu 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"
 135
Author: alexanderbird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-23 20:30:20

$env:username jest najprostszym sposobem

 105
Author: Eoin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-25 07:52:51

Chciałbym dorzucić komendę whoami , która w zasadzie jest miłym aliasem do wykonywania {[1] } zgodnie z propozycją w innych odpowiedziach.

Write-Host "current user:"
Write-Host $(whoami)
 52
Author: galaktor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 09:08:35

[Environment]::UserName zwraca tylko nazwę użytkownika. Np. bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Name zwraca nazwę użytkownika, poprzedzoną w stosownych przypadkach jego domeną. Np. Somewhere\bob

 37
Author: WaffleSouffle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-14 12:19:30

Używałem $env:username w przeszłości, ale kolega zauważył, że jest to zmienna środowiskowa i może być zmieniona przez użytkownika, dlatego jeśli naprawdę chcesz uzyskać nazwę użytkownika bieżącego użytkownika, nie powinieneś jej ufać.

Podniosłbym odpowiedź Marka Seemanna: [System. Security.Principal. WindowsIdentity]:: GetCurrent (). Name

Ale nie wolno mi. Z odpowiedzią Marka, jeśli potrzebujesz tylko nazwy użytkownika, być może będziesz musiał ją przeanalizować, ponieważ w moim systemie zwraca hostname\username i na domenie połączone maszyny z kontami domenowymi zwróci domain\username.

Nie użyłbym whoami.exe, ponieważ nie jest on obecny we wszystkich wersjach systemu Windows, a to wywołanie do innego pliku binarnego i może dać pewne dopasowania zespołom bezpieczeństwa.

 16
Author: Dave Hull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-23 20:32:55

Teraz, gdy PowerShell Core (aka v6) został wydany, a ludzie mogą chcieć pisać skrypty wieloplatformowe, wiele odpowiedzi tutaj nie będzie działać na niczym innym niż Windows.

[Environment]::UserName wydaje się być najlepszym sposobem uzyskania bieżącej nazwy użytkownika na wszystkich platformach obsługiwanych przez PowerShell Core, jeśli nie chcesz dodawać wykrywania platformy i specjalnej obudowy do kodu.

 14
Author: Edouard Poor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-23 20:36:34

Po prostu opierając się na pracy innych tutaj:

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
 10
Author: Stef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-23 20:31:13
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

The second Nazwa użytkownika służy tylko do wyświetlania tylko wtedy, gdy ją skopiujesz i wkleisz.

 4
Author: clayton.nichols,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-06 22:53:56

Nie widziałem żadnych przykładów opartych na Add-Type . Tutaj jest jeden za pomocą GetUserName bezpośrednio z advapi32.dll.

$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()
 0
Author: Knuckle-Dragger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-23 20:26:01

Jeśli jesteś przyzwyczajony do partii, możesz zadzwonić

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

To w zasadzie kradnie wynik z tego, co otrzymałbyś, gdybyś miał plik wsadowy z " echo % username%".

 -2
Author: shaws,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-06 21:37:03

I find easily to use: cd $home\Desktop\

Przeniesie Cię do pulpitu bieżącego użytkownika

W moim przypadku musiałem pobrać nazwę użytkownika, aby umożliwić skryptowi zmianę ścieżki, np. c:\users\%username%. Musiałem uruchomić skrypt zmieniając ścieżkę do pulpitu użytkownika. Udało mi się to zrobić, z Pomocą z góry i z innych stron, używając apletu get-location.

Możesz mieć inny, a nawet lepszy sposób, ale u mnie to działało:

$Path = Get-Location

Set-Location $Path\Desktop

 -3
Author: Kes tas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-01 14:23:50

W moim przypadku musiałem pobrać nazwę użytkownika, aby umożliwić skryptowi zmianę ścieżki, np. c:\users\%username%\. Musiałem uruchomić skrypt zmieniając ścieżkę do pulpitu użytkownika. Udało mi się to zrobić, z Pomocą z góry i z innych stron, używając apletu get-location.

Możesz mieć inny, a nawet lepszy sposób na to, ale to mi pomogło:

$Path = Get-Location

Set-Location $Path\Desktop
 -4
Author: kjp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-30 17:57:55