🔊

リモートデスクトップの接続で音量を適正値に設定する方法

2022/07/12に公開約3,200字2件のコメント

リモートデスクトップを切断すると音量は保存されない

リモートデスクトップのセッションを切断すると音量(ボリューム)が保存されず、デフォルト値である 100% に戻るのは、リモートオーディオ(≠リモートデスクトップ)の仕様です。 リモートオーディオは、RDP 接続でオーディオのリダイレクトの設定をすることにより生成される仮想デバイスであるため、RDP 接続(再接続)で初期化されるのは妥当なものと考えられます。

いずれにしても、これにより鼓膜に大ダメージを受けたり、周囲に大音量を響かせ精神的ダメージを受けた経験を持つ人は、多いのではないでしょうか。

これは、耳の健康や精神衛生的に良くありませんので、リモートデスクトップへの接続(再接続)時に、音量を設定した値に変更する Tips を紹介します。

リモートデスクトップの接続(再接続)で音量を適正値にする仕組み

これに必要なことは、次の 2 つだけです。

  1. オーディオデバイスの音量を変更する。
  2. リモートデスクトップへの接続(再接続)イベントを検知する。

今回は、これらを、AudioDeviceCmdlets という PowerShell モジュールと、Windows のタスクスケジューラを使って解決します。

PowerShell でオーティオデバイスの音量を変更する

リモートオーディオは、オーディオデバイスの一種ですので、AudioDeviceCmdlets を使って音量を変更できます。

次の PowerShell スクリプトは、AudioDeviceCmdlets をダウンロード・インストールし音量を 20% に設定するまでを行います。 まずは、このスクリプトが正しく動作することを確認して下さい。

volume20.ps1
If (! (Get-Module -Name "AudioDeviceCmdlets" -ListAvailable)) {
    $url='https://github.com/frgnca/AudioDeviceCmdlets/releases/download/v3.0/AudioDeviceCmdlets.dll'
    $location = ($profile | split-path)+ "\Modules\AudioDeviceCmdlets\AudioDeviceCmdlets.dll"
    New-Item "$($profile | split-path)\Modules\AudioDeviceCmdlets" -Type directory -Force (New-Object System.Net.WebClient).DownloadFile($url, $location)
}

If (! (Get-Module -Name "AudioDeviceCmdlets")) {
    get-module -Name "AudioDeviceCmdlets" -ListAvailable | Sort-Object Version | select -last 1 | Import-Module -Verbose
}

Set-AudioDevice -PlaybackVolume 20

動作確認の手順

  1. PowerShell スクリプトを保存する
    (ここでは volume20.ps1 というファイル名で保存したと仮定)。
  2. コマンドプロンプトで powershell -ExecutionPolicy Bypass volume20.ps を実行する。
  3. 音量が 20% になっていれば成功です。
  4. あとは好みの音量になるように、Set-AudioDevice -PlaybackVolume 20 の数値を調整してください。

リモードデスクトップへの接続(再接続)イベントを検知する

タスクスケジューラで、リモートデスクトップへの接続(再接続)を検知する方法は、3 つ考えられます。

  1. ユーザーセッションへの接続時を利用する。
  2. イベント時を利用し、Desktop Window Manager を監視する。
  3. イベント時を利用し、Microsoft-Windows-TerminalServices-LocalSessionManager/Operational を監視する。

どの方法でも、リモートデスクトップへの接続(再接続)を検知可能です。 しかし、リモートオーディオは、リモートデスクトップへの接続(再接続)時に初期化されるため、音量を変更する PowerShell スクリプトは、その後に動作する必要があります。 この点を考慮すると、『ユーザーセッションへの接続時』と『Desktop Window Manager』は、リモートデスクトップへ接続した直後にトリガーするため、音量の調整に失敗する場合があり、今回の目的にはあっていません。

調査および実験の結果、『Microsoft-Windows-TerminalServices-LocalSessionManager/Operational』のイベントは、リモートオーディオの初期化処理など、RDP プロトコルの初期処理後に発火することが分かりましたので、今回はこれを利用します。

タスクの作り方

  1. タスクスケジューラーを起動し、『新しいタスクの作成』を実行する。

  2. 『全般』タブ

    名前: 任意
    セキュリティオプション:ユーザーがログオンしているときのみ実行する
    
  3. 『トリガー』タブ(2件)

    • 接続イベント
    タスクの開始: イベント時
    設定: 基本
    ログ: Microsoft-Windows-TerminalServices-LocalSessionManager/Operational
    ソース: TerminalServices-LocalSessionManager
    イベントID: 22
    詳細設定: 有効
    
    • 再接続イベント
    タスクの開始: イベント時
    設定: 基本
    ログ: Microsoft-Windows-TerminalServices-LocalSessionManager/Operational
    ソース: TerminalServices-LocalSessionManager
    イベントID: 25
    詳細設定: 有効
    
  4. 『操作』タブ

    操作: プログラムの開始
    プログラム/スクリプト: powershell.exe
    引数の追加: -ExecutionPlicy Bypass volume20.ps
    

    ※ PowerShell スクリプトのパスは、保存したファイルのパスを指定してください。

  5. リモートデスクトップへの接続(再接続)を試して動作を確認する。

まとめ

この仕組みは、RDP クライアントの実装に依存しておらず、PowerShell とタスクスケジューラーの利用を許されている環境であれば動作する、汎用性の高い方法です。

この tips で、多くの人の耳の健康が守られ、精神的苦痛から解放されることを、心から願っています。

Discussion

有用な記事をありがとうございます。
この記事を見て悩む人が少なりますように...
×:ExecutionPlicy
〇:ExecutionPolicy

🫢
ありがとうございます。修正しました。

ログインするとコメントできます