Вот мой стек безопасности Windows / .NET:
- Служба Windows, работающая как LocalSystem в Windows Server 2003.
- Веб-сайт .NET 3.5, работающий в том же окне с настройками IIS рабочего сервера по умолчанию (так, вероятно, для пользователя NETWORKSERVICE?)
В моей среде разработки VS2008 по умолчанию у меня есть один метод, который вызывается из приложения 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 выше.