Jak sprawdzić, kto jest aktualnie zalogowany na stacji roboczej Windows z wiersza poleceń?

37

Środowisko jest w domenie, serwer to Windows Server 2003, na stacjach roboczych są zainstalowane Vista i XP.
Potrzebuję sposobu na zdalne sprawdzenie, kto jest aktualnie zalogowany na stacji roboczej, najlepiej z prostej linii poleceń i bez sysinternals lub programów innych firm.

Dzięki

Andrija
źródło

Odpowiedzi:

47

To było oryginalne źródło, ale teraz jest to 404:

Zasugerowali użycie WMIC (Windows Management Interface Command) dostępnego w systemie Windows:

WMIC /NODE: xxx.xxx.xxx.xxx COMPUTERSYSTEM GET USERNAME 

Zwróci nazwę użytkownika aktualnie zalogowanego na xxx.xxx.xxx.xxx lub

WMIC /NODE: "workstation_name" COMPUTERSYSTEM GET USERNAME 

zwróci nazwę użytkownika aktualnie zalogowanego na „nazwa stacji roboczej”

AKTUALIZACJA: Powinno to również działać w systemie Windows 10 - jeśli jesteś administratorem na zdalnym komputerze.

Preet Sangha
źródło
Kiedy uruchamiam to polecenie albo zdalnie, albo lokalnie, otrzymuję tylko jeden wiersz wyniku „ UserName”, ale nic więcej nie ma na liście, mimo że jestem zalogowany na tym komputerze.
Dai
@Dai Używasz XP, Visty lub 2003? To pytanie było dla tych os
Preet Sangha
17

Przepraszamy, nie zauważyłem, że nie chcesz używać Sysinternals.
To jest teraz narzędzie Microsoft Technet, czy jest jakiś konkretny powód, aby go nie używać?
Wolałem Sysinternals od narzędzi innych firm, zanim Mark Russinovich przeniósł się do Microsoft.


Microsoft Sysinternals Suite posiada narzędzie o nazwie Psloggedon ,

psloggedon.exe -l

Istnieje również NBTSTAT ,

nbtstat -a NetBIOS-Computer-NAme
nik
źródło
3
sysinternals to tylko biznes. Mam nadzieję, że zapłacili Markowi mnóstwo pieniędzy, żeby tam pojechać. Obecnie nie powstrzymali go przed wykonaniem dobrej pracy, którą wykonywał wcześniej, i niech to długo potrwa.
gbjbaanb
@ gbjbaanb, cieszę się z tego. Mam nadzieję, że wciąż aktualizuje i dodaje do pakietu.
nik
1
To działało dla mnie cuda, podczas gdy WMICw zaakceptowanej odpowiedzi narzekałem, że RPC nie działa. To nowa paczka robaków, których nie mam ochoty otwierać, więc zameldowałem się w psloggedon i jestem całkiem szczęśliwy.
Mike S
12

Użyłem win32_loggedonuser, ale natknąłem się na problem polegający na zwróceniu więcej niż jednego użytkownika domeny , więc nie działało to dla moich celów. Zamiast tego użyłem (w PowerShell)

#Get Currently logged in user
$ExplorerProcess = gwmi win32_process | where name -Match explorer

if($ExplorerProcess.getowner().user.count -gt 1){
    $LoggedOnUser = $ExplorerProcess.getowner().user[0]
}

else{
    $LoggedOnUser = $ExplorerProcess.getowner().user
}

jeśli jest, ponieważ czasami właściciel z jakiegoś powodu zgłosi więcej niż jednego użytkownika, nie wiem dlaczego, ale w moim przypadku był to ten sam użytkownik, więc nie było problemu.

MDMoore313
źródło
2
Powodem jest to, że może być zalogowany więcej niż jeden użytkownik. Wiele lat temu wprowadzono szybkie przełączanie użytkowników itp. I) t utrzymuje drugiego użytkownika zalogowanego.
TomTom
Dobra uwaga @TomTom, zapomniałem o tym, myślę, że [win32_loggedonuser] zwróciłby również każdego, kto ma psexecd lub powerhell.
MDMoore313
6

Możesz uzyskać te informacje od win32_loggedonuser.

Z tej strony :

strComputer = "."   ' " use "." for local computer

Set objWMI = GetObject("winmgmts:" _
              & "{impersonationLevel=impersonate}!\\" _
              & strComputer & "\root\cimv2")

Set colSessions = objWMI.ExecQuery _
    ("Select * from Win32_LogonSession Where LogonType = 2 OR LogonType = 10")

If colSessions.Count = 0 Then
   Wscript.Echo "No interactive users found"
Else
   For Each objSession in colSessions
     If objSession.LogonType = 2 Then
       WScript.Echo "Logon type: Console"
     Else
       WScript.Echo "Logon type: RDP/Terminal Server"
     End If
     Set colList = objWMI.ExecQuery("Associators of " _
         & "{Win32_LogonSession.LogonId=" & objSession.LogonId & "} " _
         & "Where AssocClass=Win32_LoggedOnUser Role=Dependent" )

     For Each objItem in colList
       WScript.Echo "User: " & objItem.Name
       WScript.Echo "FullName: " & objItem.FullName
       WScript.Echo "Domain: " & objItem.Domain
     Next
     Wscript.Echo "Session start time: " & objSession.StartTime
     WScript.Echo
   Next
End If
HK_
źródło