RunとRunOnceのレジストリキーは、どちらもユーザーのログイン時に指定されたプログラムや処理を自動実行する。
Runキーに登録された処理は、ユーザーがログインするたびに毎回実行されるが、RunOnceキーに登録された処理は、一度実行されると、キーから処理が削除される。
今回はRunOnceの挙動をテストしてみた。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
にHello
というエントリを追加した。
ログオン時にtest.txt
がメモ帳で開かれた。
RunOnceキーを確認してみるとHello
のエントリが削除されていた。
このように 基本的にRunOnceキーに登録された処理は一度実行されると削除されるが、スクリプトなどによってRunOnceキーの削除後に、再度同様のRunOnceキーを作成することによって処理を永続化させることが出来る。
以下のバッチファイル test.bat
をHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Hello
に登録した。
@echo off
REM cmd.exe /c test.bat
start notepad.exe C:\Users\user\Desktop\hello.txt
reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce /v Hello /t REG_SZ /d "cmd.exe /c C:\Users\user\Desktop\test.bat"
上記のバッチファイル test.bat
はメモ帳でhello.txt
というファイルを開いた後、自身を再度RunOnceキーに登録する。
RunOnceキーの登録後に再度ログオンしたところ、hello.txt
が開かれてtest.bat
が実行されたのが確認できた。レジストリを確認すると、HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Hello
は健在だった。その後もログオンするたびにhello.txt
が開かれた。
通常ならRunOnceキーは処理が実行されると削除されるが、上記の例ではRunOnceキーに登録されているバッチファイル test.bat
に再度同様のRunOnce\Hello
キーを登録するための命令文 が記述されているため、RunOnce\Hello
キー削除後に再びRunOnce\Hello
キーが作成される。
よってRunOnceキーも使い方次第では永続化メカニズムとして利用できる。
※ただし、参考リンクの末尾にも記載されているがRunOnceキーを常駐化の手段として使用することは推奨されていない。(RunOnceキーに繰り返しエントリーを作成する行為はWindowのセットアップに干渉するため。)
参考
https://docs.microsoft.com/en-us/windows/win32/setupapi/run-and-runonce-registry-keys
>RunOnceキーに登録されているバッチファイル test.bat に再度同様のRunOnce\Helloキーを登録するための命令文 が記述されている
そういうことをしてはいけない、ということが以下に書いてあります。
https://docs.microsoft.com/en-us/windows/win32/setupapi/run-and-runonce-registry-keys
<訳>
これらのキーから実行されるプログラムは、その実行中にキーに書き込んではいけません。これは、キーの下に登録された他のプログラムの実行を妨害することになります。アプリケーションは、RunOnceキーをアプリケーションのセットアップを完了するような一時的な条件でのみ使用する必要があります。アプリケーションは、RunOnceの下で継続的にエントリーを再作成してはなりません。これは、Windowsセットアップに干渉するためです。
コメントありがとうございます。指摘していただいた内容を記事に追記いたしました。