Jak znaleźć bieżącego użytkownika w środowisku Windows?


159

Czy podczas uruchamiania skryptu wiersza poleceń można uzyskać nazwę bieżącego użytkownika?



@PeterMortensen, nie sądzę, aby ten wątek był super powiązany z tym. Jedna dotyczy korzystania z .NET, a druga dotyczy korzystania z interfejsu API cmd . Oprócz tego, że obaj chcą tych samych informacji, z pewnością jest mnóstwo innych interfejsów API, które również robią podobne rzeczy
— KyleMit

Odpowiedzi:


202

Możesz użyć zmiennej nazwy użytkownika: %USERNAME%


90

Nazwa Użytkownika:

echo %USERNAME%

Nazwa domeny:

echo %USERDOMAIN%

Pełną listę zmiennych środowiskowych można uzyskać, uruchamiając polecenie setz wiersza polecenia.


Dodatkowe informacje ze wszystkimi zmiennymi środowiskowymi sprawiają, że jest to wspaniała rozszerzona odpowiedź.
— bballdave025

63

Po prostu użyj tego polecenia w wierszu polecenia

C:\> whoami

To dobra odpowiedź, ale są pewne zastrzeżenia. Jeśli wejdę whoami, dostanę desktop-machine\bballdave025. Są dwie części, rozpatrywane przez: 1) echo %USERNAME%, wynik bballdave025; 2) echo %USERDOMAIN%, wynik DESKTOP-MACHINE. Wydaje mi się, że można powiedzieć, że „pełna nazwa użytkownika” jest dostępna za pośrednictwem echo %USERDOMAIN%\%USERNAME%wyniku (ten wynik DESKTOP-MACHINE\bballdave025,, odpowiada temu z whoami, ignorując wielkość liter), a nawet przez echo %USERNAME%@%USERDOMAIN%wynik bballdave025@DESKTOP-MACHINE. Wszystko zależy od tego, czego potrzebuje użytkownik (dla nas OP) , czyli czy ważna jest domena.
— bballdave025

46

Powinien być w %USERNAME%. Oczywiście można to łatwo sfałszować, więc nie należy na tym polegać w celu zapewnienia bezpieczeństwa.

Przydatna wskazówka: wpisanie setwiersza polecenia spowoduje wyświetlenie wszystkich zmiennych środowiskowych.


2
Twoja stacja robocza 'net config | find „Nazwa użytkownika” ”jest bardzo przydatny. Powinna to być odpowiedź, a nie tylko komentarz
— Alpay

17

%USERNAME% to poprawna odpowiedź w środowisku wsadowym i innych w środowiskach Windows.

Inną opcją jest użycie %USERPROFILE%do uzyskania ścieżki użytkownika, na przykład C:\Users\username.


6

Odpowiedź zależy od tego, w jakim języku „skryptu wiersza poleceń” się znajdujesz.

Cmd

W starym cmd.exewierszu polecenia lub w skrypcie .batlub .cmdmożesz użyć następujących poleceń :

%USERNAME% - Pobiera tylko nazwę użytkownika.

%USERDOMAIN% - Pobiera domenę użytkownika.

PowerShell

W wierszu polecenia programu PowerShell .ps1lub .psm1skrypcie lub można użyć następujących poleceń :

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name- Podaje w pełni kwalifikowaną nazwę użytkownika (np. Domena \ nazwa użytkownika). Jest to również najbezpieczniejsza metoda, ponieważ nie może być zastąpiona przez użytkownika, tak jak inne $Envzmienne poniżej.

$Env:Username - Pobiera tylko nazwę użytkownika.

$Env:UserDomain - Pobiera domenę użytkownika.

$Env:ComputerName - Pobiera nazwę komputera.


To świetna odpowiedź, ponieważ to pytanie zależy od „powłoki”. Istnieje wiele powłok, których można używać w systemie Windows. Nie tylko CMD. W dzisiejszych czasach większość ludzi przeniosła się na PowerShell, a są inni. stackoverflow.com/questions/17349022/…
— G_Style

5

