Pasek języka znika w sesji RDP po zakończeniu sesji cienia

Na serwerach RDS w systemie Windows Server 2012 R2 / Windows Server 2016 występuje dość stary błąd. Po rozłączeniu się administratora lub pracownika pomocy technicznej z sesją RDP użytkownika w trybie sterowania za pośrednictwem połączenia w tle panel języka znika w sesji użytkownika. W rezultacie użytkownik nie może zmienić języka w sesji RDS; klawisze skrótu do przełączania języka również nie działają. Jeśli administrator ponownie połączy się z sesją użytkownika, pasek języka pojawi się ponownie, a po rozłączeniu znika ponownie. Podobny błąd występuje, gdy Shadow łączy się ze stacjami roboczymi z Windows 10 i Windows 8.1..

Jak się okazało, ten problem pojawia się tylko wtedy, gdy administrator zainicjuje połączenie typu shadow z układem języka, który nie jest zgodny z językiem systemowym (językiem wyświetlania) na komputerze użytkownika. Tj. jeśli użytkownik ma zainstalowany rosyjski interfejs systemowy i podłączony jest do niego administrator z rosyjskim układem, nie ma problemu. Jeśli podłączony jest administrator z układem angielskim, panel językowy znika po rozłączeniu sesji.

W rzeczywistości pasek języka ukrywa się, ponieważ nieaktywny język jest usuwany od użytkownika, a system uważa, że ​​jeśli użytkownik ma tylko jeden język, nie ma potrzeby wyświetlania panelu przełączania języków.

Aby zwrócić pasek języka, na kliencie musisz przejść do Panel sterowania \ Zegar, język i region \ Język, wybierz dowolny język i przyciski W górę/W dół rusz to.

Aby zautomatyzować tę akcję, możesz dodać następujący skrypt PowerShell na pulpit użytkownika:

addlanguage.ps1

1 USD = New-WinUserLanguageList en-US
1 USD Dodaj („ru-RU”)
Set-WinUserLanguageList $ 1 -force

Ogólnie rzecz biorąc, uzyskuje się ręczne sprzęgło, a nawet z napędem ręcznym.

Wskazówka. Natrafiłem na interesujące ustawienie rejestru IgnoreRemoteKeyboardLayout. Jeśli na serwerze RDS w oddziale HKLM \ System \ CurrentControlSet \ Control \ Keyboard utwórz nowy parametr typu DWORD o wartości 1 (konieczne ponowne uruchomienie), a następnie serwer zacznie ignorować układ klawiatury klienta.

Edytor rejestru systemu Windows w wersji 5.00
[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Keyboard Layout]
„IgnoreRemoteKeyboardLayout” = dword: 00000001

Jednak problem z znikającym paskiem językowym nadal występuje, jeśli układ klawiatury różni się między sesją administratora a sesją terminalową użytkownika.

Spróbujmy zautomatyzować małą kulę. Podczas rozłączania się z sesją cienia użytkownik loguje się w systemie Microsoft -> Windows -> TerminalServices -> RemoteConnectionManager -> Zdarzenie dziennika operacyjnego z „zakończoną sesją kontroli cienia” za pomocą EventId 20507.

Musimy powiązać zadanie harmonogramu z tym zdarzeniem (pozycja Dołącz zadanie do tego wydarzenia), który uruchomiłby skrypt fixlangauge.ps1, który tworzy nowe zadanie dla harmonogramu i wykonuje go w sesji użytkownika.

fixlangauge.ps1

$ User = Get-WinEvent -LogName "Microsoft-Windows-TerminalServices-RemoteConnectionManager / Operational" | Where-Object $ _. ID -eq "20507" | select-object-first 1 | ForEach-Object "$ ($ _. Właściwości [2] .Wartość)"
schtasks.exe / create / RU $ User / IT / TN $ User / TR "powershell.exe -Plik c: \ ps \ addlanguage.ps1" / SC DAILY
schtasks.exe / run / TN $ User
Start-uśpienie-milisekundy 10000
schtasks.exe / Delete / TN $ User / F

Zadanie uruchamia powyższy skrypt PS addlanguage.ps1.

Zatem po tym, jak administrator rozłączy sesję cienia dla użytkownika, wyzwalacz zdarzenia 20507 jest wyzwalany w systemie, a polecenie dodawania języka uruchamia się automatycznie z poziomu użytkownika.