【问题标题】:log4Net eventlog permissions issue using non-administrator account使用非管理员帐户的 log4Net 事件日志权限问题
【发布时间】:2011-12-13 02:15:12
【问题描述】:

这可能不是 SiteCore 本身的问题,但为了完整起见,我已将其包含在内。我使用应用程序池的自定义标识在 IIS7 下运行 sitecore 6.3。我无法让 Sitecore 将其日志记录信息(使用默认的 log4net 设置)写入事件日志。我已经遵循了这里的建议:http://logging.apache.org/log4net/release/faq.html#Why%20doesn%27t%20the%20EventLogAppender%20work?,虽然当我将自定义身份设置为管理员组的成员时它工作正常,但我需要找到一种方法让它在没有这种安全黑客攻击的情况下在生产中工作。

奇怪的是,我有一个 MSI 来安装它(在管理员组成员的帐户下运行)并为我在事件日志中创建正确的注册表项,但尽管如此,我仍然得到当我使用自定义身份(不是管理员成员)运行应用程序时出现以下错误。

log4net:ERROR DOMConfigurator: Could not create Appender [EventLogAppender] of type [log4net.Appender.EventLogAppender]. Reported error follows.
System.Security.SecurityException: Requested registry access is not allowed.
at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable)
at System.Diagnostics.EventLog.GetEventLogRegKey(String machine, Boolean writable)
at System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly)
at System.Diagnostics.EventLog.DeleteEventSource(String source, String machineName)
at log4net.Appender.EventLogAppender.ActivateOptions()
at log4net.Repository.Hierarchy.DOMHierarchyConfigurator.ParseAppender(XmlElement appenderElement)
The Zone of the assembly that failed was:
MyComputer
log4net:ERROR DOMConfigurator: Appender named [EventLogAppender] not found.

我认为我可以将其缩小到注册表权限问题,我授予所有人对以下注册表项和子项的完全权限,但它也不起作用:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog

自定义身份是以下组的成员:

  • 事件日志读取器
  • IIS_USERS
  • 性能监视器用户

我还看到了following question,它似乎在问同样的事情。 Microsoft 文章似乎暗示事件日志中的 ACL 可能存在问题,并提供了有关如何更改 SSDL 的示例,但我宁愿尽可能避免这种情况。

编辑: 我有另一台服务器正在运行,日志被很好地填充。自定义身份是管理员的成员,所以我撤销了它并重新启动,试图故意破坏它,但我不能。两个盒子上的配置相同,并且用于运行创建注册表项的 MSI 的身份相同。已在两者上运行 procmon(在执行 IISReset 并再次启动应用程序池之后)以检查注册表活动。奇怪的是 - 在有效的盒子上,您会在错误的地方(应用程序和不同的自定义事件日志“MyCompany”)获得 477 个名称未找到我的事件源的记录。它正在记录的位置“MyCompany\MyCompany.SiteCore”没有命中。虽然在损坏的盒子上,它似乎确实在请求读取正确的密钥(尽管只有 6 次),但随后您会收到 Log4Net 注册表访问错误。

【问题讨论】:

  • 也许有一些额外的见解:由于某种莫名其妙的原因,我的安装程序随机创建的注册表子项(用于事件日志源名称)在 1 台服务器上消失了。它仍然在 regedit 中(我已经打开但没有刷新),当我点击它时弹出一条消息:“错误打开密钥”:[Keyname] 无法打开。一个错误是阻止此密钥被打开。详细:系统找不到指定的文件。 Log4Net 消息更改为:log4net:ERROR DOMConfigurator: Appender named [EventLogAppender] not found.

标签: iis-7 log4net event-log


【解决方案1】:

据我了解,EventStore 存储在注册表中,因此您只需要对注册表的写入权限即可创建或删除 EventStore。这通常只需要一次,并且大多数应用程序都会在安装过程中创建它,这样应用程序在正常执行期间就不需要以管理员身份运行。

