С#: простая служба Windows дает исключение безопасности
Я прохожу по следующей ссылке:
http://msdn.microsoft.com/en-us/library/zt39148a%28VS.80%29.aspx
Я следил за ним точно, по строкам. Я установил службу успешно, однако, когда я пытаюсь запустить ее, появляется следующее сообщение об ошибке:
"Необработанное исключение (" System.Security.SecurityException ") произошло в MyNewService.Exe [5292].
Я видел, что для многих людей это работает, но некоторые люди получают это исключение, хотя я не мог найти ответ. У кого-нибудь есть идея? Спасибо.
Ответы
Ответ 1
Метод EventLog.SourceExists - это то, что вызовет это исключение. Наиболее распространенная причина заключается в том, что он пытается получить доступ ко всем журналам событий (включая журнал безопасности), которые по умолчанию в Vista не будут иметь разрешений. Другая причина может заключаться в том, что источник, который вы ищете, не найден в журнале событий (который я считаю довольно странным!).
Обход:
bool sourceFound = false;
try
{
sourceFound = EventLog.SourceExists("MySource");
}
catch (SecurityException)
{
sourceFound = false;
}
Другим вариантом является просто повысить ваши права, однако, как вы, следуя инструкциям поэтапно, ваша служба будет работать под учетной записью LocalService (которая снова не будет иметь прав для этого конкретного метода). Следовательно, вы найдете в документации MSDN решение проверить, существует ли источник событий в ServiceInstaller, а если нет, создайте источник в установщике.
Ответ 2
Вы локальный администратор на своем компьютере? Если это так, поместите следующую строку кода в начало конструктора службы Windows:
System.Diagnostics.Debugger.Break();
Когда служба начнет работать, она попадет в эту точку останова, что позволит вам перейти в Visual Studio. Затем вы можете отлаживать оттуда, пока не обнаружите, где происходит исключение.
Ответ 3
Пойдите, чтобы получить копию Process Monitor и посмотреть, что происходит - вы должны получить проблему, отображающуюся как результат сбоя, и вы можете исследовать оттуда...
edit: Чтобы прояснить, это бесплатный инструмент от microsoft (sysinternals), и он делает то, что он говорит на жесте:)
Ответ 4
Просто догадаться: Ваш .exe файл лежит в сетевой папке? Или отмечен как "загруженный из Интернета"? Поскольку в этом случае .NET Framework будет назначать ему меньше разрешений, чем когда он был непосредственно на локальном диске и не помечен как загруженный из Интернета.