Пропадает языковая панель в RDP сеансе после завершения теневой сессии

На RDS серверах под Windows Server 2012 R2 / Windows Server 2016 есть довольно старый баг. После того, как администратор или сотрудник техподдержки отключается от RDP сессии пользователя в режиме управления через теневое подключение (shadow), в сеансе пользователя пропадает языковая панель. В итоге пользователь не может переключить язык в своей RDS сессии, горячие клавиши на переключение языка также не работают. Если администратор снова подключится к сессии пользователя – языковая панель опять появляется, при отключении – снова исчезает. Аналогичный баг возникает при Shadow подключении к рабочим станциям с Windows 10 и Windows 8.1.

Как оказалось, эта проблема проявляется только в тех случаях, если администратор инициирует теневое подключение с языковой раскладкой, которая не совпадает с языком системы (Display language) на компьютере пользователя. Т.е. если у пользователя установлен русский интерфейс системы, и к нему подключается админ с русской раскладкой – проблемы нет. Если подключается админ с английской раскладкой – языковая панель при отключении сессии пропадает.

пропадает языковая панель после отключения shadow подключения

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

Чтобы вернуть языковую панель, на клиенте нужно зайти в Панель управления\Часы, язык и регион\Язык, выбрать любой язык и кнопками Вверх/Вниз переместить его.

переместить языки в панели управления

Для автоматизации этого действия можно добавить следующий PowerShell скрипт на рабочий стол пользователя:

addlanguage.ps1

$1 = New-WinUserLanguageList en-US
$1.Add("ru-RU")
Set-WinUserLanguageList $1 -force

В общем получается ручной костыль да еще и с ручным приводом.

Совет. Наткнулся еще на интересный параметр реестра IgnoreRemoteKeyboardLayout. Если на RDS сервере в ветке HKLM\System\CurrentControlSet\Control\Keyboard создать новый параметр типа DWORD со значением 1 (нужна перезагрузка), то сервер начинает игнорировать раскладку клавиатуры клиента.

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]

"IgnoreRemoteKeyboardLayout"=dword:00000001

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

Попробуем немного автоматизировать костыль. При отключении от теневой сессии пользователя в журнале Microsoft -> Windows -> TerminalServices -> RemoteConnectionManager -> Operational появляется событие с «Shadow Control Session Ended» с EventId 20507.

Событие Shadow Control Session Ended» с EventId 20507.

Нам нужно привязать задание планировщика к этому событию (пункт Attach task to this event), которое бы запускало скрипт fixlangauge.ps1, который формирует новое задание планировщика и выполняет его у в сеансе пользователя.

fixlangauge.ps1

$User=Get-WinEvent -LogName "Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational" | Where-Object {$_.ID -eq "20507"} |select-object -first 1 | ForEach-Object{"$($_.Properties[2].Value)"}
schtasks.exe /create /RU $User /IT /TN $User /TR "powershell.exe -File c:\ps\addlanguage.ps1" /SC DAILY
schtasks.exe /run /TN $User
Start-Sleep -Milliseconds 10000
schtasks.exe /Delete /TN $User /F

В задании запускается указанный выше PS скрипт addlanguage.ps1.

powershell скрипт для вовзрата языковой панели в RDS сеансе

Таким образом, после того, как администратор отключает теневое сессию к пользователю, в системе срабатывает триггер по событию 20507 и из-под пользователя автоматически отрабатывает команда добавления языка.


Предыдущая статья Следующая статья


Комментариев: 31 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)