remoto remote computer powershell rdp

remoto - windows powershell connect to remote computer



Powershell Cerrar sesiĆ³n remota (9)

Estoy tratando de formular un comando Powershell para desconectar remotamente a un usuario. Tenemos un servidor de terminal con un programa muy inestable que a veces bloquea sesiones. Tenemos que desconectar remotamente a un usuario, pero estoy tratando de escribir una declaración de Powershell que cerrará la sesión de la persona que ejecutó el script. Busqué en Google y encontré este comando:

Invoke-Command -ComputerName MyServer -Command {shutdown -l}

Sin embargo, el comando devuelve "función incorrecta". Puedo ejecutar otros comandos con éxito en los corchetes, como Get-Process.

La idea es que ponga esto en un script que los usuarios puedan ejecutar para desconectarse del servidor (ya que cuando se bloquea, no pueden acceder al menú de inicio o ALT + CTRL + END para hacerlo a través de la GUI).

El flujo sería este: Bob inicia sesión en MyServer a través de RDP, pero su sesión se congela. En su escritorio local, puede ejecutar MyScript (que contiene un comando similar al anterior) que cerrará sesión en MyServer.


Agregar comandos simples de DOS, si alguien tiene tanta inclinación. Sí, esto todavía funciona para Win 8 y Server 2008 + Server 2012.

Query session /server:Server100

Regresará:

SESSIONNAME USERNAME ID STATE TYPE DEVICE rdp-tcp#0 Bob 3 Active rdpwd rdp-tcp#5 Jim 9 Active rdpwd rdp-tcp 65536 Listen

Y para desconectarse de una sesión, use:

Reset session 3 /server:Server100


Aquí hay una gran solución de secuencias de comandos para iniciar sesión personas de forma remota o local. Estoy usando qwinsta para obtener información de sesión y construir una matriz a partir de la salida dada. Esto hace que sea muy fácil iterar a través de cada entrada y desconectar solo a los usuarios reales, y no al sistema o al oyente RDP en sí mismo, que por lo general arroja un error de acceso denegado de todos modos.

$serverName = "Name of server here OR localhost" $sessions = qwinsta /server $serverName| ?{ $_ -notmatch ''^ SESSIONNAME'' } | %{ $item = "" | Select "Active", "SessionName", "Username", "Id", "State", "Type", "Device" $item.Active = $_.Substring(0,1) -match ''>'' $item.SessionName = $_.Substring(1,18).Trim() $item.Username = $_.Substring(19,20).Trim() $item.Id = $_.Substring(39,9).Trim() $item.State = $_.Substring(48,8).Trim() $item.Type = $_.Substring(56,12).Trim() $item.Device = $_.Substring(68).Trim() $item } foreach ($session in $sessions){ if ($session.Username -ne "" -or $session.Username.Length -gt 1){ logoff /server $serverName $session.Id } }

En la primera línea de este script, proporcione $ serverName el valor apropiado o localhost si se ejecuta localmente. Uso esta secuencia de comandos para expulsar a los usuarios antes de que un proceso automatizado intente mover algunas carpetas. Evita los errores de "archivo en uso" para mí. Otra nota, esta secuencia de comandos tendrá que ejecutarse como un usuario administrador, de lo contrario se puede acceder denegado tratando de desconectar a alguien. ¡Espero que esto ayude!


Cierre sesión en todos los usuarios desde una máquina:

try { query user /server:$SERVER 2>&1 | select -skip 1 | foreach { logoff ($_ -split "/s+")[-6] /server:$SERVER } } catch {}

Detalles:

  • el try / catch se usa cuando no hay usuarios en el servidor, y la query devuelve un error. sin embargo, puedes soltar la parte 2>&1 , y eliminar el try / catch si no te importa ver la cadena de error
  • select -skip 1 quita la línea de encabezado
  • el foreach interno foreach sesión de cada usuario
  • ($_ -split "/s+") divide la cadena en una matriz con solo elementos de texto
  • [-6] índice [-6] obtiene la ID de sesión y es la sexta cadena que cuenta desde el reverso de la matriz, debe hacer esto porque la salida de la query tendrá 8 o 9 elementos, dependiendo de si los usuarios se conectaron o desconectaron de la sesión de la terminal.

Dado que estamos en el área de PowerShell, es especialmente útil si podemos devolver un objeto PowerShell adecuado ...

Personalmente me gusta este método de análisis, por la concisión:

((quser) -replace ''^>'', '''') -replace ''/s{2,}'', '','' | ConvertFrom-Csv

Nota: esto no representa a los usuarios desconectados ("discos"), pero funciona bien si solo desea obtener una lista rápida de usuarios y no le importa el resto de la información. Solo quería una lista y no me importaba si estaban actualmente desconectados.

Si te importa el resto de los datos, es un poco más complejo:

(((quser) -replace ''^>'', '''') -replace ''/s{2,}'', '','').Trim() | ForEach-Object { if ($_.Split('','').Count -eq 5) { Write-Output ($_ -replace ''(^[^,]+)'', ''$1,'') } else { Write-Output $_ } } | ConvertFrom-Csv

Doy un paso más y te doy un objeto muy limpio en mi blog.


Esto es oldschool y es anterior a PowerShell, pero he usado el combo qwinsta / rwinsta durante AÑOS para desconectar de forma remota las sesiones de RDP obsoletos. Está integrado al menos en Windows XP y hacia adelante (posiblemente antes)

Determine la ID de la sesión:

qwinsta /SERVER:<NAME>

Eliminar la sesión en cuestión:

rwinsta <SESSION_ID> /SERVER:<NAME>



Puede usar Invoke-RDUserLogoff

Un ejemplo de cierre de sesión de los usuarios de Active Directory de una Unidad organizativa específica:

$users = Get-ADUser -filter * -SearchBase "ou=YOUR_OU_NAME,dc=contoso,dc=com" Get-RDUserSession | where { $users.sAMAccountName -contains $_.UserName } | % { $_ | Invoke-RDUserLogoff -Force }

Al final de la tubería, si intenta usar foreach (%), solo cerrará la sesión de un usuario. Pero usando esta combinación de foreach y pipe:

| % {$ _ | comando}

funcionará como se espera

PD. Ejecutar como Adm.


Quizás sorprendentemente puede cerrar la sesión de los usuarios con el comando de logoff .

C:/> logoff /? Terminates a session. LOGOFF [sessionname | sessionid] [/SERVER:servername] [/V] [/VM] sessionname The name of the session. sessionid The ID of the session. /SERVER:servername Specifies the Remote Desktop server containing the user session to log off (default is current). /V Displays information about the actions performed. /VM Logs off a session on server or within virtual machine. The unique ID of the session needs to be specified.

La ID de la sesión se puede determinar con los qwinsta ( query session ) o quser ( query user ) (ver here ):

$server = ''MyServer'' $username = $env:USERNAME $session = ((quser /server:$server | ? { $_ -match $username }) -split '' +'')[2] logoff $session /server:$server


Modifiqué la respuesta de Casey solo para desconectar sesiones desconectadas haciendo lo siguiente:

foreach($Server in $Servers) { try { query user /server:$Server 2>&1 | select -skip 1 | ? {($_ -split "/s+")[-5] -eq ''Disc''} | % {logoff ($_ -split "/s+")[-6] /server:$Server /V} } catch {} }