Como verificar quem está atualmente conectado à estação de trabalho do Windows na linha de comando?

37

O ambiente está no domínio, o servidor é o Windows Server 2003, as estações de trabalho têm o Vista e XP instalado.
Eu preciso da maneira de verificar remotamente quem está atualmente conectado à estação de trabalho, de preferência a partir de uma linha de comando simples e sem programas sysinternals ou de terceiros.

obrigado

Andrija
fonte

Respostas:

47

Esta era a fonte original, mas agora é 404:

Eles sugeriram o uso do WMIC (Comando da Interface de Gerenciamento do Windows), disponível no Windows:

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

Retornará o nome de usuário atualmente conectado a xxx.xxx.xxx.xxx ou

WMIC /NODE: "workstation_name" COMPUTERSYSTEM GET USERNAME 

retornará o nome de usuário atualmente conectado ao "workstation_name"

ATUALIZAÇÃO: Isso também deve funcionar no Windows 10 - se você é um administrador na máquina remota.

Preet Sangha
fonte
Quando executo este comando remotamente ou localmente, recebo apenas uma única linha de saída " UserName" com mais nada listado, mesmo estando logado nessa máquina.
Dai
@Dai Você está usando XP ou Vista ou 2003? Esta pergunta foi para aqueles os
Preet Sangha
17

Desculpe, você não percebeu que não deseja usar o Sysinternals.
Agora, essa é uma ferramenta tecnológica da Microsoft, algum motivo específico para não usá-la?
Eu preferi a Sysinternals a outras ferramentas de terceiros antes de Mark Russinovich se mudar para a Microsoft.


O Microsoft Sysinternals Suite possui uma ferramenta chamada Psloggedon ,

psloggedon.exe -l

Há também NBTSTAT ,

nbtstat -a NetBIOS-Computer-NAme
nik
fonte
3
sysinternals é apenas o negócio. Espero que tenham pago a Mark uma tonelada de dinheiro para ir até lá, atualmente não o impediram de fazer o bom trabalho que ele estava fazendo antes e por muito tempo que isso continue.
gbjbaanb 27/06/09
@gbjbaanb, estou feliz com isso. Espero que ele continue atualizando e adicionando à suíte.
nik
11
Isso funcionou maravilhas para mim, enquanto a WMICresposta aceita reclamou que o RPC não estava sendo executado. Essa é uma nova lata de minhocas que eu não sinto vontade de abrir agora, então entrei no psloggedon e estou muito feliz.
Mike S
12

Eu usei win32_loggedonuser, mas ocorreu um problema em que mais de um usuário do domínio foi retornado, portanto não funcionou para meus propósitos. Em vez disso eu usei (no 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
}

o if é porque, às vezes, o proprietário reportará mais de um usuário por algum motivo, não sei por que, mas no meu caso era o mesmo usuário, não havia problema.

MDMoore313
fonte
2
O motivo é que mais de um usuário pode estar logado. A troca rápida de usuário etc. foi introduzida anos atrás. I) t mantém o outro usuário conectado.
TomTom
Good Point @ TomTom, esqueci-me disso, acho que [win32_loggedonuser] também retornaria qualquer um que estivesse com psexec ou powerShell também.
MDMoore313
6

Você pode obter essas informações em win32_loggedonuser.

A partir desta página :

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_
fonte