SSTエンジニアブログ

SSTのエンジニアによるWebセキュリティの技術を中心としたエンジニアブログです。

VPN接続に合わせて自動で壁紙を変更しよう!

こんにちは! イドの中でカエルちゃんサーバーが侵略された原因を探す俺の名前は名ハッカー長谷井戸…じゃなくってCTOの長谷川です!

みなさんの周りでも、新型コロナウイルスへの感染予防から急激に在宅勤務が増えているかと思います。慣れないリモートからの勤務で、会社のサーバーにVPNでつないでいるつもりがつなぎ忘れてたとか、移動中なのでVPN切っておいたほうが通信が安定するのに無駄にVPNつなぎっぱなしだったとかってないですか? たいしたことはない話ですが、小さなうっかりも積もり積もってストレスが溜まりますよね。そんなわけで、今日は少しでも在宅勤務でのストレスを減らせるよう、VPNの接続に合わせて自動でWindowsの壁紙を変更する方法を紹介します。

壁紙を変更するスクリプト

まずは壁紙を変更するスクリプトを準備しましょう。スクリプトはPowerShellで書いています。下記のコードを適当に vpn-wallpaper.ps1 などの名称で保存してください。

弊社では本社、福岡それぞれにVPNの接続先が準備されており、それぞれIPアドレスが 1XX.XXX.XXX.XXX2XX.XXX.XXX.XXX となっています。下記のスクリプトでは、ネットワークのルーティング情報を走査し、VPN接続時のルート情報が含まれていれば、本社側・福岡側どちらに接続されているかを判別し、それぞれに応じて壁紙を指定しています。 また、Windowsでの壁紙の変更は SystemParametersInfo 関数を呼び出すことで実現できます。

$setwallpapersource = @"
using System.Runtime.InteropServices;
public class spi
{
    public const int SetDesktopWallpaper = 20;
    public const int UpdateIniFile = 0x01;
    public const int SendWinIniChange = 0x02;
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern int SystemParametersInfo (int uAction, int uParam, string lpvParam, int fuWinIni);
    public static void SetWallpaper ( string path )
    {
        SystemParametersInfo( SetDesktopWallpaper, 0, path, UpdateIniFile | SendWinIniChange );
    }
}
"@

Add-Type -TypeDefinition $setwallpapersource

$addr =  Get-NetRoute -AddressFamily IPv4 |Where-Object {$_.RouteMetric -eq "0"}|Where-Object {$_.DestinationPrefix -like "*/32"}
if ($addr.DestinationPrefix -eq "1XX.XXX.XXX.XXX/32") {
    # 本社側VPNに接続時の壁紙のファイル名を指定する。
    $wallpaper="C:\path\vpn-tokyo.bmp"
} ElseIf ($addr.DestinationPrefix -eq "2XX.XXX.XXX.XXX/32") {
    # 福岡側VPNに接続時の壁紙のファイル名を指定する。
    $wallpaper="C:\path\vpn-fukuoka.bmp"
} else {
    # VPN未接続時のデフォルトの壁紙のファイル名を指定する。
    $wallpaper="C:\path\no-vpn.bmp"
}
[spi]::SetWallpaper($wallpaper)

ネットワーク接続の変更を検知

スクリプトの準備ができれば、ネットワーク接続の変更時にそのスクリプトが動かせるように設定を行います。このような「イベント発生時に何かの動作を行う」ということをWindowsで実現するには、タスクスケジューラを使用します。

まず、スタートメニューから「タスクスケジューラ」と入力し、タスクスケジューラを起動します。タスクスケジューラを起動させたら右側の「操作」ペインから「タスクの作成」を選択します。

図1 タスクスケジューラ
図1 タスクスケジューラ

「タスクの作成」ウィンドウが表示されたら、「全般」タブの「名前」欄に適当な名称を入力し、「ユーザーがログインしているときのみ実行する」にチェックが入っていることを確認します。

図2 タスクの作成:全般
図2 タスクの作成:全般

次に「トリガー」タブを開き「新規」をクリックして新しいトリガーを作成します。 「新しいトリガー」ウィンドウが開いたら「タスクの開始」で「イベント時」を選択し、「ログ」に「Microsoft-Windows-NetworkProfile/Operational」、「ソース」に「NetworkProfile」を選び、「イベント ID」に「4004」を入力します。また、VPN接続に要する時間に合わせて「遅延時間を指定する」に「10秒間」などを入力します。(ちなみにMicrosoft-Windows-NetworkProfile/OperationalのイベントID 4004は"Network State Change Event"で、その名称どおりネットワーク構成が変更されたときに発生するイベントです)

図3 タスクの作成:トリガー
図3 タスクの作成:トリガー

「トリガー作成」ウィンドウで「OK」をクリックし、「タスクの作成」ウィンドウの「トリガー」タブに戻ってきたら、次は「操作」タブを開き、「新規」をクリックします。 「新しい操作」ウィンドウが開くので、「操作」に「プログラムの開始」を選び「プログラム/スクリプト」に「powershell」、「引数の追加」に「-WindowStyle Hidden -ExecutionPolicy RemoteSigned -File C:\path\vpn-wallpaper.ps1」を入力します。 C:\path\vpn-wallpaper.ps1 は先に作成したPowerShellスクリプトのファイル名です。VPN接続時、切断時に何度かPowerShellスクリプトが繰り返し実行されるのですが、そのときに少しでも目障りにならないよう -WindowStyle Hidden オプションを付けています。

図4 タスクの作成:操作
図4 タスクの作成:操作

「OK」をクリックし「タスクの作成」ウィンドウに戻ってきたら、あと少しです!「条件」タブを表示さ、「コンピューターをAC電源で使用している場合のみタスクを開始する」のチェックを外します。

図5 タスクの作成:条件
図5 タスクの作成:条件

「OK」をクリックし「タスクの作成」ウィンドウを閉じたら準備は完了です。

VPNを接続したり切断したときに壁紙が変更されれば成功です。トリガーの設定で遅延時間を指定したので、VPNの接続や切断から壁紙の変更まで少し時間がかかりますので、このあたりは環境に合わせて適宜調整するといいでしょう。

まとめ

実際にVPNに接続して壁紙を変更したときの画面はこのようになります。これで、どこのイドに入ったVPNに接続したのかわからなくなることもなさそうですね!

図8 VPN接続時の壁紙
図8 VPN接続時の壁紙

本記事が、少しでもみなさんの快適な在宅勤務のお役に立てば幸いです。