Scripting: ¿cómo desconectar las sesiones de Escritorio remoto?

8

Estoy buscando una manera de cerrar todas las sesiones activas de Escritorio remoto en una computadora (computadora local). Windows incluye un par de comandos (rwinsta, qwinsta, etc.) para ver las sesiones activas, pero no veo cómo podría usar fácilmente la información (a menos que analice la cadena ...) para cerrar todas las sesiones.

¿Hay alguna manera en Powershell (o C #, Batch) para cerrar todas las sesiones de Escritorio remoto en una computadora local?

Gracias martin

Martín
fuente
He actualizado mi respuesta para incluir un bucle que sólo se desconectar sesiones remotas activas, no la consola
Kevin Kuphal

Respuestas:

5

Puede intentar usar el /smparámetro no documentado para query session(en un archivo por lotes) para ordenar las cosas más fácilmente:

FOR /f %%G IN ('query session /sm') DO tsdiscon %%G
Adam Brand
fuente
Ese es un buen comienzo ... pero quiero desconectar solo las sesiones de Escritorio remoto.
Martin
4

Sí, usando tsdiscon desde una línea de comando:

tsdiscon n

donde el n debe ser reemplazado con el id de sesión.

Puede obtener el número de sesión de

query session

Dado que dice que desea cerrar todas las sesiones en la computadora local, supongo que deberá tener cuidado con el orden en que lo hace (es decir, cierre la sesión al final).

Rob Levine
fuente
2

Es posible que desee consultar Powershell Community Extensions. Incluye los cmdlets Obtener, Detener y Desconectar TerminalSession.

Chad Miller
fuente
2

Puede usar la utilidad tsdiscon para desconectar sesiones. Si utiliza el comando "consultar sesiones" desde un símbolo del sistema, puede ver la lista de ID y luego emitir un comando tsdiscon para cada uno.

Una construcción en bucle como esta debería funcionar

FOR /f %%G IN ('q.bat') DO tsdiscon %%G

donde q.bat es

query session /sm | find "Active"

Eso solo desconectará las sesiones remotas e ignorará al usuario de la consola.

Kevin Kuphal
fuente
1

Puede desconectar sesiones locales o remotas con tsdiscon.

Disconnects a terminal session.

TSDISCON [sessionid | sessionname] [/SERVER:servername] [/V]

  sessionid           The ID of the session.
  sessionname         The name of the session.
  /SERVER:servername  Specifies the Terminal server (default is current).
  /V                  Displays information about the actions performed.
JasonMArcher
fuente
1

Encontré que TSDISCON no elimina las sesiones conectadas a "Disco".

Reemplacé TSDISCON con cierre de sesión.


fuente
1

Sé que el OP es bastante antiguo ahora, pero esto debería hacer lo que buscas (y en caso de que alguien más esté buscando algo para hacer lo mismo, pensé que respondería de todos modos).

Del mismo modo, podría usar en query/reset sessionlugar de q/rwinsta...

FOR /F %%A IN (computers.txt) DO (
    FOR /f "tokens=2" %%i IN ('qwinsta /SERVER:%%A ^| find /i "disc"') DO ECHO %%i | rwinsta %%i /SERVER:%%A /V
)
Carly
fuente
1

FOR /F %A IN (c:\scripts\ps\computers.txt) DO (FOR /f "tokens=2" %i IN ('qwinsta /SERVER:%A ^| find /i "disc"') **DO if "%i" NEQ "0" ECHO %i** | rwinsta %i /SERVER:%A /V)

Greg
fuente
0

El comando TSDiscon desconectará las sesiones de servicios de terminal (RDP). Si se usa solo, se desconectará la sesión actual, puede especificar el ID de la sesión de la sesión que desea desconectar, también puede proporcionar el nombre del servidor para desconectarse.

Los detalles completos se pueden encontrar aquí .

Sam Cogan
fuente
0

No especificó si desea hacer esto sin apagar o reiniciar la computadora. Pero si no le importa reiniciar o apagar, simplemente puede llamar:

shutdown -r -f -m \\computer_to_restart

Esto forzará un reinicio de la computadora.

Nick Berardi
fuente
Bueno ... esa es una idea. Pero no quiero matar todas las sesiones. Solo las sesiones de escritorio remoto.
Martin
0

Incluso la pregunta es muy antigua, casi no hay soluciones para todas las versiones sin qwinsta / query / tsdiscon, es decir, todas las versiones domésticas de Windows.

Sin embargo, hay una versión fácil de PowerShell para desconectar una sesión:

$code = @'
[DllImport("wtsapi32.dll")]
static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);

[DllImport("wtsapi32.dll")]
static extern void WTSCloseServer(IntPtr hServer);

[DllImport("Wtsapi32.dll")]
static extern bool WTSDisconnectSession(System.IntPtr hServer, int SessionId, bool bWait);

public static void DisconnectSession (String ServerName, int SessionId)
{
    IntPtr serverHandle = WTSOpenServer(ServerName);
    WTSDisconnectSession(serverHandle, SessionId, true);
    WTSCloseServer(serverHandle);
}
'@

$tstType=Add-Type -name Test -MemberDefinition $code -PassThru
#$tstType::DisconnectSession("localhost", 2)

Se puede obtener una identificación de sesión, por ejemplo, con getProcesss. Para desconectar (¡no cerrar sesión!), Use una sesión $tstType::DisconnectSession("localhost", 2).

GMA
fuente