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 应用程序在运行 IIS 6 的 Windows Server 2003 上作为网络服务用户运行。为了让网络服务用户访问注册表,我需要做些什么吗?

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

4

3 回答 3

19

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

和...

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

所以看起来你的事件日志源不存在,它正在尝试使用网络服务用户创建一个新的事件日志源(这需要写入注册表,所以不会工作)。

“要使您的 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 行运行控制台应用程序。

于 2009-10-25T08:08:53.833 回答
5

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

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

于 2013-06-13T21:53:29.190 回答
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")

创建自定义日志。

于 2016-01-29T14:19:32.027 回答