これが私の Windows/.NET セキュリティ スタックです。
- Windows Server 2003 ボックスで LocalSystem として実行されている Windows サービス。
- 「デフォルト」の実動サーバーIIS設定の下で、同じボックスで実行されている.NET 3.5 Webサイト(おそらくNETWORKSERVICEユーザーとして?)
デフォルトの VS2008 DEV 環境では、ASP.NET アプリから呼び出される次の 1 つのメソッドがあり、正常に動作します。
private static void StopStartReminderService() {
ServiceController svcController = new ServiceController("eTimeSheetReminderService");
if (svcController != null) {
try {
svcController.Stop();
svcController.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10));
svcController.Start();
} catch (Exception ex) {
General.ErrorHandling.LogError(ex);
}
}
}
これを本番サーバーで実行すると、ServiceController から次のエラーが発生します。
ソース: System.ServiceProcess -> System.ServiceProcess.ServiceController -> IntPtr GetServiceHandle(Int32) -> System.InvalidOperationException メッセージ: コンピューター '.' で eTimeSheetReminderService サービスを開けません。
なぜこれが起こっているのですか?どうすれば修正できますか?
編集:
答えは以下にあり、主にコメントにありますが、明確にするために:
- この問題はセキュリティ関連であり、NETWORKSERVICE アカウントにサービスを開始/停止するための十分な権限がないために発生しました。
- ローカル ユーザー アカウントを作成し、それを PowerUsers グループに追加しました (このグループにはほぼ管理者権限があります)。
- Web アプリ全体が常にそのユーザーを偽装することは望ましくないため、サービスを操作するメソッドでのみ偽装します。これは、次のリソースを使用してコードで行うのに役立ちます。
注: web.config を介して偽装するのではなく、コードで実行します。上記の MS KB 記事を参照してください。