asp.net-mvc – 从ASP.NET MVC应用程序写入EventLog时的安全异常

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 从ASP.NET MVC应用程序写入EventLog时的安全异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个使用一些业务逻辑创建的库,包括写入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

我的网络应用程序作为运行IIS 6的Windows Server 2003上的网络服务用户运行.为了使网络服务用户能够访问注册表,我需要做些什么?

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

解决方法

从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行运行控制台应用程序,并以适当的权限登录.

猜你在找的asp.Net相关文章