【问题标题】:Problem when trying to use EventLog.SourceExists method in .NET尝试在 .NET 中使用 EventLog.SourceExists 方法时出现问题
【发布时间】:2011-10-07 19:55:04
【问题描述】:

我正在尝试使用 C# 在我的应用程序中使用事件日志,所以我添加了以下代码

if (!EventLog.SourceExists("SomeName"))
EventLog.CreateEventSource("SomeName", "Application");

EventLog.SourceExists 导致 SecurityException 显示
“未找到源,但无法搜索部分或全部事件日志。无法访问的日志:安全性。”

我在 Windows 7 中以管理员身份运行。

如有任何帮助,将不胜感激。

【问题讨论】:

  • 对我来说似乎工作正常。您是以管理员身份运行 Visual Studio 还是程序输出 (.exe),即右键单击,以管理员身份运行?
  • 我没有以管理员身份运行 Visual Studio。我想这就是问题所在。以管理员身份运行 .exe 应用程序也可以解决问题。

标签: c# .net


【解决方案1】:

这是一个权限问题 - 您应该授予正在运行的用户读取以下注册表项的权限:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog

您也可以绕过CreateEventSource,无需访问此注册表项。

以下线程中更详细地解释了这两种解决方案 - How do I create an Event Log source under Vista?

【讨论】:

    【解决方案2】:

    是的,这是一个权限问题,但实际上比当前接受的答案更糟糕。实际上有 2 个部分。

    第 1 部分

    为了使用SourceExists(),运行您的代码的帐户必须对HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog 键具有“读取”权限并且它还必须对每个帐户都具有“读取”权限后代键。问题是该密钥的 一些 子项不继承权限,并且只允许一部分帐户读取它们。例如。我知道的一些:

    • 安全性
    • 状态
    • 虚拟服务器

    因此,您还必须手动更改这些当它们存在时

    仅供参考,对于那些即使管理员帐户也没有“完全访问”权限的键(例如“状态”),您必须使用 PsExec/PsExec64 来“修复”问题。如此StackOverflow answer 所示,下载PsTools。从提升的命令提示符运行此命令:PsExec64 -i -s regedit.exe,您将能够将所需的权限添加到该密钥。

    第 2 部分

    为了成功使用CreateEventSource(),运行您的代码的帐户必须对HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog 具有“完全控制”权限,并且对日志具有“完全控制”权限您正在向其中添加新源。

    但是等等,还有更多……

    同样重要的是要知道CreateEventSource()WriteEntry() 都调用SourceExists()“在幕后”。所以最终,如果你想在 .Net 中使用 EventLog 类,你必须在注册表中更改权限。该帐户需要“完全控制”HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog 键和“读取”所有子项。

    评论:而且我相信所有这些混乱都是因为当微软最初设计事件日志时,他们认为人们能够通过“源”记录某些东西而无需知道什么是至关重要的记录“来源”的使用情况。

    【讨论】:

      【解决方案3】:

      小提示:

      在服务安装期间注册了一个事件源(如果应用程序是 Windows 服务),并且可以在没有安全异常的情况下与低配置进程所有者(非管理员)一起使用

      我以 SO/MSDN 的典型方式使用 C# 代码执行服务安装/运行

      重要的是 ServiceName 类中的属性 System.ServiceProcess.ServiceBase

      【讨论】:

      • 为什么或如何ServiceName 是一个重要的属性?它是否也用作事件日志源名称?
      • 从普通应用程序创建新的“事件源”可能会被权限系统等阻止。我猜在安装过程中这个事件源被神奇地创建了(???)
      • @JacekCz ServiceInstaller 的类构造函数将EventLogInstaller 添加到其内部.Installers 集合中。这个“隐藏的”EventLogInstaller 具有与 ServiceInstaller.ServiceName 相同的 Source 值。
      • 关于此的三个附加说明- 1) 如果安装没有以足够的权限完成,日志源的自动创建仍然会失败。 2) 用于创建日志源的自动生成代码始终使用应用程序日志,因此您必须修改自动生成的代码,或者如果您想为您的服务使用自定义日志,请添加代码(我们这样做是为了避免潜在的混乱的应用程序日志)。 3) 一个日志源只能与一个日志关联,因此如果您同时使用应用程序日志和自定义日志,则必须注册两个独立且唯一的日志源。
      【解决方案4】:

      下午好, 最简单的就是你以管理员身份运行vs2019,所以在调试或执行服务时,它会正常运行,不会产生异常。

      【讨论】:

      • 哎呀。我希望有更好的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      相关资源
      最近更新 更多