Windows のリモートデスクトップで画面を共有してみた

お客様端末を操作する際にWindowsのリモートデスクトップを使用するケースは多々あると思います。ですが、一般的にWindowsのリモートデスクトップは画面を奪ってしまい、どんな操作をしているかお客様が見ることはできないと思われがちですが、
#### 実はWindowsのリモートデスクトップにも画面共有機能があることをご存知でしょうか。
今回はWindowsのリモートデスクトップ画面を共有する手順を実際に行ってみたいと思います。

図の様に接続端末（①）と、操作端末（②）があるとします。
②から①にWindowsリモートデスクトップで接続しつつ、①でも画面が見られる事をゴールとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/0420b3ed-e83b-5159-ecab-57d4a1f5f8a6.png)

通常のWindowsのリモートデスクトップでは下図の様に画面が奪われてしまいますが、設定をすることで共有が可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/363b9fb4-5ed4-a139-00c6-1efb66603523.png)

早速設定を試してみたいと思います。

<font color="RoyalBlue">接続端末（①）の設定</font>

# 1. ネットワーク探索を有効にする
ネットワークとインターネット＞共有の詳細設定をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/f481a0c1-8fa0-18af-ec66-92c1bf4c332a.png)


ネットワーク探索を有効にするをチェックをします。

# 2. グループポリシーを編集する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/af06651a-6c1d-853a-1851-4b50439b8d39.png)

コンピューターの構成＞管理用コンポーネント＞リモートデスクトップサービス＞リモートデスクトップセッションホスト＞接続を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/7d3d0220-1b72-8f40-dc80-0174458ead41.png)

# 3. ユーザーセッションのリモート制御のルールの設定
ここで、プロンプトを表示して、制御を許可する「ユーザーの許可によるフルコントロール」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/613abe9c-86f7-3362-fd6c-86d183512534.png)

# 4. 共有したい画面IDの確認

次に共有したい画面のIDを確認します。
コマンドプロンプトを起動して、「query session」を実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/c5064a37-edfe-74a8-8a5c-a40ef3e3c76f.png)

adminでリモートデスクトップ接続しているセッションがActiveでIDが2であることを確認できます。
Windowsパソコンでデスクトップやラップトップなどでしたら「console」セッションが通常画面共有するIDになります。
これで接続するWindows端末の準備ができました。


<font color="RoyalBlue">操作端末②からの操作</font>

今度は操作端末（②）のパソコンでリモートデスクトップの画面共有をリクエストします。
コマンドプロンプトから以下のコマンドを実行します。

```text:コマンドプロンプト
mstsc /v:192.168.150.29 /prompt /shadow:2 /control
```

コマンドの引数は、実際のコマンドで確認していただくとして、ここで使用しているオプションの意味は下記のとおりです。

/v：[接続先ホスト名 or IPアドレス
/prompt ：接続先に接続許可のプロンプトを表示させる
/shadow：画面共有したいIDを指定する
/control：制御を許可する

その後認証情報画面が表示されます。
接続端末（①）の資格情報を入力して、「OK」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/a20f6174-7628-a4d4-6f12-27ab1b0696d9.png)

接続端末（①）に接続を許可するかのプロンプトが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/fae7c26a-63dc-5ee2-f7a5-a19ad23b048a.png)

「はい」をクリックすると、同じ画面を共有できることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/a8c078cf-59c8-f9bd-fd56-6c4595def33f.png)

これで、リモートデスクトップで画面を共有できることが確認できましたが、ActiveなセッションIDを確認するためにわざわざ接続端末（①）とアクセスしないと確認できないのは不便です。参考までにActiveセッションを取得して、接続するためのスクリプトを以下に示します。

先ほど接続端末①で実行した「query session」は、リモートの端末を指定することができます。
それを応用して、リモートからActiveなセッションIDを取得して接続を行うといったバッチコマンドを書いてみました。それを応用して、リモートからActiveなセッションIDを取得して接続を行うといったバッチコマンドを書いてみました。

```text:コマンドプロンプト
@echo off
setlocal EnableDelayedExpansion
set targetip=192.168.150.29
set username=XXXX
set password=XXXX
set SessionID=

cmdkey/add:%targetip%/user:%username%/pass:%password%

for/f"usebackq delims=%%A in(`query session/server:%targetip%`)do(
 set line=%%A
 set SessionActive=!lien:~48,6!

if"!SessionActive!"=="Active"(
 set SessionID=!line:~45,1!
 )
)
```

これで操作端末（②）から接続端末（①）のアクティブなセッションIDを取得して、自動でリモートデスクトップ接続画面まで処理できます。今回はリモートデスクトップ画面同士でしたが、モニターなどコンソール画面を共有したい場合は、「Console」のセッションIDを指定することでコンソール画面を共有できます。
今回はWindowsのリモートデスクトップ画面を共有する方法を実際に試してみました。