Сценарии - Как отключить сеансы удаленного рабочего стола?

Я ищу способ закрыть все активные сеансы удаленного рабочего стола на компьютере (локальном компьютере). В Windows есть пара команд (rwinsta, qwinsta и т. Д.) Для просмотра активных сессий, но я не понимаю, как можно легко использовать информацию (если я не разбираю строку...) для закрытия всех сессий.

Есть ли способ в Powershell (или C#, Batch) закрыть все сеансы удаленного рабочего стола на локальном компьютере?

Спасибо мартин

11 ответов

Решение

Вы можете попробовать использовать недокументированное /sm параметр для query session (в пакетном файле), чтобы упростить сортировку:

FOR /f %%G IN ('query session /sm') DO tsdiscon %%G

Да, используя tsdiscon из командной строки:

tsdiscon n

где n должно быть заменено идентификатором сессии.

Вы можете получить номер сеанса от

query session

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

Вы можете использовать утилиту tsdiscon для отключения сеансов. Если вы используете команду "сеансы запроса" из командной строки, вы можете увидеть список идентификаторов, а затем выполнить команду tsdiscon для каждого из них.

Такая циклическая конструкция должна работать

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

где q.bat

query session /sm | find "Active"

Это будет только отключать удаленные сеансы и игнорировать пользователя консоли.

Вы можете проверить расширения сообщества Powershell. Он включает в себя командлеты Get, Stop и Disconnect TerminalSession.

Вы можете использовать модуль PowerShell PSTerminalServices:

http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2010/02/22/psterminalservices-powershell-module-for-terminal-services.aspx

Get-TSSession -ComputerName server1 -State Active | Disconnect-TSSession -WhatIf

Я обнаружил, что TSDISCON не удаляет "Disc" на связанных сеансах.

Я заменил ЦДИСКОН на выход.

Я знаю, что ОП сейчас довольно старый, но он должен делать то, что вы ищете (и, если кто-то еще все еще ищет что-то подобное, я думал, что все равно отвечу).

Точно так же вы могли бы использовать query/reset session на месте 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
)

Вы можете отключить локальные или удаленные сеансы с помощью 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.

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)

Вы не указали, хотите ли вы сделать это без выключения или перезагрузки компьютера. Но если вы не возражаете против перезагрузки или выключения, вы можете просто позвонить:

shutdown -r -f -m \\computer_to_restart

Это фактически приведет к перезагрузке компьютера.

Даже вопрос очень старый, для всех версий без qwinsta / query / tsdiscon решений практически нет, а именно для всех домашних версий Windows.

Однако есть простая версия PowerShell для отключения сеанса:

$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)

Идентификатор сеанса можно получить, например, с помощью getProcesss. Чтобы отключить (не выйти из системы!) Сеанс, используйте $tstType::DisconnectSession("localhost", 2).

Команда TSDiscon отключит сеансы терминальных служб (RDP). Сам по себе отключит текущий сеанс, вы можете указать идентификатор сеанса, который хотите отключить, вы также можете указать имя сервера для отключения.

Полную информацию можно найти здесь.

Другие вопросы по тегам