7

是否有始终可供 ASP.NET webapp 编写的事件日志源?

背景故事,以防有人有看似无关的解决方案:

我们的 ASP.NET webapp 使用它自己的事件日志源,但它没有创建它的权限。因此,如果在 webapp 尝试写入条目时事件日志源不存在(安装说明指示管理员手动注册事件日志源,但是......),我们的 webapp 不会放入任何内容出现问题时的事件日志。

我希望有另一个(与应用程序无关的)来源可以用来通知观看事件日志的人。

4

5 回答 5

2

在这篇知识库文章中,它解释了这个问题 http://support.microsoft.com/kb/329291

PRB:当 ASP.NET 应用程序尝试在 EventLog 中写入新的 EventSource 时出现“不允许请求的注册表访问”错误消息

症状

当您使用 ASP.NET 在事件日志中创建新的事件源时,您可能会收到以下错误消息:

System.Security.SecurityException:不允许请求的注册表访问。

原因

默认情况下,ASP.NET 工作进程的用户令牌是 ASPNET(或 NetworkService,用于在 Internet Information Services [IIS] 6.0 上运行的应用程序)。出现“症状”部分中的问题是因为您的帐户没有正确的用户权限来创建事件源。

解析度

第一种方法:

在注册表编辑器的应用程序事件日志下创建一个事件源(在服务器上,而不是在您的开发 PC 上)。为此,请按照下列步骤操作:

  1. 访问服务器的 Windows 桌面。单击开始,然后单击运行。
  2. 在打开文本框中,键入 regedit。
  3. 找到以下注册表子项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
  4. 右键单击 Application 子项,指向New,然后单击Key
  5. 键入“ TEST”作为密钥名称。
  6. 关闭注册表编辑器。

第二种(替代)方法:

命名空间中的EventLogInstallerSystem.Diagnostics允许您安装和配置应用程序在运行时读取或写入的事件日志。您可以使用EventLogInstaller. 为此,请按照下列步骤操作:

  1. 使用 Microsoft Visual Basic .NET 或 Microsoft Visual C# .NET 创建一个名为 EventLogSourceInstaller 的新类库。默认情况下,会创建 Class1.vb 文件或 Class1.cs 文件。
  2. 在解决方案资源管理器中,右键单击EventLogSourceInstaller,然后单击添加引用。
  3. 在“添加引用”对话框中,双击System.Configuration.Install.dll,然后单击“确定”。
  4. 将 `Class1.cs`重命名Class1.vb为 MyEventLogInstaller.vb\MyEventLogInstaller.cs。
  5. 将现有代码替换为以下示例代码MyEventLogInstaller.vbMyEventLogInstaller.cs使用以下示例代码: Visual Basic .NET 示例
Imports System.Diagnostics
Imports System.Configuration.Install
Imports System.ComponentModel

<RunInstaller(True)> _
Public Class MyEventLogInstaller
    Inherits Installer
    Private myEventLogInstaller As EventLogInstaller

    Public Sub New()
        ' Create an instance of 'EventLogInstaller'.
        myEventLogInstaller = New EventLogInstaller()
        ' Set the 'Source' of the event log, to be created.
        myEventLogInstaller.Source = "TEST"
        ' Set the 'Log' that the source is created in.
        myEventLogInstaller.Log = "Application"
        ' Add myEventLogInstaller to 'InstallerCollection'.
        Installers.Add(myEventLogInstaller)
    End Sub 
End Class 

Visual C# .NET 示例

using System;
using System.Diagnostics;
using System.ComponentModel;
using System.Configuration.Install;


namespace EventLogSourceInstaller 
{
  [RunInstaller(true)]
  public class MyEventLogInstaller : Installer
  {
      private EventLogInstaller myEventLogInstaller;

      public MyEventLogInstaller()
      {
          //Create Instance of EventLogInstaller
          myEventLogInstaller = new EventLogInstaller();

          // Set the Source of Event Log, to be created.
          myEventLogInstaller.Source = "TEST";

          // Set the Log that source is created in
          myEventLogInstaller.Log = "Application";
          
          // Add myEventLogInstaller to the Installers Collection.
          Installers.Add(myEventLogInstaller);
      }
  }
}
  1. 在生成菜单上,单击生成解决方案以创建 EventLogSourceInstaller.dll。
  2. 打开 Visual Studio .NET 命令提示符。
  3. 在命令提示符处,切换到 EventLogSourceInstaller.dll 所在的文件夹。
  4. 运行以下命令来创建 EventSource:InstallUtil EventLogSourceInstaller.dll

如果您使用该决议下的第二种方法,您应该让它工作。

如果您不想这样做,或者您无法使其正常工作,另一种方法是使用您的身份标签web.config并模拟一个有权编辑注册表的用户。这仅适用于此应用程序的安全整体,但如果您实施一些额外的安全措施,您应该没问题。

于 2009-12-23T03:00:49.617 回答
1

考虑电子邮件通知?我猜有些管理员更喜欢从他们的手机上收到通知。

如果客户端拒绝在 HKLM\System\CurrentControlSet\Services\EventLog\ 下创建密钥,您也可以打电话回家(调用 Web 服务将日志写回您自己的服务器)

于 2009-12-23T02:48:02.010 回答
1

You might not have access to create an event source from the web app, but if memory serves, you can check to see if one exists.

In the global.asax or a custom handler, check to see if they created it like they were supposed to. If they didn't, have a really annoying reminder div show on every page. As soon as they create it like they were supposed to, the div goes away :)

于 2009-12-29T11:42:31.757 回答
1

The "ASP.NET X.Y.Z.0" source will, I think, always be available for writing.

于 2010-11-22T22:17:19.197 回答
0

您应该能够轻松写入内置事件日志(应用程序、安全性、系统)。

于 2009-12-16T20:52:12.487 回答