Windowsでアプリの自動起動を設定する方法はいくつかありますが、ここでは、タスクスケジューラーを利用して実装してみます。
タスクスケジューラー
こんなやつです。Windows管理ツールの中にいます。
毎日定刻とか、ユーザーのログインといったトリガーで起動して、指定された処理を実行したりするための、Windowsの中核的なサービスの一つです。
これのWin32 APIは、そのままではC#から利用することができないので、まずは、NuGetで公開されているラッパーライブラリをインストールします。
Install-Package TaskScheduler
自動起動の基本形
これを一般ユーザー権限で実行すると、そのユーザーがログインしたときに、そのユーザーの権限で自動起動するタスクが登録されます。
このコードは、UACなしで、一般ユーザー権限で実行できます。
string taskName = "MyTask";
string taskExeFile = "MyTask.exe"; // フルパスで
using ( TaskService ts = new TaskService() ) {
TaskDefinition td = ts.NewTask();
td.RegistrationInfo.Description = "Schedule to run " + taskName;
td.Principal.RunLevel = TaskRunLevel.LUA;
td.Principal.LogonType = TaskLogonType.InteractiveToken;
td.Actions.Add( new ExecAction( taskExeFile ) );
td.Triggers.Add( new LogonTrigger() { UserId = WindowsIdentity.GetCurrent().User.ToString() } );
ts.RootFolder.RegisterTaskDefinition(
taskName,
td,
TaskCreation.CreateOrUpdate,
null,
null,
TaskLogonType.InteractiveToken,
null );
}
管理者権限で起動
6行目、RunLevelを書き換えると、管理者権限で起動するようになります。
このコードは、実行するには管理者権限が必要です。
- td.Principal.RunLevel = TaskRunLevel.LUA;
+ td.Principal.RunLevel = TaskRunLevel.Highest;
誰がログインしても起動
9行目、LogonTriggerオブジェクトに何も指定しなければ、誰がログインしても自動起動するようになります。
このコードは、実行するには管理者権限が必要です。
- td.Triggers.Add( new LogonTrigger() { UserId = WindowsIdentity.GetCurrent().User.ToString() } );
+ td.Triggers.Add( new LogonTrigger() );
誰がログインしても管理者権限で起動
上記二つの合わせ技です。(ソースコードは省略)
このコードは、実行するには管理者権限が必要です。