Wykryj, kto jest zalogowany na zdalnych komputerach z systemem Windows

9

Jak dowiedzieć się, kto jest zalogowany na zdalnych komputerach z systemem Windows?

Obecnie używam psloggedon , ale daje mi to tylko jeden komputer na raz.

psloggeon \\ 172.21.0.5

psloggedon

Czy istnieje lepszy sposób skanowania całej podsieci? Najlepiej niektóre aplikacje GUI.

Jindrich
źródło

Odpowiedzi:

9

nie GUI, ale:

for /L %x in (2,1,254) do psloggedon \\172.21.0.%x

wykona skanowanie z 172.21.0.2-254. Możesz także zagnieżdżać:

for /L %z in (16,1,31) do for /L %x in (1,1,254)  do psloggedon \\172.21.%y.%x

Spowoduje to przeskanowanie podsieci 172.21. {16-31} .x.

Kevin M.
źródło
Dobrze, ale problem polega na tym, że próbuje każdego adresu IP. Jeśli host nie jest aktywny, to jakby zawieszał się przez około 30 sekund, zanim będzie kontynuowany. Dane wyjściowe są również nieco niechlujne.
Jindrich,
możesz wykonać polecenie ping przeciwko maszynie (ping xxxx -n 1) i sprawdzić jego wynik, w ten sposób limit czasu dla dowolnej maszyny wynosi jedną sekundę dla polecenia ping
benPearce
8

Znalazłem ten skrypt . Skanuje całą domenę i daje ładne wyjście (nazwa komputera i nazwa użytkownika).

whoisloggedinwhere.bat> users.txt

@echo wyłączone
setlocal
for / f "Tokens = 1" %% c in ('net view / domain: "% USERDOMAIN%" ^ | Findstr / L / C: "\\"') do (
 for / f "Tokens = *" %% u in ('PsLoggedOn -L %% c ^ | find / i "% USERDOMAIN% \"') zrobić (
  połączenie: zgłoś %% c "%% u"
 )
)
endlocal
goto: EOF
:raport
ustaw pracę =% 1
ustaw comp =% pracy: ~ 2%
ustaw użytkownika =% 2
ustaw użytkownik =% użytkownik: "=%
zestaw połączeń użytkownik = %% użytkownik: *% USERDOMAIN% \ = %%
@echo% comp%% user%

Ten skrypt używa PsLoggedOn .

Jindrich
źródło
2

Próbować nbtstat -a <computername>

PowerApp101
źródło
Zadałeś 2 pytania. To odpowiada na twoje pierwsze.
PowerApp101
2

Zapisuję nazwę użytkownika we właściwości opisu komputera za pomocą skryptu logowania, który pozwala mi zobaczyć wszystko w AD Użytkownicy i komputery, wyszukiwać i tak dalej. Bardzo przydatny.

Maximus Minimus
źródło
1

Jeśli na serwerach działają Usługi terminalowe, możesz użyć Menedżera usług terminalowych, aby wyświetlić serwery w domenie i kto jest do nich zalogowany. Jest to GUI i można je znaleźć pod

Start -> Administrative Tools -> Terminal Services Manager
Justin Scott
źródło
1

qwinsta to kolejna komenda dos, ale wciąż da ci tylko jedną na raz ...

C:\>qwinsta /server:test_srv
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 console           test_usr                  0  Active  wdcon
 rdp-tcp                                 65536  Listen  rdpwd
Yannone
źródło
1

Możesz wykryć, że użytkownik jest lokalnie zalogowany na stacji roboczej, wysyłając zapytanie do WMI za pomocą następującego skryptu PowerShell. Zwraca nazwę tego, kto jest zalogowany lokalnie lub pusty ciąg.

