【问题标题】:Security exception when writting to an EventLog from an ASP.NET MVC application从 ASP.NET MVC 应用程序写入事件日志时出现安全异常
【发布时间】:2010-12-09 06:32:52
【问题描述】:

我创建了一个包含一些业务逻辑的库,其中包括写入System.Diagnostics.EventLog 实例。该库通常是从 Windows 服务应用程序调用的,但现在我正尝试从我的 ASP.NET MVC 应用程序调用这些相同的库函数。

我在我的控制器中尝试了这段代码来创建我传递给需要写入日志的方法的 EventLog 实例。

Dim log = New EventLog("Application", My.Computer.Name, "MyMVCApp")

当库方法中的代码尝试写入日志时,会产生以下错误:

[SecurityException: Requested registry access is not allowed.]
 System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) +51
 Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) +7462217
 System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData) +366
 System.Diagnostics.EventLog.VerifyAndCreateSource(String sourceName, String currentMachineName) +194
 System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData) +205
 System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type) +14

我的 Web 应用程序在运行 IIS 6 的 Windows Server 2003 上作为网络服务用户运行。我需要做些什么才能让网络服务用户访问注册表吗?

有没有更好的方法来创建用于 ASP.NET MVC 应用程序的 EventLog 实例?框架是否已经创建了一个我只需要引用的框架?

【问题讨论】:

    标签: asp.net-mvc iis-6 event-log securityexception


    【解决方案1】:

    来自 MSDN:“使用 网络服务身份运行的应用程序可以使用 现有事件源 写入事件日志,但它们无法创建新事件来源,因为注册表权限不足。”

    还有……

    "如果与 EventLog 实例关联的事件日志的源不存在,则会创建一个新的事件源。"

    看来您的事件日志源不存在,它正在尝试使用网络服务用户创建一个新的事件日志源(这需要写入注册表,因此无法正常工作)。

    “要使您的 ASP.NET 应用程序能够使用尚不存在的事件源写入事件日志,您有两种选择:”

    • 在应用安装时创建新的事件源
    • 在注册表中手动创建新的事件源条目。

    因此,需要在应用程序之外创建日志(您不能以编程方式对这个用户执行此操作。手动执行,或创建一个简单的命令行应用程序以简化安装)。

    详细信息:

    http://msdn.microsoft.com/en-us/library/ms998320.aspx#paght000015_eventlogaccess

    我个人建议您不要更改网络用户权限,而是在 Web 应用程序之外创建日志源。我的偏好是在控制台应用程序中(这将花费您大约 5 分钟的时间来编写,您也可以使用它来准备其他机器)。在 VS.NET 中启动一个新的控制台应用程序,并添加代码以创建日志源。一个例子:

    http://www.dotnetspider.com/resources/23593-Create-Event-log-VB-NET.aspx

    然后在以适当权限登录后,从 cmd 行运行控制台应用程序。

    【讨论】:

      【解决方案2】:

      如果您不确定它试图创建什么事件源,那么上述接受的答案将很难弄清楚。

      更简单的解决方案是将应用程序池切换为临时使用 LocalSystem,然后运行应用程序并产生错误。它将能够创建相关的事件日志源,然后您可以将其切换回使用 NetworkService。

      【讨论】:

        【解决方案3】:

        我不知道您为什么不能创建自己的 EventLog 而不是写入应用程序日志。

        您可以使用以下代码创建一个窗口/控制台应用程序并以管理员身份运行它,这将为您创建一个新日志。

        if (!EventLog.Exists("LOG_NAME"))
           EventLog.CreateEventSource("LOG_NAME", "LOG_NAME");
        

        这将在事件日志中创建一个新日志,并在应用程序和服务日志中可见。

         if (!EventLog.SourceExists("MyMVCApp"))
            EventLog.CreateEventSource("MyMVCApp", "LOG_NAME");
        

        这将在自定义“LOG_NAME”中创建一个新的源,您可以使用该代码

        Dim log = New EventLog("LOG_NAME", My.Computer.Name, "MyMVCApp")
        

        创建自定义日志。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 2012-04-25
        • 2014-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        相关资源
        最近更新 更多