% USERNAME% otrzyma nazwę użytkownika aktualnie uruchomionego procesu. W zależności od tego, jak uruchamiasz plik wsadowy, nie musi to być takie samo, jak nazwa bieżącego użytkownika. Na przykład możesz uruchamiać plik wsadowy za pomocą zaplanowanego zadania, z usługi itp.

Oto bardziej pewny sposób uzyskania nazwy użytkownika aktualnie zalogowanego użytkownika poprzez zeskrobanie nazwy użytkownika, który uruchomił zadanie explorer.exe:

for /f "TOKENS=1,2,*" %%a in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do if /i "%%a %%b"=="User Name:" set _currdomain_user=%%c
for /f "TOKENS=1,2 DELIMS=\" %%a in ("%_currdomain_user%") do set _currdomain=%%a & set _curruser=%%b

4

Używam tej metody do pisania plików wsadowych do testów.

echo %userdomain%\%username%

Ponieważ musisz podać hasło w postaci zwykłego tekstu, jeśli wymagane jest uwierzytelnienie, użyję go tylko w całkowicie prywatnym środowisku, w którym inni użytkownicy nie mogą go wyświetlić lub jeśli użytkownik widzący hasło nie poniósłby żadnych konsekwencji.

Mam nadzieję, że to komuś pomoże.


4

Zawsze denerwowało mnie to, że Windows nie ma kilku bardziej użytecznych małych narzędzi do skryptowania Uniksa, takich jak who / whoami , sed i AWK . W każdym razie, jeśli chcesz czegoś niezawodnego, pobierz Visual Studio Express i skompiluj następujące elementy:

#include <windows.h>
#include <stdio.h>

int main(int argc, char **argv) {
    printf("%s", GetUserName());
}

I po prostu użyj tego w swoim pliku wsadowym.


Tak, byłoby miło mieć wbudowany.
— Geo

8
Zgadzam się, że sed i awk byłyby przydatne, ale to daje 50% drogi: net config Workstation | find "User name"
— the_mandrill

9
whoamijest dostępny począwszy od systemu Windows Vista.
— Joey

2
To prawda, narzędzie whoami jest dołączone do Visty. W przypadku XP znajduje się on w narzędziach wsparcia SP2, aw przypadku W2K w zestawie narzędzi Resource.
— RealHowTo

4

W większości przypadków zmienna% USERNAME% będzie taka, jak chcesz.

echo %USERNAME%

Jeśli jednak używasz powłoki cmd z podwyższonym poziomem uprawnień,% USERNAME% zgłosi nazwę administratora zamiast własnej nazwy użytkownika. Jeśli chcesz poznać to drugie, uruchom:

for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u

1

Oto główna różnica między zmienną użytkownika a poleceniem whoami:

C:\Users\user.name>echo %username%
user.name

C:\Users\user.name>whoami
domain\user.name

DOMAIN = bios name of the domain (not fqdn)

0

W standardowym kontekście każdy podłączony użytkownik posiada proces explorer.exe: Polecenie [lista zadań / V | znajdź "eksplorator"] zwraca wiersz zawierający właściciela procesu explorer.exe, z dostosowanym wyrażeniem regularnym można uzyskać wymagane wartość. Działa to również doskonale pod Windows 7.

W rzadkich przypadkach program explorer.exe zostaje zastąpiony innym programem, filtr wyszukiwania można dostosować do tego przypadku. Jeśli polecenie zwróci pusty wiersz, prawdopodobnie żaden użytkownik nie jest zalogowany. W systemie Windows 7 można również uruchomić [sesję zapytań | znajdź ">"].


0

O ile uważam, że odpowiedź BlueBearr jest najlepsza (póki ja uruchamiam skrypt wsadowy z np. Prawami SYSTEMowymi) to muszę coś do tego dodać. Ponieważ w mojej wersji językowej Windows (polskiej) wiersz, który ma być przechwycony przez "%% a %% b" == "Nazwa użytkownika:" jest NAPRAWDĘ SKOMPLIKOWANY (zawiera kilka znaków diakrytycznych w moim języku) pomijam pierwsze 7 wierszy i działają 8.

@for /f "SKIP= 7 TOKENS=3,4 DELIMS=\ " %%G in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do @IF %%G==%COMPUTERNAME% set _currdomain_user=%%H
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.