Пропадає мовна панель в 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

Загалом виходить ручної милицю та ще й з ручним приводом.

Порада. Натрапив ще на цікавий параметр реєстру 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, який формує нове завдання планувальника і виконує його у в сеансі користувача.

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 і з-під користувача автоматично відпрацьовує команда додавання мови.