HKLMとHKCUのRunとかRunOnce

Windows起動時に実行されるプログラムは

  • 起動方法を自動にしているサービス
  • レジストリの以下エントリ
  • 以下フォルダ内のプログラム
    • C:\Documents and Settings\All Users\スタート メニュー\プログラム\スタートアップ
    • C:\Documents and Settings\All Users\スタート メニュー\プログラム\スタートアップ

という感じでいろいろあるけど、それぞれ起動のタイミングがあるようなのでメモ。
時系列で表すとこんな感じになる。

┌────────┐
│  システム起動 │
└┬───────┘
 |
 | 1. 起動方法を自動にしているサービス
 |
┌┴───────┐
│   ログオン  │
└┬───────┘
 |
 | 2. レジストリ HKLM の Run/RunOnce/RunOnceEx
 |
┌┴───────┐
│  シェルの起動 │
└┬───────┘
 |
 | 3. レジストリ HKCU の Run/RunOnce/RunOnceEx
 ↓ 4. スタートアッププログラム

対話式のプログラムなんかをHKLMのRunにいれちゃう終了するまでシェルがあがってこない。
シェルが絡むようなプログラムはHKCUのRunかスタートアップに入れないとダメぽ。

なので、どうしてもHKLMのRunOnceとかで実行したい対話式のプログラムがある場合は以下のようなバッチでやればいい

@echo off
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce /v exec /t REG_SZ /d 実行するプログラム /f