Пропадает языковая панель в RDP сеансе после завершения теневой сессии
На RDS серверах под Windows Server 2012 R2 / Windows Server 2016 есть довольно старый баг. После того, как администратор или сотрудник техподдержки отключается от RDP сессии пользователя в режиме управления через теневое подключение (shadow), в сеансе пользователя пропадает языковая панель. В итоге пользователь не может переключить язык в своей RDS сессии, горячие клавиши на переключение языка также не работают. Если администратор снова подключится к сессии пользователя – языковая панель опять появляется, при отключении – снова исчезает. Аналогичный баг возникает при Shadow подключении к рабочим станциям с Windows 10 и Windows 8.1.
Как оказалось, эта проблема проявляется только в тех случаях, если администратор инициирует теневое подключение с языковой раскладкой, которая не совпадает с языком системы (Display language) на компьютере пользователя. Т.е. если у пользователя установлен русский интерфейс системы, и к нему подключается админ с русской раскладкой – проблемы нет. Если подключается админ с английской раскладкой – языковая панель при отключении сессии пропадает.
На самом деле языковая панель просто скрывается, т.к. у пользователя удаляется неактивный язык, и система считает, что если у пользователя остался только один язык, то отображать панель переключения между языками не нужно.
Чтобы вернуть языковую панель, на клиенте нужно зайти в Панель управления\Часы, язык и регион\Язык, выбрать любой язык и кнопками Вверх/Вниз переместить его.
Для автоматизации этого действия можно добавить следующий PowerShell скрипт на рабочий стол пользователя:
addlanguage.ps1
$1 = New-WinUserLanguageList en-US
$1.Add(«ru-RU»)
Set-WinUserLanguageList $1 -force
В общем получается ручной костыль да еще и с ручным приводом.
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.
Нам нужно привязать задание планировщика к этому событию (пункт 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.
Таким образом, после того, как администратор отключает теневое сессию к пользователю, в системе срабатывает триггер по событию 20507 и из-под пользователя автоматически отрабатывает команда добавления языка.
Windows server 2012 r2 пропадает индикатор языка
Общие обсуждения
Все ответы
А какая ОС клиента?
Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется «как есть» без каких-либо гарантий. Не забывайте помечать сообщения как ответы и полезные, если они Вам помогли.
Такая же проблема:
1. Клиенты: Win8.1 (pc), WinCE (thinclient)
2. Сервера: Win2012R2 (обновления последние установлены)
3. Роли: RDS
4. Администраторские машины: Win8.1 (pc).
Воспроизведение проблемы:
1. Пользователи заходят в свой сеанс. Переключение раскладки работает, языковая панель на месте.
2. Администратор цепляется к активному сеансу через команду: mstsc /v:%HOSTNAME% /shadow:%SESSIONID% /control /noconsentprompt
3. Проблема устранена. Администратор закрывает shadow окно и у пользователя исчезает языковая панель + перестают работать горячие клавиши на переключение языка.
Причем и с Remote Assistant такая же проблема. Но это уже касательно Win8.1 (pc). Помог пользователю и он перезаходит.
Может кто-то победил таки проблему?
Благодарю.
Сегодня столкнулся с той же проблемой на боевом терминальном сервере.
Решения нет, но есть уточнение.
Язык пропадает только в том случае, если админ открывал shadow-подключение с раскладкой, которая не совпадает с «display language» пользователя. Причём «display language» админа не важен. «display language» может быть у каждого пользователя свой в его сессии. Проверял на сервере, который изначально устанавливался как English версия и потом доставлялся русский языковой пакет.
Т.е. у пользователя стоит русский интерфейс. Если к нему подключиться с включенной русской раскладкой, то после закрытия shadow языковая панель у него не пропадет.
У пользователя стоит русский интерфейс. Если к нему подключиться с включенной английской раскладкой, то после закрытия shadow языковая панель у него не пропадет.
Пропадает языковая панель у пользователя после выхода из теневой копии RDP
На RDS серверах под Windows Server 2012 R2 / Windows Server 2016 есть довольно старый баг. После того, как администратор или сотрудник техподдержки отключается от RDP сессии пользователя в режиме управления через теневое подключение (shadow) , в сеансе пользователя пропадает языковая панель. В итоге пользователь не может переключить язык в своей RDS сессии, горячие клавиши на переключение языка также не работают. Если администратор снова подключится к сессии пользователя – языковая панель опять появляется, при отключении – снова исчезает. Аналогичный баг возникает при Shadow подключении к рабочим станциям с Windows 10 и Windows 8.1.
Как оказалось, эта проблема проявляется только в тех случаях, если администратор инициирует теневое подключение с языковой раскладкой, которая не совпадает с языком системы (Display language) на компьютере пользователя. Т.е. если у пользователя установлен русский интерфейс системы, и к нему подключается админ с русской раскладкой – проблемы нет. Если подключается админ с английской раскладкой – языковая панель при отключении сессии пропадает.
На самом деле языковая панель просто скрывается, т.к. у пользователя удаляется неактивный язык, и система считает, что если у пользователя остался только один язык, то отображать панель переключения между языками не нужно.
Чтобы вернуть языковую панель, на клиенте нужно зайти в Панель управления\Часы, язык и регион\Язык , выбрать любой язык и кнопками Вверх / Вниз переместить его.
Для автоматизации этого действия можно добавить следующий PowerShell скрипт на рабочий стол пользователя:
$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 .
Нам нужно привязать задание планировщика к этому событию (пункт Attach task to this event ), которое бы запускало скрипт 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.
Таким образом, после того, как администратор отключает теневое сессию к пользователю, в системе срабатывает триггер по событию 20507 и из-под пользователя автоматически отрабатывает команда добавления языка.