Назад | Перейти на главную страницу

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

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

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

Спасибо, Мартин

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

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

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

tsdiscon n

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

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

query session

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

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

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

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

где q.bat - это

query session /sm | find "Active"

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

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

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

Я обнаружил, что TSDISCON не удаляет «Отключенные сеансы.

Я заменил TSDISCON на logoff.

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

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

Get-TSSession -ComputerName server1 -State Active | Отключить-TSSession -WhatIf

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

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

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)

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

Полную информацию можно найти Вот.

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

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