На 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 XP проблема.
помню, потому и удивляюсь.
Скажите, а от какой учетной записи выполнять задачу в планировщике?
Задача запускается из-под пользователя. Это важный момент.
При выполнении задачи использовать след. уч. запись пользователя:
BUILTIN\Пользователи
Так?
Нет. Посмотрите внимательно скрипт. Он определяет имя проблемного пользователя и формирует задание, которое запускается именно от учетной записи конкретного пользователя.
Все же не получилось, сделал все как описали, но при выполнении скрипта, подставляется рандомный пользователь, а не тот, от которого я отключился.
Уберите из скрипта строку
schtasks.exe /Delete /TN $User /F
и посмотрите для какого пользователя создалось задание в планировщике.В прошлом году столкнулся с этой же проблемой.
Пришлось повозиться.
Сделал похожий скриптик:
$OldList = Get-WinUserLanguageList
$OldList.Clear()
$OldList.Add("en-US")
Set-WinUserLanguageList $OldList -Force
$OldList.Add("ru-RU")
Set-WinUserLanguageList $OldList -Force
И забыл про эту проблему.
А тут вышла статья). То же решение в принципе.
Не работает этот скрипт, проверяли бы хоть.
Из-за отсутствия ключа /RP запускается в контексте УПРАВЛЯЮЩЕЙ теневой копией, а не управляемой учетки.
Если у тебя и у того, к кому ты через теневое подключаешься через Shadow, на момент подключение выставлена одинаковая раскладка, то при отключении от сессии панель не пропадает.
Так что достаточно перед подключением к пользователю попросить его переключиться на английский язык.
Ха-ха…
Удалось решить такую проблему следующим способом
Заходим в regedit
Открываем ветку: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
В ней создаем Параметр DWORD (32 бита)с именем IgnoreRemoteKeyboardLayout и присваиваем ему значение 1.
Теперь необходимо пере зайти и проверить.
Не работает твой способ с реестром. Windows 10 версия 1903 сборка 18362.175
Комментарий:
Таким способом получается, что мы в любом случае выставляем пользователю английскую раскладку после отключения, даже если до подключения к сеансу пользователь работал в русской раскладке.
Хотел усовершенствовать скрипт, чтобы после отключения выставлять именно ту раскладку, которая была у пользователя в момент подключения.
Но, казалось бы, такой простой вопрос, как определение текущей ВЫБРАННОЙ раскладки в powershell (то, что отображается в трее как RU и EN) поставил в тупик.
Пока гугление ни к чему не привело.
Тот же Get-WinUserLanguageList отображает весь список имеющихся языков. В реестре тоже удалось найти только список.
Как можно получить значение выбранной в данный момент раскладки?
Аналогично…. Мне тоже не удалось найти простой способ определения текущего языка раскладки. Нашел какие-то C# процедуры, но это неудобно.
Помог такой способ:
В окне Язык — Дополнительные параметры — Переопределение метода ввода по умолчанию явным образом указал язык ввода. Панель пропадать перестала. Проверил на нескольких машинах с Win8.1.
Спасибо!
Через GPO на терминальном сервере как раскидать пользователям ?
Наверно проще создать задание планироващика на запуск скрипта в контексте пользователя через Group Policy Preferences — User Configuration -> Preferences -> Control Panel Tasks -> Scheduled Tasks
на windows server 2016 и 2019 работает, скрипты addlanguage.ps1 и addlanguage.ps1 сохранил на диск в «c:\ps\» и в планировщике в действиях написал powershell.exe, а в добавление аргумента -file «C:\ps\fixlangauge.ps1», после отключения от пользователя, запустился скрипт с пометкой «УСПЕХ»
Вы реально предлагаете в продакшине запускать скрипты??? Тоесть 100 баксов за клиент ОС, 3500 за винсервер, по 20 за каждого пользователя и на выходе вместо заплатки\обновления от микрасофта в течении недели мне кулибины из глубинки предлагают запускать скрипты из под пользователя. Я уже не говорю о дырени в безопасности.
Как-то всё это грустно выглядит.
Тут хотя бы решение проблемы есть, а вот проблема с Outlook — это просто жесть… до сих пор глаз дергается после каждого обновления Windows, когда то письма не отправляет, то зависает, то вместо русских букв в письме %%%%%%%%%%%.
Так что этот продукт стоит своих денег)))))
Завтра попробую приатачить задание через евент, но меня терзают смутные сомнения:
Первоначальное задание (fixlangauge.ps1) выполняется под тем пользователем который атачит евент и на этом моменте начинается веселье — запуск только для вошедших пользователей — если я отключился то задание не выполняется — я не в системе, для всех — и тут второй прикол — оно создаёт «c:\ps\addlanguage.ps1» у каждого пользователя… Подключился к одному, а отработало у 30.
Завтра ещё поколдую, но если Вам не сложно угостите парой скриншотов из под кого запускаете и как (cahbemail Gmail com)
Спасибо
Пол дня бился в истерике — КАВЫЧКИ мать их за ногу!!! Только гитлеровские усики, никаких уголков!
Теперь новый прикол — после отработки скрипта первый язык становится основным системным ПО ВСЕМ параметрам — региональные стандарты, язык системы и тд.тп.
Я попробовал поставить бесплатную софтинку Punto Switcher , и вуаля — проблема исчезла.
Я сделал английский языком ввода по умолчанию и перестал пропадать.
У меня другая проблема, но гуглеж ведет именно на решение описанной в статье проблемы. Надеялся в комментах найти ответ. Может кто поможет.
Проблема такая: у меня два монитора, на первом рабочий стол хоста, на втором мониторе открыт удаленный рабочий стол. Когда я переключаюсь на клиент mstsc, то на хосте пропадает индикатор раскладки клавиатуры. Как его сделать чтобы он не пропадал я так и не нагуглил. Вроде бы и ничего страшного, хоть и не приятно. Но когда я работаю на удаленном рабочем столе и на хосте какая-то программа из трея хочет внимания, я тянусь мышью в трей, тыкаю на эту нужную мне иконку, а в этот момент переключения на хост появляется индикатор раскладки клавиатуры и получается что я тыкаю не по тому приложению которое хочу, а на соседнее (правое, так как индикатор раскладки клавиатуры появляется справа, после всех иконок и перед часами).
Как заставить индикатор раскладки не пропадать при работе с удаленным рабочим столом?
Забыл рассказать что нашел немного другое. Выставить в Параметры — Устройства — Ввод — Дополнительные параметры клавиатуры — поставить чекбокс «Использовать языковую панель на рабочем столе, если она доступна». Тогда индикатор раскладки перемещается отдельно от трея, на одну позицию влево в сторону панели задач. И смотрится он там чужеродно. И так же пропадает при переключении на удаленный рабочий стол. Только иконки в трее не сдвигает.
Не пробовали вот такой ключ реестра:
REG ADD «HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layout» /v IgnoreRemoteKeyboardLayout /t REG_DWORD /d 1