2015-01-22 47 views
5

Przykład: Jestem zalogowany jako użytkownik TestUser. Od tego użytkownika zamierzam uruchomić wiersz poleceń jako administrator o nazwie AdminUser.Pobierz aktualnie zalogowanego użytkownika na Windows

Czy to z tego wiersza poleceń można określić nazwę aktualnie zalogowanego użytkownika TestUser?

Mam już zaplanowane zadanie, które zawsze działa jako AdminUser, ale w jego akcji (plik wsadowy) potrzebuję nazwy aktualnie zalogowanego użytkownika.

Wszelkie pomysły?

+0

Czy możesz wyjaśnić, co rozumie się przez "aktualnie zalogowany użytkownik"? Czy ograniczasz to do konsoli? Czy liczą się połączenia pulpitu zdalnego? Jeśli jest to system operacyjny serwera, jaki byłby wybór między cilentami RDP? – mojo

+0

nie jestem pewien, ponieważ nie można spróbować w tej chwili, ale robi 'tasklist/v | find" explorer.exe "' help? – Stephan

+1

Możliwy duplikat * [Jak znaleźć aktualnego użytkownika w środowisku Windows?] (Http://stackoverflow.com/questions/1607271/how-do-you-find-turrent-user-in-a- Windows-środowisko) *. –

Odpowiedz

5

O ile mi wiadomo, nie jest to możliwe. W zależności od tego, ile wiesz o środowisku użytkowników, co następuje obejście może być jednak:

Komenda

qwinsta 

daje listę sesji dla komputera. W ramach tych sesji jeden będzie aktywny, więc jeśli ten program zostanie użyty w sesji interaktywnej, to zasadniczo będzie zawierał "zalogowanego użytkownika" zgodnie z opisem (jest to znacznie bardziej skomplikowane, może być wielu zalogowanych użytkowników ale tylko jedna może być aktywna i mam tylko nadzieję, że wiesz wystarczająco dużo o scenariuszu użycia twojego programu, aby tego użyć). Można przeanalizować dane wyjściowe i pracować z tą nazwą użytkownika.

Oczywiście jest to brudny hack i zakłada, że ​​podczas wykonywania zadania nie ma szans, że użytkownicy się zmienią.

Również wybrałem qwinsta.exe, ponieważ jest to bardzo podstawowe podejście, które nie wymaga żadnych wywołań API lub coś, co nadal nie jestem pewien, czy CMD ma wystarczające możliwości analizowania, aby uzyskać niezbędne informacje dla Ciebie.

+0

Dzięki. To rozwiązanie zwykle działa. Ale na wszelki wypadek nie. Powiem ci dlaczego. Zasadniczo muszę uruchomić plik wsadowy tylko po wylogowaniu z administratora. Moje zadanie jest uruchamiane w zdarzeniu Security 4647 (zdarzenie wylogowania). Więc testuję twoją propozycję i nie ma już aktywnych sesji. Próbowałem to zrobić poprzez skrypty wylogowania z polityki grupowej za pośrednictwem rejestru, ale jest to bardzo niestabilne i nie działa dla mnie. – dEVIANT

+1

Nie potrzebujesz aktywnego użytkownika, ale ostatniego aktywnego? W takim przypadku zaproponowałbym inne rozwiązanie. Jeśli możesz zagwarantować brak sesji zdalnych, możesz wypróbować klucz HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Authentication \ LogonUI \ LastLoggedOnUser. Jest to w zasadzie kluczowy program Windows, który pokazuje ostatniego użytkownika na ekranie logowania. Sesje zdalne nie są tam zapisywane ... Jeśli masz je, chciałbym napisać program, który nadpisuje klucz reg lub plik z userinfo na każdym logowaniu i zapytanie własne informacje później – Syberdoor

+0

Świetnie! Działa to bardzo dobrze! – dEVIANT

4

%username% zmienna zawiera ... cóż, nazwa użytkownika.

echo/%username%

EDIT

jak pan powiedział, bo jesteś w zaplanowanego zadania można uzyskać nazwę użytkownika z rejestru systemu Windows

@echo off 
for /f "tokens=3" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData\1 /v LoggedOnUserName') do (
set "user=%%a") 
set "user=%user:.\=%" 
echo/%user% 

Teraz %user% zmienna zawiera zalogowanych Nazwa Użytkownika.

+1

Tak, ale to spowoduje powrót AdminUser, ponieważ jest wykonawcą zaplanowanych zadań. Nawet jeśli w oknach jesteś zalogowany jako TestUser.Próbuję tego, także polecenie whoami :) – dEVIANT

+0

Moja wina, sprawdź edytuj odpowiedź! – Rafael

+1

Nie będzie działać, jeśli istnieją użytkownicy z połączonymi sesjami. Jeśli jednak dEVIANT może orzec ten scenariusz, jest o wiele mniej szalony niż mój pomysł. – Syberdoor

0

Oto szybki sposób tego dokonać za pomocą pliku wsadowego byłoby to polecenie.

for /F "tokens=1,2" %%i in ('qwinsta /server:%COMPUTERNAME% ^| findstr "console"') do set tempVar=%%j 

echo %tempVar% pokaże co użytkownik jest faktycznie zalogowany użytkownik, który nie uruchomił plik wsadowy.