xrdpでクライアントのキーボード種別を認識させる方法

Linux

はじめに

Linuxサーバにリモートデスクトップで接続するユーザの環境は、日本語キーボード、英語キーボードが混在します。
私が普段使うのは英語キーボードですが、ノートパソコンは日本語キーボードなので、xrdpで正確にキーマップを認識する方法を調べました。

http://xrdp.org/

結論

下記のURLをご参照ください。
ログイン時のIMEの設定で、xrdpに送信されるキー配列が決定します。
osc2016-tokyo-spring-xrdp-keylayout.pdf

英語キーボードを使う場合

・自分しか使わない場合は、km-00000411.iniをkm-00000409.iniで上書きコピーする。
 または、xrdp.iniでキー配列の順番を変更する。

・複数人で使っていて日本語キーボードの使用率が高い場合は、xrdpのキーボード設定を変更せずにリモートデスクトップ接続時にIMEの設定をUSに変更する。
 対策3(成功)をご参照ください。

環境

クライアントはWindowsとMacOS、サーバはLinux(xrdp)です。

- Ubuntu 22.04.1 LTS
- xrdp 0.9.17

- Ubuntu 20.04.2 LTS
- xrdp 0.9.12

- Ubuntu 18.04.3 LTS
- xrdp 0.9.5

- Windows10 Pro 64bit(build:19043.985)
- MacOS v11

キーマップの確認

サーバ(xrdp)でWindowsのキーマップをどのように認識しているかを確認します。
Windowsでリモートデスクトップを使って接続する前にコマンドを実行してログを垂れ流しにします。

sudo tail -f /var/log/xrdp.log

Linuxにログインしてxrdpのログを確認します。
以下、結果の一例です。

[20210316-11:17:59] [INFO ] Cannot find keymap file /etc/xrdp/km-e0010411.ini
[20210316-11:17:59] [INFO ] Loading keymap file /etc/xrdp/km-00000411.ini

初めに「/etc/xrdp/km-e0010411.ini」の読み込みに失敗、次に「/etc/xrdp/km-00000411.ini」をロードしていることが分かります。
「Ctrl + c」でコマンドを終了します。

テスト結果

クライアント(Windows、MacOS)で使用するキーボードの種類に関わらず、日本語OSは411、英語OSは409のキーボード識別コードがサーバに送信されるため、xrdpではクライアントのキーボード種別を判別できません。

結果、日本語OSでは「km-e0010411.ini」または「km-00000411.ini」、英語OSでは「km-e0010409.ini」または「km-00000409.ini」が読み込まれます。

  • Windows(日本語OS + 日本語キーボード) km-e0010411.ini(e0010411)
  • Windows(日本語OS + 英語キーボード) km-e0010411.ini(e0010411)
  • Windows(英語OS + 英語キーボード) km-00000409.ini(409)
  • MacOS(日本語OS + 英語キーボード) km-00000411.ini(411)
  • MacOS(英語OS + 英語キーボード) km-00000409.ini(409)

Windowsのキーボードマップ

Microsoftが提供している資料です。

[MS-RDPBCGR]: Input Capability Set (TS_INPUT_CAPABILITYSET)
The TS_INPUT_CAPABILITYSET structure is used to advertise support for input formats and devices. Thi...

対策1(失敗)

クライアントのWindowsのレジストリエディタで「HKEY_CURRENT_USER\Keyboard Layout\Preload\1」の値を「409」に書き換え、再起動してリモートデスクトップで接続しましたが、残念ながら日本語キーボードとして認識されました。

Webで探すと、この方法で上手くいったという情報がありましたが、Windowsの仕様が変わったのか失敗でした。

対策2(キーボード種別固定)

強制的に英語キーボードとして認識するように設定しました。
以下のように英語のキーボードマップを日本語のキーボードマップにコピーしてxrdpを再起動します。

cd /etc/xrdp

sudo mv km-e0010411.ini km-e0010411.ini-org
sudo cp km-00000409.ini km-e0010411.ini

sudo mv km-00000411.ini km-00000411.ini-org
sudo cp km-00000409.ini km-00000411.ini

sudo service xrdp restart

対策3(成功)

xrdpの設定をインストール時のデフォルトの状態にします。
このとき、日本語OSから接続した場合は、英語または日本語キーボードに関わらず、すべて日本語キーボードとして認識されます。

以下にクライアントで使っている英語キーボードを、サーバ(xrdp)に英語キーボードとして認識させる方法を記載します。

RDPの仕組みとして、クライアントからリモートデスクトップで接続するとき、クライアントで使っているIMEの言語設定の情報をサーバ(xrdp)に送るようです。

Windowsの場合はIMEの言語設定を英語(US)にしてから接続することで、サーバ(xrdp)に英語キーボードとして認識させることができます。
MacOSも同様に言語設定を英語(US)にしてから接続します。
IMEの言語設定を英語(US)にするには、Windowsの言語設定で「英語(米国)」を追加インストールする必要があります。

Windowsの設定(歯車マーク)で、「言語」に英語(米国)を追加します。

また、IMEバーを表示するようにします。

リモートデスクトップで接続する前に、IMEで英語(米国)を選択します。

リモートデスクトップでサーバに接続すると、409コードが送信されて英語キーボードとして認識されます。
このときのログです。

tail -f /var/log/xrdp.log

Comments