Здесь мой стек безопасности Windows/.NET:
- Служба Windows, работающая под управлением локальной системы Windows Server 2003.
- Веб-сайт .NET 3.5, работающий в одном и том же поле, в настройках IIS для рабочих станций по умолчанию (возможно, как пользователь NETWORKSERVICE?)
В моей стандартной среде VS2008 DEV у меня есть этот один метод, который вызывается из приложения ASP.NET, который отлично работает:
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 на компьютере. '.
Почему это происходит и как его исправить?
EDIT:
Ответ ниже, в основном в комментариях, но для уточнения:
- Проблема связана с безопасностью и произошла потому, что учетная запись NETWORKSERVICE не имела достаточных прав на запуск/остановку службы
- Я создал локальную учетную запись пользователя и добавил ее в группу PowerUsers (эта группа имеет почти права администратора).
- Я не хочу, чтобы все мое веб-приложение постоянно выдавало себя за этого пользователя, поэтому я олицетворяю только метод, в котором я манипулирую службой. Я делаю это, используя следующие ресурсы, чтобы помочь мне сделать это в коде:
статья MS KB и это, просто чтобы получить лучшее понимание
ПРИМЕЧАНИЕ: Я не выдаю себя за помощью через web.config, я делаю это в коде. См. Статью MS KB выше.