两个 Web 应用程序,一个写入事件日志时出错

Two web applications, one error when writing to the eventlog

我有两个 ASP.NET Web 应用程序,在这两个应用程序中我都使用 EventLog.WriteEntry 和自定义源名称来将自定义事件写入应用程序日志。

在我的编程机器和网络服务器上,这在一个应用程序中有效,在另一个应用程序中无效 - 我遇到安全异常:

[SecurityException: The source was not found, but some or all event logs could not be searched. Inaccessible logs: Security.]

我想知道为什么会这样,两个 Web 应用程序是相同的(据我所知)。从安全的角度来看,唯一的区别是身份验证模式:一种使用 Forms(Eventlog.WriteEntry 有效),一种使用 Windows(此处无效)。会是这个原因吗?

授予 "everyone" 对应用程序日志的读取权限不会改变此行为。

您在 Windows 身份验证模式上遇到的问题与这些问题基本相似:

System.Security.SecurityException when writing to Event Log

System.Security.SecurityException: The source was not found, but some or all event logs could not be searched. Inaccessible logs: Security.

异常意味着您的网络应用程序试图使用给定的值写入事件日志 "source" 由于相应帐户的权限不足,该值尚未注册。

当使用Windows 身份验证模式执行事件日志任务时,您需要在eventlog\Security 密钥上授予NETWORK SERVICE 帐户的读取权限。以下是这些步骤:

  1. 打开 Regedit(注册表编辑器)。
  2. 转到HKLM\SYSTEM\CurrentControlSet\services\eventlog\Security
  3. 右键单击分支,select "Permissions"。
  4. 点击"Add",找到名为NETWORK SERVICE的RDN或者直接输入,然后添加账号。
  5. 在 "Permissions for Network Service" 下,选中 "Read" 或 "Full Control" 以授予读取权限,然后应用更改。
  6. 在 IIS 主机上重新启动您的应用程序池。

如果还不够,请执行以下操作:

  1. 打开 IIS 管理器。检查 Application Pools 部分的身份列,它应该给出 LocalSystemNetworkService.

  2. 需要更改身份时,右键单击具有Windows身份验证的应用程序池,选择高级设置。

  3. 在进程模型下,将 ApplicationPoolIdentity 更改为 LocalSystemNetworkService,应用您的编辑并重新启动应用程序池。

注意:由于安全漏洞原因,NetworkService 身份比 LocalSystem 更受欢迎。

您也可以尝试在 web.config 文件中设置 <trust level="Full" />,这取决于安全考虑。

如果上述所有解决方案仍然无效,请将开发机器上的 Visual Studio 或 Web 服务器上部署的应用程序设置为 运行 作为管理员权限,获得对 Windows 身份验证的完全访问权限事件记录日志。毕竟,确保应用适当的安全措施取决于您的选择。