Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 从ASP.NET MVC应用程序写入事件日志时出现安全异常_Asp.net Mvc_Iis 6_Event Log_Securityexception - Fatal编程技术网

Asp.net mvc 从ASP.NET MVC应用程序写入事件日志时出现安全异常

Asp.net mvc 从ASP.NET MVC应用程序写入事件日志时出现安全异常,asp.net-mvc,iis-6,event-log,securityexception,Asp.net Mvc,Iis 6,Event Log,Securityexception,我用一些业务逻辑创建了一个库,其中包括写入System.Diagnostics.EventLog实例。该库通常从Windows服务应用程序调用,但现在我尝试从ASP.NET MVC应用程序调用这些库函数 我在控制器中尝试了这段代码来创建EventLog实例,并将其传递到需要写入日志的方法中 Dim log = New EventLog("Application", My.Computer.Name, "MyMVCApp") 当库方法中的代码尝试写入日志时,会生成以下错误: [SecurityE

我用一些业务逻辑创建了一个库,其中包括写入
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应用程序中使用?框架是否已经创建了一个,我只需要参考一下?

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

而且

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

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

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

  • 在应用程序安装时创建新的事件源
  • 在注册表中手动创建新的事件源条目
因此,需要在应用程序之外创建日志(您不能用此用户的编程方式创建日志。请手动创建日志,或者创建一个简单的命令行应用程序以简化安装)

详情如下:

我个人建议您不要更改网络用户权限,而是在web应用程序之外创建日志源。我最喜欢的是控制台应用程序(它需要你5分钟左右的时间来编写,你也可以用它来准备其他机器)。在VS.NET中启动一个新的控制台应用程序,并添加代码以创建日志源。例如:


然后,在以适当权限登录时,只需从cmd行运行console应用程序。

如果您不确定它试图创建的事件源,则很难找到上述可接受的答案


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

我不知道为什么您不能创建自己的事件日志,而不是在应用程序日志上写入

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

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")

创建自定义日志。

请参见如何为日志分配权限: