Czy podczas uruchamiania skryptu wiersza poleceń można uzyskać nazwę bieżącego użytkownika?
Czy podczas uruchamiania skryptu wiersza poleceń można uzyskać nazwę bieżącego użytkownika?
Odpowiedzi:
Nazwa Użytkownika:
echo %USERNAME%
Nazwa domeny:
echo %USERDOMAIN%
Pełną listę zmiennych środowiskowych można uzyskać, uruchamiając polecenie set
z wiersza polecenia.
Po prostu użyj tego polecenia w wierszu polecenia
C:\> whoami
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.
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 set
wiersza polecenia spowoduje wyświetlenie wszystkich zmiennych środowiskowych.
Odpowiedź zależy od tego, w jakim języku „skryptu wiersza poleceń” się znajdujesz.
W starym cmd.exe
wierszu polecenia lub w skrypcie .bat
lub .cmd
możesz użyć następujących poleceń :
%USERNAME%
- Pobiera tylko nazwę użytkownika.
%USERDOMAIN%
- Pobiera domenę użytkownika.
W wierszu polecenia programu PowerShell .ps1
lub .psm1
skrypcie 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 $Env
zmienne poniżej.
$Env:Username
- Pobiera tylko nazwę użytkownika.
$Env:UserDomain
- Pobiera domenę użytkownika.
$Env:ComputerName
- Pobiera nazwę komputera.
% 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
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.
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.
net config Workstation | find "User name"
whoami
jest dostępny począwszy od systemu Windows Vista.
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
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)
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ź ">"].
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