C#:简单的Windows服务提供安全例外

我正在通过以下链接进行演练: http : //msdn.microsoft.com/en-us/library/zt39148a%28VS.80%29.aspx

我一点一点地跟着它。 我成功安装了该服务,但是,当我尝试运行它时,会出现以下错误消息:

“MyNewService.Exe [5292]中发生了未处理的exception(”System.Security.SecurityException“)。

我已经看到,对很多人来说,它有效,但有些人得到了这个例外,但我找不到答案。 有没有人有想法? 谢谢。

EventLog.SourceExists方法将导致此exception。 最常见的原因是它尝试访问所有事件日志(包括安全日志),默认情况下,Vista中您没有权限。 另一个原因可能是如果在事件日志中找不到您要查找的源(我发现它很奇怪!)。

解决方法:

bool sourceFound = false; try { sourceFound = EventLog.SourceExists("MySource"); } catch (SecurityException) { sourceFound = false; } 

另一个选择是简单地提升您的权限,但是,当您按照教程逐步执行时,您的服务将在LocalService帐户下运行(同样不具有此特定方法的权限)。 因此,您将在MSDN文档中找到解决方案,以检查ServiceInstaller中是否存在事件源,如果不存在,请在安装程序中创建源。

您是计算机上的本地管理员吗? 如果是这样,请将以下代码行放在Windows服务的构造函数的顶部:

 System.Diagnostics.Debugger.Break(); 

当服务开始运行时,它将点击此断点,允许您跳转到Visual Studio。 然后,您可以从那里进行调试,直到发现exception发生的位置。

去获取Process Monitor的副本并观察会发生什么 – 您应该将问题显示为失败结果并且您可以从那里进行调查……

编辑:澄清一下,它是一个来自microsoft(sysinternals)的免费工具,它在锡上做了它所说的:)

只是一个猜测:您的.exe文件是否位于网络文件夹中? 或被标记为“从互联网下载”? 因为在这种情况下,.NET Framework将为其分配的权限少于直接在本地驱动器上并且未标记为从Internet下载的权限。