ASP.NET MVC应用程序向EventLog写入时出现安全异常

9

我有一个库,其中包含一些业务逻辑,包括写入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应用程序在运行时使用的是Windows Server 2003上的Network Service用户,并且正在运行IIS 6。我需要做些什么才能让Network Service用户访问注册表?

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

3个回答

19
从MSDN上看:"使用Network Service标识运行的应用程序可以使用现有事件源写入事件日志,但由于注册表权限不足,它们无法创建新的事件源。"
还有...
"如果与EventLog实例关联的事件日志的源不存在,则会创建一个新的事件源。"
所以看起来你的事件日志源不存在,并且它正在尝试使用Network Service用户创建新的事件日志源(这需要写入注册表,因此不起作用)。
"要启用ASP.NET应用程序使用不存在的事件源编写事件日志,您有两个选项:"
1.在应用程序安装时创建新的事件源 2.手动在注册表中创建新的事件源条目。
因此,需要在应用程序之外创建日志(您无法以此用户编程方式执行此操作。请手动执行此操作或创建一个简单的命令行应用程序以简化安装)。
完整详情请参见:

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行运行控制台应用程序。


5

如果您不确定正在尝试创建哪个事件源,以上被接受的答案可能很难弄清楚。

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


0

我不知道为什么你不能创建自己的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")

创建自定义日志。

查看此链接以了解如何为日志分配权限:https://dev59.com/Y0rSa4cB1Zd3GeqPXpUd#35086503 - Vinod Srivastav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接