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

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

Author: Thomas Bratt, 2010-01-18

12 answers

Znaleziono:

$env:UserName

Istnieje również:

$env:UserDomain
$env:ComputerName
 282
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
2017-01-21 02:40:44
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
 132
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

$env:username jest najprostszym sposobem

 98
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

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 ograniczenia w 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 dostępu do systemu Windows 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 samodzielnie, oto skrypt 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"
 73
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
2017-10-25 20:01:21

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)
 45
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

 32
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 i 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 nazwę hosta\nazwa użytkownika, a na maszynach połączonych z domeną z kontami domeny zwróci nazwę domeny\username. Nie użyłbym whoami.exe ponieważ nie jest obecny we wszystkich wersjach systemu Windows i jest wywołaniem do innego pliku binarnego i może dać pewne dopasowania zespołom bezpieczeństwa.
 6
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
2017-01-24 17:21:08

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

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")

I dziękuję za informacje, ponieważ lubię pobierać dane prosto i z autorytatywnego źródła.

 4
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
2016-08-04 17:00:46

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.

 2
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
2018-03-15 20:37:59

Nie widziałem żadnych przykładów opartych na add-type, tutaj jest jeden z wykorzystaniem 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()
 -1
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
2014-08-03 20:09:19

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%".

 -1
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

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
 -3
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