但是您的错误消息(在问题中)包含方法 DeleteEventSource ,我可以从中推断/猜测 EventSource 确实存在但在某些方面是错误的。因此,这可能当前已注册为写入名为 MyCompany 的事件日志,而您现在正尝试将其更改为“MyCompany\MyCompany.SiteCore”,这需要您删除旧的事件源并创建一个新的。

所以听起来您的安装例程正在创建一个与您的应用程序实际使用的事件源不同的事件源。

如果这没有帮助,那么我建议启用internal logging for Log4net(但显然不是事件日志),这可能会为您提供更多信息。

授予注册表项的完全权限是不够的。 根据Microsoft

要在 Windows Vista 及更高版本或 Windows Server 2003 中创建事件源,您必须具有管理权限。

此要求的原因是必须搜索所有事件日志,包括安全性,以确定事件源是否唯一。从 Windows Vista 开始,用户无权访问安全日志;因此,会引发 SecurityException。

从 Windows Vista 开始,用户帐户控制 (UAC) 确定用户的权限。如果您是 Built-in Administrators 组的成员,则会为您分配两个运行时访问令牌:一个标准用户访问令牌和一个管理员访问令牌。默认情况下,您是标准用户角色。要执行访问安全日志的代码,您必须首先将您的权限从标准用户提升为管理员。您可以在启动应用程序时执行此操作,方法是右键单击应用程序图标并指示您要以管理员身份运行。

【讨论】:

  • 我相信这是正确的答案,但我仍在苦苦挣扎。我检查了我的 wix 脚本创建了正确的注册表项,并且在运行 procmon 时它在 \eventlog\CMS\SiteCore 上读取成功(注意,我重命名了源以使其更简单),但它随后尝试查看 \eventlog\ application\sitecore 并说“找不到名称”。 (大概是重复输入检查)。如果您在名为 sitecore 的应用程序中创建另一个源,则会引发 deletesource 错误。但是没有它,我只会读取成功,没有内部诊断失败,事件查看器什么也没有......
  • 只是通过完成这篇文章 - 我们最终确实完成了这项工作。 sgmoore 的答案是正确的——在我们的例子中,它试图删除一个事件源,因为我们已经多次重命名它。彻底清除事件日志中的注册表项,然后重新启动服务器是解决问题的方法。
【解决方案2】:

我认为,与Apache documentation 不同,log4net 确实需要对注册表的写入权限——或者至少在我的情况下是这样。为了证明这一点,我在启动 sitecore 之前在服务器上备份了注册表,并授予了 IIS 管理员权限。果然它开始很好地登录到事件日志,然后当我再次导出注册表以运行差异时,有区别。

我的事件源上的 eventlogmessage 文件的值已从以下位置更新:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll

C:\Windows\Microsoft.NET\Framework64\v2.0.50727\EventLogMessages.dll

所以我认为仅仅手动更改注册表中的这个值就可以了。

但它没有。

所以我在我拥有的两台服务器上运行了 procmon:A=工作的一台,B=故障的一台。果然,在服务器 B 上,我有一行写着: Operation: RegOpenKey, Path: HKLM\System\CurrentControlSet\Services\EventLog, Desired Access:Read/Write, Result: ACCESS DENIED.

我已经使用服务器 A 进行了跟踪,并且在完全相同的位置,使用 Desired Access:Read 请求了密钥。

结论: 似乎不可避免的是,我需要在生产环境中授予我的应用程序池身份管理员权限至少有足够的时间从 log4net 中首次以编程方式执行必要的注册表写入。我不知道为什么管理员;我已尝试为我的自定义应用程序授予注册表中整个事件日志节点的完全权限,但无济于事。它似乎做了一些我无法识别或确定的事情。然后,我将在它开始记录并监视后续安装之后是否会破坏该功能后立即撤销此权限。 (希望不会)。

如果有人对此行为有任何见解,将不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多