【问题标题】:Writing to an event log in ASP.NET on Windows Server 2008 IIS7在 Windows Server 2008 IIS7 上的 ASP.NET 中写入事件日志
【发布时间】:2010-10-17 06:24:03
【问题描述】:

我正在尝试使用 log4net 在 Windows Server 2008 SP1 上的 IIS7 下写入客户事件日志。但是,帐户似乎无权写入事件日志。有人有什么建议吗?

【问题讨论】:

标签: asp.net iis iis-7


【解决方案1】:

问题可能是您的事件源。您必须先创建一个事件源,然后才能写入事件日志(如果您不这样做,事件日志对象会在您第一次写入日志时尝试“自动”为您创建一个)。

您必须拥有更高的权限才能创建事件日志源。在我的一些网络应用程序中,我已将用于创建事件源的代码放入我的设置中(设置以管理员身份运行,因此我始终保证能够创建源)。

您只需创建一次源。之后,您的 ASP.Net 应用程序应该有足够的权限来编写指定您创建的源(或源)的条目。

您可以在设置中使用 EventLogInstaller 来创建源,或者您可以编写一个小实用程序以管理员身份调用 EventLog.CreateEventSource()。

我会告诉你两种方式:

// You would do this one from within an Installer class in a setup: private void InstallEventLog() { EventLogInstaller logInstaller; //Create an instance of an EventLogInstaller. logInstaller = new EventLogInstaller(); //Set the source name of the event log. logInstaller.Source = "TheEventSourceName"; Installers.Add(logInstaller); }

方法2:只需以管理员身份调用一次CreateEventSource(例如,您可以将以下代码放入控制台应用程序中,并以管理员身份运行控制台应用程序

EventLog.CreateEventSource("TheSourceName", "Application");

奖金: 如果您在服务器上安装了 Powershell,则可以从 Powershell 命令提示符执行此操作: (确保您以管理员身份运行 Powershell)

[system.Diagnostics.EventLog]::CreateEventSource("SourceName", "Application")

有帮助的跳

【讨论】:

  • 澄清点:字符串“SourceName”是您想要使用的任何源名称——您可以将其设为任何名称。字符串“应用程序”是一个文字——就像你字面上使用“应用程序”这个词一样(它指定了 Windows 应用程序日志与系统日志等)。唯一的例外是,如果您正在创建一个完整的自定义事件日志,而不仅仅是想写入通用应用程序事件日志。
【解决方案2】:

向事件日志授予 ASPNET 权限。

运行 -> regedit -> 浏览到

HKEY_LOCAL_MACHINE
   \SYSTEM
      \CurrentControlSet
         \Services
            \Eventlog

右键选择权限并赋予 ASPNET 帐户完全控制权

【讨论】:

  • 如果您正在分发您的应用程序,这可能是个坏主意,有些 IT 管理员不允许更改默认安全选项。你应该可以在沙盒中玩了。
  • 不知道为什么这被否决了这么多。它可能无法扩展,甚至无法用于生产,但这是一个很好的答案,具体说明了许可是什么以及如何授予许可。
  • 更改仅在您在 IIS 上重新启动应用程序后生效
  • 老实说,我仍然会使用我的原始答案(标记为答案的那个)。所有这些其他方法都需要向 IIS 帐户添加更高的权限,而原始答案没有 - 您只需要以管理员身份运行设置,或者以管理员身份运行单行代码(在安装网络时)应用程序)
【解决方案3】:

IIS 8权限解决答案

我很懒,并没有在我的代码中创建一个特殊的日志,而是我使用了:

System.Diagnostics.EventLog.WriteEntry("MyAppName", "Bla Bla SQL 错误:“+sx.Message);

只是为了完成迈克尔的回答 在 IIS8 中,IIS 在运行服务器端代码时使用的用户是:IIS_IUSRS

(实际上它更复杂,因为 IIS_IUSRS 中有虚拟帐户,但它们从该帐户获得权限,请参阅IIS_IUSRS and IUSR permissions in IIS8 形成更多详细信息)

该用户只需要此注册表节点的 READ 权限:

HKLM\System\CurrentControlSet\Services\Eventlog\Security

原因是当一个新的日志源被写入时,在创建它之前,系统想要检查它是否不存在,所以它需要读取源名称。

另外,如果你使用的是visual studio的iis express,它会在你的个人凭据下运行,所以如果你对上面的注册表节点没有读取权限,你在visual下调试时也需要添加它工作室。

(如果管理员拥有该节点的权限并且您在该组中,这还不够,您需要以“管理员身份”运行 Visual Studio - 这仅适用于 Visual Studio 快捷方式而不是 sln 快捷方式)

另一个注意事项:如果计算机在域中,并且在编辑注册表权限时找不到 IIS_IUSRS 帐户,则可能是您在错误的“位置”中查找,而是在域活动目录中搜索帐户本地计算机)

【讨论】:

  • 注意,如果列表中缺少 IIS_IUSRS 用户,您可能正在查看域用户 - 将位置更改为本地计算机。域中的用户 IUSRS 不是您需要的用户
  • 另外别忘了重启服务(IIS)
  • 如果它仍然不起作用,请转到您的应用程序池属性选择高级设置,然后将“启用 32 位应用程序”标记为 true。我的是假的,但这对朋友有帮助,所以试试吧。
  • 原始答案仍然有效——只需运行代码以管理员身份创建事件源 1 次。在部署 Web 应用程序的同时执行此操作。之后,以较低权限运行的 IIS 应用程序将能够使用新源写入日志条目。
【解决方案4】:

我认为@Michael Kniskern 的好例子更安全的选择是:

注册...

HKEY_LOCAL_MACHINE \系统 \当前控制集 \服务 \事件日志 \your_new_application_log

完全控制为您的应用程序创建的特定应用程序日志(在此示例中,右键单击 your_new_application_log 并在此处设置权限)。创建新的日志名称后,它将出现在嵌套在上面的 eventlog 节点下的注册表中。

【讨论】:

    【解决方案5】:

    我使用的是 IIS 10,并将池标识设置为本地系统

    见参考:https://stackoverflow.com/a/9067391/9975799

    【讨论】:

    • 请提供链接中的重要详细信息,因为链接将来可能会过期。
    • 我做了第 3 项(第 3 个项目符号),设置应用程序池(您在站点上使用的那个),然后将身份设置为本地系统
    猜你喜欢
    • 2011-07-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    相关资源
    最近更新 更多