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

159

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

Geo
źródło
@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%

JRL
źródło
90

Nazwa Użytkownika:

echo %USERNAME%

Nazwa domeny:

echo %USERDOMAIN%

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

Magnus Lindhe
źródło
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
Obywatel
źródło
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.

the_mandrill
źródło
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.

zwiad
źródło
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.

śmiertelny pies
źródło
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
BlueBearr
źródło
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.

Chad Harrington Mitchell
źródło
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.

Chris K
źródło
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
Jean-François Larvoire
źródło
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)
integratorIT
źródło
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ź ">"].

Armand Poulenard
źródło
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
ITMarka
źródło