Jak uzyskać bieżącą nazwę użytkownika w programie Windows PowerShell?
windows
powershell
scripting
Thomas Bratt
źródło
źródło
$env:username
pobranie nazwy użytkownika z odpowiedniej zmiennej środowiskowej.źródło
$env:USERNAME
może zostać zmieniona przez użytkownika, ale nie da się tego oszukać.Pomyślałem, że warto podsumować i porównać podane odpowiedzi.
Jeśli chcesz uzyskać dostęp do zmiennej środowiskowej :
(łatwiejsza / krótsza / zapadająca w pamięć opcja)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktorJeśli chcesz uzyskać dostęp do tokena dostępu do systemu Windows :
(bardziej niezawodna opcja)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemannJeśli chcesz podać nazwę zalogowanego użytkownika
(zamiast nazwy użytkownika uruchamiającego instancję PowerShell)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn na tym innym forumPorównanie
Komentarz @Kevin Panko do odpowiedzi @Mark Seemann dotyczy wyboru jednej z kategorii zamiast drugiej:
Krótko mówiąc, opcja zmiennej środowiskowej jest bardziej zwięzła, a opcja tokena dostępu do systemu Windows jest bardziej niezawodna.
Musiałem używać podejścia @Mark Seemann do tokena dostępu do systemu Windows w skrypcie PowerShell, który uruchamiałem z aplikacji C # z personifikacją.
Aplikacja C # jest uruchamiana z moim kontem użytkownika i uruchamia skrypt PowerShell jako konto usługi. Z powodu ograniczenia sposobu uruchamiania skryptu PowerShell z C #, instancja PowerShell używa zmiennych środowiskowych mojego konta użytkownika, nawet jeśli jest uruchamiana jako użytkownik konta usługi.
W tym ustawieniu opcje zmiennej środowiskowej zwracają nazwę mojego konta, a opcja tokena dostępu do systemu Windows zwraca nazwę konta usługi (czego chciałem), a zalogowana opcja użytkownika zwraca nazwę mojego konta.
Testowanie
Ponadto, jeśli chcesz porównać opcje samodzielnie, oto skrypt, którego możesz użyć do uruchomienia skryptu jako inny użytkownik. Aby uzyskać obiekt referencji, należy użyć polecenia cmdlet Get-Credential, a następnie uruchomić ten skrypt ze skryptem, aby uruchomić jako inny użytkownik jako argument 1, a obiekt referencji jako argument 2.
Stosowanie:
Zawartość skryptu Run-AsUser.ps1:
źródło
[Environment]::UserName
jest najlepszą opcją, ponieważ działa na wielu platformach.whoami
wydaje się również działać, ale zależy odwhoami
narzędzia dostępnego na platformie.$env:USERNAME
produkuje,SYSTEM
chyba że uruchomię się jako administrator, a jednocześnie podaje[Environment]::UserName]
moją nazwę użytkownika.Get-WmiObject
metoda nie działa już w pwsh. Próbowałem nawet zaimportować moduł zgodności i ten,Microsoft.PowerShell.Management
który ma polecenie cmdlet. Masz pomysł, co się dzieje?$env:username
jest najprostszym sposobemźródło
Chciałbym wrzucić komendę whoami , która w zasadzie jest fajnym pseudonimem do działania,
%USERDOMAIN%\%USERNAME%
jak zaproponowano w innych odpowiedziach.źródło
$env:USERNAME
może zostać zmieniony przez użytkownika, ale nie da się tego oszukać.[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)whoami
jest plikiem wykonywalnym. Nie można go usunąć z PowerShell. Można go potencjalnie usunąć z systemu Windows, ale nadal jest dostępny od wersji innej niż Nano Windows Server 2012.[Environment]::UserName
zwraca tylko nazwę użytkownika. Np. Bob[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
zwraca nazwę użytkownika, w razie potrzeby poprzedzoną jej domeną. Np. SOMEWHERENICE \ bobźródło
Używałem
$env:username
w przeszłości, ale kolega z pracy 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ć.Głosowałbym za odpowiedzią Marka Seemanna: [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Nazwa
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 ona zwraca,
hostname\username
a na komputerach przyłączonych do domeny z kontami domeny to zwrócidomain\username
.Nie użyłbym tego,
whoami.exe
ponieważ nie jest obecny we wszystkich wersjach systemu Windows, a jest to wezwanie do innego pliku binarnego i może dać atak zespołom bezpieczeństwa.źródło
[Environment]::UserName
jest mniej$env:username
Teraz ten rdzeń PowerShell wydaniu (aka v6), 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 na uzyskanie bieżącej nazwy użytkownika na wszystkich platformach obsługiwanych przez PowerShell Core, jeśli nie chcesz dodawać wykrywania kodu i specjalnej obudowy do swojego kodu.źródło
Opierając się tylko na pracy innych tutaj:
źródło
$username
Druga nazwa jest tylko do wyświetlania celów wyłącznie jeśli skopiować i wkleić.
źródło
Nie widziałem żadnych przykładów opartych na Add-Type . Oto jeden za pomocą GetUserName bezpośrednio z advapi32.dll.
źródło
UNLEN+1
, aUNLEN
jest 256), to pomija żadnego błędu, który mógłby zostać zwrócony z GetUserName (poprzez zachowuje GetLastError, co jest dobrym punktem), nie czyści bufora ciągów; i prawdopodobnie kilka innych. I jak powiedzieli inni, bardzo brakuje też komentarzy.Uważam, że najłatwiejszy w użyciu: cd $ home \ Desktop \
zabierze Cię do bieżącego pulpitu użytkownika
W moim przypadku musiałem pobrać nazwę użytkownika, aby umożliwić skryptowi zmianę ścieżki, tj. c: \ users \% nazwa użytkownika%. Musiałem uruchomić skrypt, zmieniając ścieżkę do pulpitu użytkownika. Byłem w stanie to zrobić, korzystając z pomocy z góry i gdzie indziej, używając apletu get-location.
Możesz mieć inny, a nawet lepszy sposób, aby to zrobić, ale to zadziałało dla mnie:
$ Path = Get-Location
Ustaw lokalizację $ Path \ Desktop
źródło
Jeśli jesteś przyzwyczajony do partii, możesz zadzwonić
To w zasadzie kradnie dane wyjściowe z tego, co byś otrzymał, gdybyś miał plik wsadowy z po prostu „echo% nazwa użytkownika%”.
źródło
$(...)
zbyteczny:$a = cmd.exe /c echo %username%
działa, b) nie jest przenośny, c) tak naprawdę nie odpowiada na pytanie, jak to zrobić w PowerShell, odpowiada, jak to zrobić w dos, i to jest lepiej dać mężczyźnie wędkę niż dać mu rybę, nppowershell 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}
źródło
W moim przypadku musiałem pobrać nazwę użytkownika, aby umożliwić skryptowi zmianę ścieżki, tj.
c:\users\%username%\
. Musiałem uruchomić skrypt, zmieniając ścieżkę do pulpitu użytkownika. Byłem w stanie to zrobić, korzystając z pomocy z góry i gdzie indziej, używając get-location apletu .Możesz mieć inny, a nawet lepszy sposób, aby to zrobić, ale to zadziałało dla mnie:
źródło
Set-Location Desktop
. (Get-Location
jedynie zwraca bieżącą lokalizację, która jest domyślna dlaSet-Location
ścieżki względnej.)