Как отключить Windows Remote-Desktop с помощью Powershell?


Все наши тестовые ящики работают на виртуальных машинах (windows server 2003/08), и тестировщики получают к ним доступ только через удаленный рабочий стол.

Некоторые шаги по обслуживанию требуют выгнать всех пользователей из системы и отключить доступ через удаленный рабочий стол.

Я начал писать сценарии обслуживания в powershell и ищу способ временно отключить удаленный рабочий стол. Возможно ли это, какие-либо прямые решения для этого?

То, что я пробовал до сих пор:

  • коллега рекомендуется отключить netlogon-сервис, но я могу все еще вход с удаленного рабочего стола.
  • другой коллега рекомендовал отключить блокировку порта для
    remote-рабочий стол с брандмауэром, но как-то это не чувствуется
    прямо ко мне (?) потому что я не хочу менять одну часть системы. воздействовать на другую часть. Я слишком разборчив ... ? ;)

Любые намеки высоко ценятся.

Ура!, Тоби

4 5

4 ответа:

Вам нужно установить

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections 

Значение 1 по умолчанию для отключения удаленного рабочего стола, но требуется перезагрузка.

Еще один способ, который, кажется, не нуждается в перезагрузке (не протестирован):

$ts=get-WMIObject Win32_TerminalServiceSetting  -computername remotemachinename

$ts.SetAllowTSConnections(0)

Теперь я нашел решение, которое идеально подходит для меня. Windows Server 2008 поставляется с функцией под названием "режим слива сервера служб терминалов "

... режим слива сервера TS предотвращает вход новых пользователей на сервер, позволяя пользователям, вошедшим в систему в данный момент, повторно подключиться к существующим сеансам. Ожидая, пока существующие пользователи сохранят свою работу и выйдут из системы, администратор может отключить сервер терминалов для обслуживания, не вызывая данных пользователя. потеря.

Прежде чем активировать режим слива, я удостоверяюсь, что никто не вошел в систему, а затем активирую режим слива следующим кодом:

Invoke-Command -ComputerName myServerHostName -ScriptBlock
{
   Set-ItemProperty -Path "HKLM:\SYSTEM\Currentcontrolset\control\Terminal Server" -Name TSServerDrainMode -Value 1
}

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

Когда я закончу выполнение работ по техническому обслуживанию, я отключу режим слива с "- значением 0", и пользователи смогут снова войти в систему.

Работает как заклинание!


Мой первоначальный ответ был:

Мое усовершенствованное решение, которое я нашел через обширный веб-поиск, выглядит следующим образом (также непроверенное):
$Terminal = Get-WmiObject Win32_Terminal –Computer “ComputerName”
$Terminal.Enable($True)

Другие возможные и интересные фрагменты кода или вариации на эту тему, которые я нашел:

$myWmiObject = Get-WmiObject -namespace “rootCIMV2TerminalServices” -class Win32_Terminal -Computer “ComputerName” -Authentication PacketPrivacy

Или

Set-WmiInstance -namespace “rootCIMV2TerminalServices” -class Win32_Terminal -ComputerName “ComputerName” -Authentication PacketPrivacy -Argument @{fEnableTerminal=0}

Или

Get-WmiObject -ComputerName “ComputerName” -namespace root/cimv2/terminalservices -class Win32_Terminal -Authentication PacketPrivacy

В поисках чего-то еще сегодня утром (по совпадению) я увидел следующее: "Проверка и включение удаленного рабочего стола с помощью PowerShell".

Резюме: включает в себя манипуляции с реестром.

Я часто использую этот код gWmi:

#Remote change logon /disable
$TS_Connector = gwmi Win32_TerminalServiceSetting -N "root/cimv2/terminalservices" -computername $ServerName -Authentication PacketPrivacy
$TS_Connector.Logons=1
$TS_Connector.Put()

И для включения входов

#Remote change logon /enable
$TS_Connector = gwmi Win32_TerminalServiceSetting -N "root/cimv2/terminalservices" -computername $ServerName -Authentication PacketPrivacy
$TS_Connector.Logons=0
$TS_Connector.Put()

Вместо Invoke-command (), потому что nead RCP openned, и RPC connexion отключены по умолчанию в windows