C# 写入事件日志C时System.Security.SecurityException#

C# 写入事件日志C时System.Security.SecurityException#,c#,.net,securityexception,event-viewer,C#,.net,Securityexception,Event Viewer,我的应用程序在C#NET中,部署在不同的机器上。我的应用程序的用户具有正常访问权限(无管理员权限)。在一些系统上,我得到system.Security.SecurityException。它显示“System.Security.SecurityException:未找到源,但无法搜索部分或所有事件日志。无法访问的日志:安全” 我做了一些变通办法:- 在一台机器上,我用管理员权限启动了我的应用程序,它运行良好-没有问题 我在HKEY\U LOCAL\U MACHINE\SYSTEM\Current

我的应用程序在C#NET中,部署在不同的机器上。我的应用程序的用户具有正常访问权限(无管理员权限)。在一些系统上,我得到system.Security.SecurityException。它显示“System.Security.SecurityException:未找到源,但无法搜索部分或所有事件日志。无法访问的日志:安全”

我做了一些变通办法:-

  • 在一台机器上,我用管理员权限启动了我的应用程序,它运行良好-没有问题
  • 我在HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security中添加了用户组。 它工作得很好
  • 我不想去每台机器上做以上的变通方法。我需要任何通用的解决办法,可以应用在所有机器一次。 有什么帮助吗

    写下几行代码:- 配置文件:-

    <add key="E_Source" Value="ABC">
    

    提前感谢

    如果以编程方式写入事件日志,则需要创建具有提升权限的事件源,如EventLog类文档中所述:


    如果以编程方式写入事件日志,则需要创建具有提升权限的事件源,如EventLog类文档中所述:


    要查找要写入的源,.NET枚举所有事件日志。如果它不存在,.NET最终将尝试枚举安全日志,您甚至没有普通用户的读取权限。因此,您会得到一个SecurityException


    因此,您必须确保事件日志存在(如果不触发异常,您将无法做到这一点)。通常,您会在安装/安装过程中这样做。然后,在写入时,捕获SecurityException并进行适当的处理(例如,显示无法写入日志的错误消息)。

    要查找要写入的源,.NET枚举所有事件日志。如果它不存在,.NET最终将尝试枚举安全日志,您甚至没有普通用户的读取权限。因此,您会得到一个SecurityException



    因此,您必须确保事件日志存在(如果不触发异常,您将无法做到这一点)。通常,您会在安装/安装过程中这样做。然后,在写入时,捕获SecurityException并进行适当的处理(例如,显示一条无法写入日志的错误消息)。

    我发现只有两个修复程序不需要管理员权限。1) 向应用程序添加证书,并使此证书在您的域上受信任。2) 滚动您自己的记录器并放弃windows事件日志。我想有一个选项3)创建一个只用于记录的特殊域用户帐户,并在特殊用户上下文下执行记录器代码查看我的答案您只需要提升权限即可创建事件源,而不需要写入它。因此,如果您的应用程序有安装程序,但安装程序必须以管理员身份运行,请在此时创建事件源。问题是缺少事件源。解决方案1可以工作,因为作为管理员,.NET只会创建缺少的事件源。解决方案2“有效”,因为你没有例外。但是,由于事件源不存在,因此不会记录任何内容。@sgmoore,Daniel Rose。谢谢你的回复。假设用户(没有管理员权限)尝试安装软件包,它会创建一个新的eventsouce吗?实际上,我只找到了两个不需要管理员权限的修复程序。1) 向应用程序添加证书,并使此证书在您的域上受信任。2) 滚动您自己的记录器并放弃windows事件日志。我想有一个选项3)创建一个只用于记录的特殊域用户帐户,并在特殊用户上下文下执行记录器代码查看我的答案您只需要提升权限即可创建事件源,而不需要写入它。因此,如果您的应用程序有安装程序,但安装程序必须以管理员身份运行,请在此时创建事件源。问题是缺少事件源。解决方案1可以工作,因为作为管理员,.NET只会创建缺少的事件源。解决方案2“有效”,因为你没有例外。但是,由于事件源不存在,因此不会记录任何内容。@sgmoore,Daniel Rose。谢谢你的回复。假设用户(没有管理员权限)尝试安装软件包,它会创建一个新的eventsouce吗?仅供参考,虽然您的答案是有效的,但根据他的原始问题,用户没有管理员权限执行此操作。严格说来,这不是真的。您不需要管理员权限来写入事件日志,但是您需要管理员来创建事件源,这就是为什么这通常作为安装的一部分来完成的原因谢谢。我编辑了答案以反映差异。仅供参考,虽然您的答案是有效的,但根据他的原始问题,用户没有管理员权限这样做。严格来说,这不是真的。您不需要管理员权限来写入事件日志,但是您需要管理员来创建事件源,这就是为什么这通常作为安装的一部分来完成的原因谢谢。我编辑了答案以反映差异。我正在努力理解你的答案。如果事件日志不存在,为什么要寻找它的帮助?@jpmc26我重新制定了我的答案。我正在努力理解你的答案。如果事件日志不存在,为什么要寻找它的帮助?@jpmc26我重新制定了我的答案。
    Public static readonly string E_Source = ConfigManager.GetString("E_Source");
    
    EventLog.writeEntry(E_Source, logtext, logtype);