C#:简单的Windows服务出现安全异常

13

我正在按照以下链接中的指引进行操作:http://msdn.microsoft.com/en-us/library/zt39148a%28VS.80%29.aspx

我已经完全按照指引逐行实施了。我成功地安装了服务,但在尝试运行时,出现以下错误信息:

"An unhandled exception ("System.Security.SecurityException') occurred in MyNewService.Exe [5292].

我发现对于许多人来说它是可以正常工作的,但有些人会遇到这个异常,尽管我找不到答案。是否有人有想法?谢谢。


你使用的是哪个ID?你是否已经授予它作为服务登录的权限? - serialhobbyist
你有错误消息中发生错误的代码行吗?这将提示异常发生的位置,并让我们给出更具体的答案。 - David
异常抛出于:System.Diagnostics.EventLog.CreateEventSource("MySource", "MyNewLog");异常信息为:“找不到源,但无法搜索某些或所有事件日志。不可访问的日志:安全。” - sbenderli
4个回答

19

EventLog.SourceExists方法将导致此异常。最常见的原因是它尝试访问所有事件日志(包括安全日志),而在Vista中,默认情况下您将无权访问这些日志。另一个原因可能是您要查找的源未在事件日志中找到(我觉得这很奇怪!)。

解决方法:

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

另一个选择是简单地提高您的权限,但由于您按照教程一步一步操作,因此您的服务将在LocalService帐户下运行(这个帐户对于这个特定的方法也没有权限)。因此,在MSDN文档中,您会发现解决方案是检查ServiceInstaller中是否存在事件源,如果不存在,则在安装程序中创建该源。


没问题,我之前也遇到了同样的问题,所以我进行了一些调查,发现这是原因。安装程序似乎能够正常工作的原因是你需要提升权限,这样你就会在那个时候拥有正确的特权。 - James
一个很好的编写安装程序的示例:http://blog.kappasolutions.ca/blog/post/2010/07/04/How-To-Create-a-Custom-Event-Log-in-Windows-7.aspx - Sergio

1

你的机器上是否有本地管理员权限?如果是,将以下代码行放置在你的Windows服务构造函数的顶部:

System.Diagnostics.Debugger.Break();

当服务开始运行时,它会触发此断点,让您可以跳转到Visual Studio。然后您可以从那里进行调试,直到找到异常发生的位置。


0

去下载 Process Monitor 并观察发生了什么 - 你应该会看到问题显示为故障结果,然后你可以从那里进行调查...

编辑:澄清一下,这是微软(Sysinternals)的免费工具,它做了它所说的一切 :)


我按照你的建议做了,但是当我尝试启动服务时,在进程监视器中没有以MyNewService命名的内容显示出来。是否有其他服务在调用它? - sbenderli

0
只是猜测:您的 .exe 文件是否位于网络文件夹中?或者被标记为“从互联网下载”?因为在这些情况下,.NET Framework 会分配比直接放在本地驱动器上且未被标记为从互联网下载时更少的权限。

1
该exe实际上已安装在计算机上。我按照原始的Microsoft页面描述制作了安装程序。 - sbenderli
据我所知,安装程序不会阻止您将服务安装到网络共享文件夹中。也许在2008年有所改变,但我这里没有2008专业版,只有2008 Express(无法构建安装项目)和2005专业版。 - mihi
我已经仔细检查过,安装是本地的,而不是在网络文件夹中。 - sbenderli
在这种情况下,很抱歉,我没有其他的想法:( - mihi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接