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

8

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

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

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

Мартин
источник
Я обновил свой ответ, включив в него цикл, который будет отключать только активные удаленные сеансы, а не консоль
Кевин Куфал

Ответы:

5

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

FOR /f %%G IN ('query session /sm') DO tsdiscon %%G
Адам Бранд
источник
Это хорошее начало ... но я хочу отключить только сеансы удаленного рабочего стола.
Мартин
4

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

tsdiscon n

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

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

query session

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

Роб Левайн
источник
2

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

Чед Миллер
источник
2

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

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

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

где q.bat

query session /sm | find "Active"

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

Кевин Куфал
источник
1

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

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

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


источник
1

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

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

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

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

Сэм Коган
источник
0

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

shutdown -r -f -m \\computer_to_restart

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

Ник Берарди
источник
Ну ... это идея. Но я не хочу убивать все сессии. Только сеансы удаленного рабочего стола.
Мартин
0

Даже вопрос очень старый, практически нет решений для всех версий без 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).

ГМА
источник