Как проверить, кто в данный момент вошел в рабочую станцию ​​Windows из командной строки?

37

Среда находится в домене, сервер - Windows Server 2003, на рабочих станциях установлены Vista и XP.
Мне нужен способ удаленной проверки того, кто в данный момент вошел на рабочую станцию, желательно из какой-то простой командной строки и без sysinternals или сторонних программ.

Благодарность

Андрия
источник

Ответы:

47

Это был первоисточник, но теперь это 404:

Они предложили использовать WMIC (команда интерфейса управления Windows), которая доступна в Windows:

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

Вернет имя пользователя, в данный момент зарегистрированного в xxx.xxx.xxx.xxx, или

WMIC /NODE: "workstation_name" COMPUTERSYSTEM GET USERNAME 

вернет имя пользователя, в данный момент вошедшего в "имя_ рабочей станции"

ОБНОВЛЕНИЕ: Это должно работать и в Windows 10 - если вы являетесь администратором на удаленной машине.

Прит Сангха
источник
Когда я запускаю эту команду удаленно или локально, я получаю только одну строку вывода " UserName", в которой больше ничего нет, даже если я вошел на эту машину.
Дай
@Dai Используете ли вы XP или Vista или 2003? Этот вопрос был для тех, кто
Preet Sangha
17

Извините, не заметил, что вы не хотите использовать Sysinternals.
Это теперь инструмент Microsoft technet, есть какая-то конкретная причина не использовать его?
Я предпочел Sysinternals другим сторонним инструментам до того, как Марк Руссинович перешел в Microsoft.


Microsoft Sysinternals Люкс имеет инструмент под названием PsLoggedOn ,

psloggedon.exe -l

Также есть NBTSTAT ,

nbtstat -a NetBIOS-Computer-NAme
Nik
источник
3
sysinternals это просто бизнес. Я надеюсь, что они заплатили Марку кучу денег, чтобы пойти туда, в настоящее время они не помешали ему делать хорошую работу, которую он делал раньше, и долго это может продолжаться.
gbjbaanb
@gbjbaanb, я рад этому. Надеюсь, он продолжает обновлять и добавлять в пакет.
Ник
1
Это творило чудеса для меня, тогда как WMICв принятом ответе жаловался, что RPC не работает. Это новая банка червей, которую я не хочу открывать прямо сейчас, поэтому я зарегистрировался в psloggedon, и я очень счастлив.
Майк С
12

Я использовал win32_loggedonuser, но столкнулся с проблемой, когда было возвращено более одного пользователя домена , поэтому он не работал для моих целей. Вместо этого я использовал (в 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
}

Это потому, что иногда по какой-то причине getowner сообщает о нескольких пользователях, не знаю почему, но в моем случае это был один и тот же пользователь, поэтому это не было проблемой.

MDMoore313
источник
2
Причина в том, что в систему может войти более одного пользователя. Быстрое переключение пользователей и т. Д. Было введено несколько лет назад. I) t держит другого пользователя в системе.
TomTom
Good Point @TomTom, я забыл об этом, я думаю, что [win32_loggedonuser] также вернет любого, кто имеет psexec или powershell'd.
MDMoore313
6

Вы можете получить эту информацию из win32_loggedonuser.

С этой страницы :

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_
источник