function logged_in($host_name) {
    (get-wmiobject -class Win32_ComputerSystem -computername $host_name `
        -namespace "root\CIMV2").UserName
}
Michael Steele
źródło
0

Nie jestem pewien, skąd go mam, ale mam ten kod, który pokazuje użytkowników na komputerze. Możesz zawinąć to w każdą pętlę, aby przeskanować kilka komputerów. Powiedziałbym, że jeśli chcesz wiedzieć, kto zalogował się do systemu, najprostszym sposobem jest włączenie kontroli logowania i sprawdzenie (lub zapytanie) dziennika bezpieczeństwa. Oto kod, aby zobaczyć, kto jest włączony w danym momencie:

' PARAMETERS
'
strComputer = "machineName"   ' use "." for local computer 
strUser = "domain\user" ' comment this line for current user
strPassword = "password" ' comment this line for current user

' CONSTANTS
'
wbemImpersonationLevelImpersonate = 3
wbemAuthenticationLevelPktPrivacy = 6

'=======================================================================
' MAIN
'=======================================================================

' Connect to machine
'
If Not strUser = "" Then

    ' Connect using user and password
    '
    Set objLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objWMI = objLocator.ConnectServer _
        (strComputer, "root\cimv2", strUser, strPassword)
    objWMI.Security_.ImpersonationLevel = wbemImpersonationLevelImpersonate
    objWMI.Security_.AuthenticationLevel = wbemAuthenticationLevelPktPrivacy

Else

    ' Connect using current user
    '
    Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 

End If

' Get OS name
'
Set colOS = objWMI.InstancesOf ("Win32_OperatingSystem")

For Each objOS in colOS
    strName = objOS.Name
Next

If Instr(strName, "Windows 2000") > 0 Then

    '-------------------------------------------------------------------
    ' Code for Windows 2000
    '-------------------------------------------------------------------

    ' Get user name
    '
    Set colComputer = objWMI.ExecQuery("Select * from Win32_ComputerSystem")

    For Each objComputer in colComputer
        Wscript.Echo "User: " & objComputer.UserName
    Next

    ' ------------------------------------------------------------------

Else

    ' ------------------------------------------------------------------
    ' Code for Windows XP or later
    ' ------------------------------------------------------------------

    ' Get interactive session
    '
    Set colSessions = objWMI.ExecQuery _ 
          ("Select * from Win32_LogonSession Where LogonType = 2") 

    If colSessions.Count = 0 Then 
        ' No interactive session found
        '
        Wscript.Echo "No interactive user found" 
    Else 
        'Interactive session found
        '
        For Each objSession in colSessions 

            Set colList = objWMI.ExecQuery("Associators of " _ 
            & "{Win32_LogonSession.LogonId=" & objSession.LogonId & "} " _ 
            & "Where AssocClass=Win32_LoggedOnUser Role=Dependent" ) 

            ' Show user info
            '
            For Each objItem in colList 
                WScript.Echo "User: " & objItem.Name 
                WScript.Echo "FullName: " & objItem.FullName 
                WScript.Echo "Domain: " & objItem.Domain 
            Next 

            ' Show session start time
            '
            Wscript.Echo "Start Time: " & objSession.StartTime 
        Next 
    End If 

    ' ------------------------------------------------------------------

End If

'=======================================================================
Jim B.
źródło
0

Dziwię się, że nikt jeszcze nie wspomniał o loggedon2, z którego korzystam od kilku lat. To implementacja GUI, o którą prosiłeś i jest dostępna tutaj .

John Gardeniers
źródło
Po uruchomieniu tego w systemie Windows 7 pojawia się błąd: Błąd - wychodzenie. Nie można znaleźć punktu wejścia dla ServerBrowseDialogA0. Być może nie działa na Win7? Czy potrzebujesz uprawnień administratora, aby uruchomić go bez błędu?
Steve
@ Steve, teraz wiem, dlaczego nikt inny tego nie opublikował. Masz rację, to nie działa na Win 7, przynajmniej na wersji 64-bitowej. Zobaczę, czy mogę skopiować wymagane biblioteki DLL z komputera z systemem XP i uruchomić. Dam ci znać, jeśli odniesie sukces.
John Gardeniers