Время прочтения
4 мин
Просмотры 120K
Анализируя поступающие заявки наших клиентов в службу технической поддержки и обращения к консультантам, мы заметили, что множество наших клиентов сталкиваются с такой проблемой как «автовыход», не понимая, что это и как с ней бороться.
Любой сервер в том числе и виртуальный сервер должен работать в постоянном режиме 24 х 7 х 365. И соответственно пользователь, который запускает программы на выполнение на сервере, рассчитывает, что они будут работать в таком же режиме. Именно на это и рассчитывают наши клиенты. Однако устанавливая на VPS сервер различного рода десктопное программное обеспечение, которое разрабатывалось «умельцами» без мысли, что существуют компьютеры, не имеющие мониторов, отключившись от сервера через какое-то время замечают, что его программа перестала работать должным образом, при том что сервер активен и доступен. Замечают это как правило при следующем подключении к серверу для анализа данных с как подразумевалось работавшего ПО. Проблема, очевидно в том, что данное ПО что-то пытается брать со свойств экрана (разрешение, позиция курсора и т.д.) при том, что ни экрана, ни курсора при отключенном сеансе нет.
Данная проблема является частным случаем ограничения работы сеансов по времени, за которую отвечает узел групповой политики «Службы удаленных рабочих столов» с одноименным названием «Ограничение сеансов по времени». Он позволяет гибким образом настраивать время работы запущенных сеансов или Ваших сотрудников на сервере при организации рабочих мест, что позволяет Вам более оптимально использовать ресурсы арендуемого сервера Windows VDS.
Запустим на сервере редактор «Локальной групповой политики» нажав сочетание клавиш Win+R и Набрав команду GPEDIT.MSC
Далее необходимо перейти по следующему пути в ветке «Конфигурация пользователя», если Вы хотите произвести настройки для текущего пользователя или в ветке «Конфигурация компьютера», если Вы хотите настроить для всех пользователей сервера.
Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Ограничение сеансов по времени.
Видим, что параметры ограничения по времени не заданы явным образом и настраивать их можно для следующих ситуаций:
- Для отключенных сеансов
- Для активных, но бездействующих сеансов
- Для активных сеансов
- Сеанс RemoteApp
Рассмотрим каждый из них несколько подробнее.
1.«Задать ограничение по времени для отключенных сеансов»
При помощи этого параметра Вы можете указать промежуток времени в минутах, часах или днях, на протяжении которого открытые программы будут продолжать работать после отключения от сервера.
Если Вы хотите, чтобы Ваша программа работала на сервере в постоянном режиме и не происходило «автовыхода» при отключении, то данный параметр следует указать как Включен и выбрать Никогда. Что является решение выше описанной ситуации.
Данный параметр можно так же использовать в моменты, когда рабочий день сотрудника закончен, но на выполнение некоторых автономных процессов, которые не требуют вмешательства пользователя, нужно еще дополнительное время, в таком случае можно указать Включено и указать необходимо количество времени.
2.«Задать ограничение по времени для активных, но бездействующих сеансов служб удалённых рабочих столов»
Бездействующим сеансом считается тот сеанс, когда удаленный рабочий стол начинает простаивать без каких-либо операций ввода, со стороны пользователя. Сотрудник может подключиться к удаленному рабочему столу сервера, а затем по завершении рабочего дня попросту забыть отключиться от сервера и уйти домой. В таком случае сеанс активен, но простаивает и ресурсы выделяемые сервером и зарезервированные для этого пользователя, простаивают и соответственно расходуются не эффективно. В таком случае можно указать Включено и указать необходимо количество времени, после которого при простое, сеанс будет завершен.
3.«Задать ограничение по времени для активных сеансов служб удалённых рабочих столов»
Данный параметр отвечает за завершение даже активного сеанса, скажем если политикой Вашей компании является достаточно строгий контроль рабочего времени и не допускаются переработки. То Вы можете установить это параметр на Включено и указать максимальный период рабочего времени. Соответственно по завершению рабочего дня, сеанс даже активного пользователя будет завершен, но за две минуты до отключения, пользователю будет предоставлено предупреждающее сообщение, чтобы он смог сохранить все выполненные за время подключения изменения и открытые рабочие документы.
Во втором и третьем случае обязательно включение параметра «Завершать сеанс при достижении ограничения по времени». Включение данного параметра указывает, чтобы производилось именно завершение сеанса пользователя, в противном случае будет производится только отключение сеанса, но не его завершение.
4.«Задать предел времени для выхода из сеансов RemoteApp»
Данный параметр позволяет Вам, завершать сеанс в момент, когда Вы не производили подключение к удаленному рабочему столу сервера, но подключение к серверу было установлено при помощи сторонних программ. При закрытии программы, если параметр «Не задан», то сеанс отключается, но не завершается. Для завершения сеанса необходимо указать Включено и установить время, так же доступен параметр «Немедленно».
Когда пользователь со своего компьютера закрывает окно своей RDP/RDS сессии в терминальном клиенте (mstsc.exe, RDCMan или RDP HTML WEB клиенте) простым нажатием по крестику в окне, без выполнения выхода (logoff), его сессия переходит из активного режима в режим disconnected (разъединённый сеанс). В этом режиме все запущенные пользователем программы, открытые документы и окна продолжают работать на удаленном сервере и потреблять ресурсы.
Содержание:
- Автоматическое завершение неактивных RDP сессий в Windows
- Сообщения о превышении длительности RDP сессий
По-умолчанию RDP сессия пользователя в Windows может находится в состоянии disconnected до перезагрузки компьютера или явного ее завершения пользователем или администратором. Это довольно удобно, т.к. пользователь может в любой момент подключиться к своей старой сессии и продолжить работу с запущенными программами и открытыми документами.
На следующем скриншоте видно, что отключенные сессии пользователей на RDS сервере с Windows Server 2019 потребляют около 35% памяти сервера.
Кроме того незавершенные сессии могут блокировать открытые файлы на файловых серверах, вызывать проблемы с корректным сохранением данных в приложениях, профилях или User Profile Disks. Кроме наличие старых RDP сессий часто вызывает проблему блокировки учетной записи пользователей в домене после смены пароля (когда RDS сессии продолжает работать под старыми паролем пользователя).
С помощью команды
quser
можно узнать, когда начата RDP сессия пользователя, длительность простоя и статус сессии.
Также вы можете вывести информацию о длительности сессий пользователей в RDS фермы с помощью PowerShell скрипта (укажите FQDN вашего сервера RDS Connection Broker):
$connectionBrocker = “MSK-RDSMAN.WINITPRO.RU"
Get-RDUserSession -ConnectionBroker $connectionBrocker |select-object -Property CollectionName, HostServer, DomainName, UserName, ServerIPAddress, CreateTime, DisconnectTime, SessionState, IdleTime , SessionID , `
@{Name='SessionAge ([days.]hours:minutes)';Expression={ ((get-date ) - $_.CreateTime) } }
Вы можете настроить максимальную длительность активных, отключенных и простаивающих (без активности пользователя) сессии для Remote Desktop Services.
Автоматическое завершение неактивных RDP сессий в Windows
Для автоматического завершения отключенных RDP/RDS сессий через определенный промежуток времени, вам нужно правильно настроить лимиты (таймауты).
Если у вас развернута полноценная Remote Desktop Services ферма на Windows Server, вы можете настроить параметры таймаутов сессий пользователей в настройках RDS коллекций на вкладке Session.
Укажите время, через которое нужно завершить отключенный сеанс в параметре End a disconnected session (по умолчанию длительность RDP сеанса не ограничена – Never). Также вы можете выставить максимальную длительность активной RDP сессии (Active session limit) и отключение бездействующего сеанса (Idle session limit). Это жесткие таймауты применяются для всех сессий в RDS коллекции.
В Windows Server 2012 R2/2016/2019/22 можно настроить таймауты RDP сессий с помощью групповых политик. Можно использовать как редактор доменных GPO gpmc.msc, так и редактор локальных групповых политик (gpedit.msc) на конкретном RDS сервере ( или на десктопной версии Windows, если вы разрешили к ней множественные RDP подключения).
Параметры таймаутов RDP сессий находятся в разделе GPO Computer Configuration -> Policies -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session Host -> Session Time Limits (Конфигурация компьютера -> Политики -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Ограничение сеансов по времени). Доступны следующие политики таймаутов:
- Set time limit for disconnected session (Задать ограничение по времени для отключенных сеансов);
- Set time limit for active but idle Remote Desktop Services sessions (Задать ограничение времени для активных, но бездействующих сеансов служб удаленных рабочих столов) – политика позволяет завершить простаивающие RDP сессии, в которых отсутствует ввод со стороны пользователя (движение мышкой, ввод символов с клавиатуры);
- Set time limit for active Remote Desktop Services sessions (Задать ограничение по времени для активных сеансов служб удаленных рабочих столов) – максимальный срок для любой (даже активной) RDP сессии пользователя, после которого она переводится в состояние disconnected;
- End Session when time limits are reached (Завершать сеанс при достижении ограничения по времени) – через какое время нужно завершать RDS сессию (logoff) вместо перевода ее в disconnected;
- Set time limit for logoff of RemoteApp sessions (Задать предел для выхода из сеансов RemoteApp).
По умолчанию эти параметры не настроены. Чтобы автоматически завершать отключенные RDP сеансы пользователей через 8 часов, включите политику “Set time limit for disconnected session” = Enabled, и в выпадающем списке выберите 8 часов.
Сохраните изменения и обновите настройки групповых политик в Windows (gpupdate /force). Новые настройки таймаутов будут применяться только к новым RDP сеансам, текущие сеансы придется завершить вручную.
Настройки GPO имеют более высокий приоритет, чем настройки таймаутов в коллекции RDS.
Аналогичные настройки по управлению таймаутами RDP есть в секции GPO с настройками пользователя: User Configuration -> Administrative Templates -> Windows Components. С помощью политики из пользовательской секции вы сможете более гибко настроить группы пользователей с различными лимитами на длительность RDP сессий.
Параметры таймаутов для RDP сессий, которые задаются политиками можно также настроить напрямую через реестр. Указанным выше политикам соответствую следующие DWORD параметры в ветке реестра HKLMACHINESOFTWAREPoliciesMicrosoftWindows NTTerminal Services
- MaxDisconnectionTime
- MaxIdleTime
- MaxConnectionTime
- MaxDisconnectionTime
- RemoteAppLogoffTimeLimit
Например, чтобы установить максимальную продолжительность для отключенной RDP сессии в 15 минут (90000 мс), нужно изменить параметр реестра с помощью такой команды PowerShell:
Set-ItemProperty "HKLM:SOFTWAREPoliciesMicrosoftWindows NTTerminal Services" -Name MaxDisconnectionTime -Type 'DWord' -Value 900000
Также вы можно можете задать ограничение времени RDP сессии на вкладе sessions в свойствах локального (консоль lusrmgr.msc) или доменного пользователя (консоль dsa.msc — ADUC). Здесь доступны следующие параметры:
- End a disconnected session
- Active session limit
- Idle session limit
- When a session limit is reached or connection is broken: Disconnect from session или End Session
- Allow reconnection: From any Client или From originating client only
Не стоит делать таймауты на время RDP сеанса слишком маленькими, иначе сеансы пользователей будут завершаться при малейшей неактивности.
Если у вас развернут RD Gateway Server для доступа к RDS серверам, вы можете настроить отдельные таймауты для пользователей, подключенных через RDGW (откройте политику авторизации подключений и перейдите на вкладку Timeouts).
В Windows Server 2008 R2 также можно было задать лимиты RDP сессий на хосте через специальную консоль tsconfig.msc (RD Session Host Configuration). Достаточно было запустить консоль, щелкнуть правой кнопкой по RDP-Tcp -> Properties. Настройки ограничения длительности сессий находятся на вкладке Sessions. Но в следующих версиях Windows Server эта консоль отсутствует (хотя вы можете вручную скопировать файлы tsadmin.msc и tsconfig.msc и использовать эти консоли и более новых версиях Windows Server).
Сообщения о превышении длительности RDP сессий
После того, как вы настроили политики с таймаутами RDS, пользователи увидит такое сообщение, перед завершением своей сессии:
Idle timer expired Session has been idle over its time limit. It will be disconnected in 2 minutes. Press any key to continue the session.
При этом в логах хоста появляется Event ID 26.
Подробнее о логах RDP подключений. [/aler]
Вы можете отключить это предупреждение, установив в классе WMI Win32_TSSessionSettings значение EnableTimeoutWarning = 0.
Set-WmiInstance -Path "\localhostrootCIMV2TerminalServices:Win32_TSSessionSetting.TerminalName='RDP-Tcp'" -Argument @{EnableTimeoutWarning=0}
Теперь, когда Windows будет автоматически завершать простаивающие RDP сеансы, пользователь получит от RDP клиента такое сообщение:
Your Remote Desktop Services session ended because the remote computer didn’t receive any input from you.
В некоторых случаях вы можете столкнуться с такой ошибкой в RDP клиенте:
Your Remote Desktop Services session has ended. Another user connected to the remote computer, so your connection was lost. Try connecting again, or contact your network administrator.
Это означает, что кто-то другой вошел на компьютер через RDP (когда количество одновременных RDP сессий на компьютере ограничено параметром Limit number of connections, например, в десктопных версиях Windows доступен только один сеанс). Либо вы повторно вошли на удаленных RDP/RDS хост с нового компьютера.
Вы можете разрешить множественные подключения под одним пользователем к RDP хосту с помощью параметра GPO Restrict Remote Desktop Services users to a single Remote Desktop Services session = Disabled (в ветке разделе Computer Configuration -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session Host -> Connections).
можете поделиться как Вы ее решили?
Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется «как есть» без каких-либо гарантий. Не забывайте помечать сообщения как ответы и полезные,
если они Вам помогли.
Да, конечно.
Ситуацию автор описал, так вот. Окружение Workgroup. Windows server 2019
1. В локальной политике (gpedit.msc) по пути:
Конфигурация пользователяАдминистративные шаблоныКомпоненты WindowsСлужбы удаленных рабочих столовУзел сеансов удаленных рабочих столовОграничение сеансов по времени
(User ConfigurationAdministrative TemplatesWindows ComponentsRemote Desktop ServicesRemote Desktop Session HostSession Time Limits)
выставить параметр Set time limit for active but idle Terminal Services sessions
нужное количество минут (например 10 минут) для
всех пользователей.
Нужно к примеру директору и заместителю ( учетки например Us1 и Us2 ) сессия не завершалась через 10 минут как у всех, а через час или два.
2. Нажимеем пуск+R (run) и набрать mmc.
Открооется консоль и добавить локальную политику. Выбираем File — Add/Remove Snap-in... (скрин1) и выбрать пункт
Group Policy Object Editor и нажать Add(скрин 2). Откроется Следующее окно нажать
Browse... и в след окошке перейти во вкладку Users (скрин3).
Выбрать пользователя Us1 и нажать OK далее Finish и ещё раз
OK.
и тут в консоли mmc появляется политика только для Us1.
Перейдя по пути
Конфигурация пользователяАдминистративные шаблоныКомпоненты WindowsСлужбы удаленных рабочих столовУзел сеансов удаленных рабочих столовОграничение сеансов по времени
(User ConfigurationAdministrative TemplatesWindows ComponentsRemote Desktop ServicesRemote Desktop Session HostSession Time Limits)
Устанавливаем параметр Set time limit for active but idle Terminal Services sessions
нужное количество времени ( для директора (Us1) час )
Когда все нужные параметры отличные от локальной политики для всех выставлены, нажимаете File-Save as и сохранить (я под названием Us1 сохранил) по какому нибудь пути эту политику (Я заранее создал папку Police User и сохранил
туда) что бы в след раз, что то изменить, не добавлять заново эту полиитку в mmc, а по двойному клику сразу открыть её.
Всё. И для заместителя Us2 точно так же повторить со 2 пункта в плоть до сохранения.
А проверить можно это путем gpresult /r в cmd из под пользователя на которого применили иную политику. в списке отобразится примененные политики. (последний скрин )
ps.. Создать группу и туда закинуть нескольких пользователей и потом выбрать группу, что бы для каждого пользователя не делать у меня
не получилось, т.к. в списке только Users, а групп не отображает. Можно только выбрать Non-administrator, привенив на всех неадминов ну и так же только для админов.
-
Изменено
31 октября 2019 г. 11:14
-
Предложено в качестве ответа
Petko KrushevMicrosoft contingent staff, Owner
1 ноября 2019 г. 6:59 -
Помечено в качестве ответа
Petko KrushevMicrosoft contingent staff, Owner
4 ноября 2019 г. 6:52
Настройка лимитов (таймаутов) RDP-сессий на терминальном сервере Windows
Обновлено: 26.01.2021
Опубликовано: 12.06.2017
Тематические термины: терминальный сервер, Windows
По умолчанию, на терминальном сервере RDP-сессия длится до тех пор, пока пользователь ее явно не прервет. В некоторых случаях, это может привести к зависанию профиля или некоторых запущенных приложений.
Рекомендуется задавать лимит на сеансы, по достижении которого принудительно завершать терминальные сессии и выполнять выход пользователя из системы.
Настройка на терминальном сервере
Сессии можно настроить для конкретного сервера в настройках сервера терминалов. Процесс немного отличается в зависимости от версии операционной системы Windows.
Windows 2012 и выше
В диспетчере серверов переходим в службы удаленных рабочих столов:
Переходим в коллекцию, для которой хотим поменять настройки сеанса:
В свойствах коллекции кликаем по Задачи — Изменить свойства:
Переходим в раздел Сеанс и выставляем ограничения:
* где Окончание разъединенного сеанса — время, через которое для пользователей с завершенными сеансами произойдет выход из системы; Ограничение бездействующего сеанса — время, через которое сеанс перейдет в разъединенный, если пользователь в нем не работает (не проявляет никакой активности).
Windows 2008 R2 и ниже
Нажимаем Пуск — Администрирование — Службы удаленных рабочих столов — Конфигурация узла сеансов удаленных рабочих столов:
В разделе «Подключения» дважды кликаем по RDP-Tcp:
На вкладке «Сеансы» ставим галочку Переопределить параметры пользователя и выставляем необходимые лимиты:
* где Завершение отключенного сеанса — время, по достижении которого отключенный сеанс будет завершен, а для пользователя будет выполнен выход; Ограничение бездействующего сеанса — ограничение на сеанс, в котором пользователь не работает.
Настройка через GPO
Если терминальных серверов много или необходимо централизованно задать политику ограничения сессий, можно воспользоваться групповыми политиками Active Directory.
Заходим в консоль управления политиками — создаем политику с любым понятным названием — переходим в настройку созданной политики.
В зависимости от необходимости применять политику к пользователям и/или компьютерам, используем следующие ветки для настройки:
- Конфигурация компьютераПолитикиАдминистративные шаблоныКомпоненты WindowsСлужбы удаленных рабочих столовУзел сеансов удаленных рабочих столовОграничение сеансов по времени
(Computer ConfigurationPoliciesAdministrative TemplatesWindows ComponentsRemote Desktop ServicesRemote Desktop Session HostSession Time Limits) - Конфигурация пользователяПолитикиАдминистративные шаблоныКомпоненты WindowsСлужбы удаленных рабочих столовУзел сеансов удаленных рабочих столовОграничение сеансов по времени
(User ConfigurationPoliciesAdministrative TemplatesWindows ComponentsRemote Desktop ServicesRemote Desktop Session HostSession Time Limits)
* если для пользователей и компьютеров используются отдельные организационные юниты, необходимо создавать политику в соответствующей ветке.
Для настройки выставляем следующие значения:
Параметр | Описание | Значения |
---|---|---|
Завершать сеанс при достижении ограничения по времени (End session when time limits are reached) | Задает глобальную настройку, которая разрешает или запрещает лимиты, в принципе. | Включено — включает режим ограничения сессий (для нашей цели выбираем это значение). Отключено — выключает и запрещает лимиты. Не задано — выключает для политик, но разрешает локальные настройки на сервере. |
Задать ограничение по времени для активных, но бездействующих сеансов служб удаленных рабочих столов (Set time limit for active but idle Terminal Services sessions) | Если пользователь завершил работу с сервером, но не завершил сеанс, можно установить ограничение сессии этим параметром. Таким образом, пользователи, которые не завершают сеанс будут автоматически выкинуты из сессии. | Включено — активируем лимит для бездействующих сеансов (выставляем ее). И в выпадающем списке указываем время бездействия, например 3 часа. Отключено — отключает лимит на бездействующие сессии. Не задано — настройка задается локально на сервере. |
Задать ограничение по времени для отключенных сеансов (Set time limit for disconnected sessions) | Если пользователь отключил сеанс, но не вышел из системы, можно автоматически его разлогинить с помощью этой опции. | Включено — активируем лимит для завершенных сеансов (выставляем ее). И в выпадающем списке указываем время, например 3 часа. Отключено — отключает лимит на завершенные сессии. Не задано — настройка задается локально на сервере. |
Задать ограничение по времени для активных сеансов служб удаленных рабочих столов (Set time limit for active Remote Desktop Services sessions) | Независимо от того, работает пользователь в системе или нет, сервер завершит его сеанс, отправив уведомление за 2 минуты до отключения. | Включено — активируем лимит для активных сеансов. В выпадающем списке необходимо указать время. Данную опцию лучше не применять. С практической точки зрения опция создаст много неудобств. Отключено — отключает лимит на завершенные активные сессии. Не задано — настройка задается локально на сервере. |
Для применения настроек ждем или выполняем команду на сервере:
gpupdate /force
Проверяем, применились ли политики:
gpresult /r
Использование фильтров
Если нам необходимо применить ограничения через политики только для определенных серверов/пользователей, применяем фильтры безопасности.
Для этого создаем группу в Active Directory и добавляем туда нужные серверы (или пользователей).
Проверяем, что нужные нам серверы или пользователи стали членами созданной группы.
а) команда для проверки компьютера:
gpresult /r /scope:computer
б) для пользователя:
gpresult /r /scope:user
Если в созданной группе компьютера/пользователя нет, то:
а) для пользователя выходим из сеанса сервера и подключаемся по новой.
б) на сервере выполняем команды:
klist -lh 0 -li 0x3e7 purge
gpupdate /force
Если в нашей среде Active Directory несколько сайтов, то наши настройки могут появиться на нужном контроллере через несколько минут (как правило, до 15). Если нет возможности ждать, можно форсировать процесс репликации с помощью инструмента «Active Directory — сайты и службы».
Далее при создании групповой политики удаляем группу «Прошедние проверку», которая присутствует по умолчанию:
И добавляем созданную ранее, например:
После настраиваем политику по инструкции выше.
Чтобы проверить, что настройка применилась только у нужным нам объектам, на сервере выполняем команду:
gpresult /r
Как правило, для отключения неактивных и завершения отключенных сессий на серверах сеансов служб удалённых рабочих столов Remote Desktop Session Host в Windows Server 2012 R2 администраторы используют возможности групповых политик домена Active Directory. Однако иногда может возникать потребность в управлении неактивными сеансами по хитрым правилам, которые невозможно уложить в рамки стандартных механизмов GPO или даже GPP. В таких случаях для управления сеансами можно прибегнуть к возможностям PowerShell.
В рассматриваем примере стоит задача организовать управление неактивными сеансами в ферме RD Connection Broker (RDCB) с несколькими серверами RD Session Host (RDSH) исходя из того условия, что все пользователи в ферме RDS делятся на две категории:
- Стандартные пользовали, для которых используются одинаковые правила сессионных таймаутов вне зависимости от каких-либо факторов. Правила :
- Отключение простаивающих сеансов — через 1 час
- Завершение отключённых сеансов — через 2 часа
- Пользователи со специальным режимом сессионных таймаутов, который действует только в определённые дни месяца (с 25 числа каждого месяца по 5 число каждого последующего месяца). В эти дни данная группа пользователей выполняет круглосуточные расчёты, в том числе и в отключенных сеансах, поэтому сессии не должны отключаться. В остальные дни месяца сессионные таймауты применяются по аналогии со стандартными пользователями из п.1.
Отделение пользователей со специальным режимом выполняется с помощью членства в доменной группе безопасности Active Directory.
Пример реализации в виде PS-скрипта RDS-Logoff-Inactive.ps1:
# Требования к модулям PS: ActiveDirectory, RemoteDesktop
#
# Члены специальной группы $SpecialGroup не затрагиваются при отключении
# простаивающих и завершении отключенных сессий в дни месяца из $SpecialDays
# Блок переменных
# $SpecialDays - Дни месяца, в которые члены группы $SpecialGroup не отключаются
# $MaxConnectedInactiveTime - Время простоя в подключенном состоянии, затем отключение сессии (мс)
# $MaxDisconnectedTime - Время простоя с момента отключения сессии (мс)
#
$ConnectionBroker = ""
$SessionHostCollection = "RDCollection1"
$SpecialGroup = "RDS-Extended-Session-Users"
$SpecialDays = @(01,02,03,04,05,25,26,27,28,29,30,31)
$MaxConnectedInactiveTime = 3600000 # 1 час
$MaxDisconnectedTime = 7200000 # 2 часа
$LogFilePath = $($script:MyInvocation.MyCommand.Path).Replace('.ps1','.log')
# Функция загрузки модуля PowerShell
#
Function Load-Module ($MName)
{
$retVal = $true
If (!(Get-Module -Name $MName))
{
$retVal = Get-Module -ListAvailable | Where { $_.Name -eq $MName }
If ($retVal)
{
Try { Import-Module $MName -ErrorAction SilentlyContinue }
Catch { $retVal = $false }
} Else {
Write-Host $MName "Module does not exist. Please check that the module is installed."
}
}
Return $retVal
}
# Функция записи в лог-файл
#
Function WriteLog ($Text)
{
$TimeStamp = (Get-Date).ToString("dd.MM.yyyy HH:mm:ss")
Write-Host $Text
Add-Content $LogFilePath "$($TimeStamp)`t $Text"
}
# Загрузка модулей PowerShell
#
If (!(Load-Module "ActiveDirectory")) {return}
If (!(Load-Module "RemoteDesktop")) {return}
$GroupMembers = Get-ADGroupMember -Identity $SpecialGroup -Recursive
$ToDayIsSpecial = $SpecialDays -contains $(Get-Date -Format dd)
If ($ConnectionBroker -eq "") {
$HAFarm = Get-RDConnectionBrokerHighAvailability
$ConnectionBroker = $HAFarm.ActiveManagementServer
}
$Sessions = Get-RDUserSession -ConnectionBroker $ConnectionBroker -CollectionName $SessionHostCollection
ForEach ($Session in $Sessions) {
# Пропускаем пользователей из специальной группы в специальные дни
#
If ($ToDayIsSpecial -eq $true -and $GroupMembers.SamAccountName -contains $Session.UserName){Continue}
# Пропускаем активные сессии
#
If ($Session.SessionState -eq "STATE_ACTIVE"){Continue}
# Отключаем простаивающие сессии
#
If ($Session.SessionState -eq "STATE_CONNECTED" -and $Session.IdleTime -ge $MaxConnectedInactiveTime) {
Try {
WriteLog "Disconnect RD User: $($Session.UserName) `t Server: $($Session.HostServer) `t Session disconnect time: $($Session.DisconnectTime.ToString("dd.MM.yyyy HH:mm:ss")) `t Idle time: $([TimeSpan]::FromMilliseconds($Session.IdleTime).ToString())"
Disconnect-RDUser -HostServer $Session.HostServer -UnifiedSessionID $Session.UnifiedSessionId -Force -ErrorAction Stop
} Catch {
WriteLog "ERROR! Can't disconnect RD User: $($Session.UserName) `t Server: $($Session.HostServer) `n $($_)"
}
Continue
}
# Завершаем отключенные сессии
#
If ($Session.SessionState -eq "STATE_DISCONNECTED" -and $Session.IdleTime -ge $MaxDisconnectedTime) {
Try {
WriteLog "Logoff RD User: $($Session.UserName) `t Server: $($Session.HostServer) `t Session disconnect time: $($Session.DisconnectTime.ToString("dd.MM.yyyy HH:mm:ss")) `t Idle time: $([TimeSpan]::FromMilliseconds($Session.IdleTime).ToString())"
Invoke-RDUserLogoff -HostServer $Session.HostServer -UnifiedSessionID $Session.UnifiedSessionId -Force -ErrorAction Stop
} Catch {
WriteLog "ERROR! Can't logoff RD User: $($Session.UserName) `t Server: $($Session.HostServer) `n $($_)"
}
}
}
Скрипт не имеет обработки входных параметров, поэтому все исходные данные мы указываем в начале скрипта в блоке переменных. В ходе выполнения скрипт создаёт лог-файл о результатах отключения и завершения сессий в том же каталоге, где размещён сам скрипт.
Скрипт размещаем на каким-нибудь сервере, отличном от серверов RDSH, на которых будет выполняться скриптовая обработка сессий. Например, можно разместить этот скрипт на сервере с ролью RD Connection Broker (RDCB), если эта роль работает на выделенном сервере. Для выполнения скрипта на выбранном сервере потребуется установка PowerShell-модулей RemoteDesktop и ActiveDirectory. Если первый модель уже присутствует на сервере RDCB, то второй можно доустановить PS-командой:
Install-WindowsFeature -Name "RSAT-AD-PowerShell"
Автоматический периодический запуск скрипта можно настроить в Task Scheduler от имени специально созданной сервисной учётной записи Group Managed Service Account (gMSA). Пример того, как создать и установить учётную запись gMSA можно найти в статьях Вики:
- Создание учётных записей MSA и gMSA
- Установка учётных записей MSA и gMSA на серверы
В нашем примере в домене AD создана учётная запись gMSA с именем KOMs-S06$ и установлена на сервере RDCB. Эта учётная запись должна быть включена в локальную группу Administrators на всех серверах RDSH, сессиями которых мы планируем управлять из скрипта. Также учётной записи gMSA на сервере RDCB потребуется дать права на чтение каталога со скриптом и права на запись в файл лога (для этого потребуется предварительно создать пустой лог-файл).
Прежде, чем создавать задание планировщика по запуску скрипта, выполним его проверочный запуск от имени учётной записи gMSA с помощью утилиты PsExec:
PsExec64.exe -i -u KOMs-S06$ -p ~ cmd.exe
Запустив в контексте пользователя gMSA интерпретатор командной строки cmd.exe, попробуем выполнить скрипт:
powershell.exe -NoProfile -command "C:ScriptsRDS-Logoff-Inactive.ps1"
Если скрипт отработал как надо и создал записи в лог-файл об отключенных и завершённых сессиях в ферме RD Connection Broker, выполняем его добавление в планировщик заданий Task Scheduler:
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -command `"C:ScriptsRDS-Logoff-Inactive.ps1`""
$Trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 15) -RepetitionDuration ([System.TimeSpan]::MaxValue)
$SvcUser = New-ScheduledTaskPrincipal -UserID KOMs-S06$ -LogonType Password
Register-ScheduledTask -TaskName "RDS Logoff Inactive Users" -Action $Action -Trigger $Trigger -Principal $SvcUser
Таким образом, задание планировщика каждые 15 минут будет подключаться к ферме RDCB, получать из фермы информацию о всех сессиях пользователей на серверах RDSH и отключать простаивающие и завершать отключенные сессии пользователей.