是否有始终可供 ASP.NET webapp 编写的事件日志源?
背景故事,以防有人有看似无关的解决方案:
我们的 ASP.NET webapp 使用它自己的事件日志源,但它没有创建它的权限。因此,如果在 webapp 尝试写入条目时事件日志源不存在(安装说明指示管理员手动注册事件日志源,但是......),我们的 webapp 不会放入任何内容出现问题时的事件日志。
我希望有另一个(与应用程序无关的)来源可以用来通知观看事件日志的人。
是否有始终可供 ASP.NET webapp 编写的事件日志源?
背景故事,以防有人有看似无关的解决方案:
我们的 ASP.NET webapp 使用它自己的事件日志源,但它没有创建它的权限。因此,如果在 webapp 尝试写入条目时事件日志源不存在(安装说明指示管理员手动注册事件日志源,但是......),我们的 webapp 不会放入任何内容出现问题时的事件日志。
我希望有另一个(与应用程序无关的)来源可以用来通知观看事件日志的人。
在这篇知识库文章中,它解释了这个问题 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 上)。为此,请按照下列步骤操作:
- 访问服务器的 Windows 桌面。单击开始,然后单击运行。
- 在打开文本框中,键入 regedit。
- 找到以下注册表子项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
- 右键单击 Application 子项,指向New,然后单击Key。
- 键入“
TEST
”作为密钥名称。- 关闭注册表编辑器。
第二种(替代)方法:
命名空间中的
EventLogInstaller
类System.Diagnostics
允许您安装和配置应用程序在运行时读取或写入的事件日志。您可以使用EventLogInstaller
. 为此,请按照下列步骤操作:
- 使用 Microsoft Visual Basic .NET 或 Microsoft Visual C# .NET 创建一个名为 EventLogSourceInstaller 的新类库。默认情况下,会创建 Class1.vb 文件或 Class1.cs 文件。
- 在解决方案资源管理器中,右键单击
EventLogSourceInstaller
,然后单击添加引用。- 在“添加引用”对话框中,双击
System.Configuration.Install.dll
,然后单击“确定”。- 将 `Class1.cs`重命名
Class1.vb
为 MyEventLogInstaller.vb\MyEventLogInstaller.cs。- 将现有代码替换为以下示例代码
MyEventLogInstaller.vb
或MyEventLogInstaller.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); } } }
- 在生成菜单上,单击生成解决方案以创建 EventLogSourceInstaller.dll。
- 打开 Visual Studio .NET 命令提示符。
- 在命令提示符处,切换到 EventLogSourceInstaller.dll 所在的文件夹。
- 运行以下命令来创建 EventSource:
InstallUtil EventLogSourceInstaller.dll
如果您使用该决议下的第二种方法,您应该让它工作。
如果您不想这样做,或者您无法使其正常工作,另一种方法是使用您的身份标签web.config
并模拟一个有权编辑注册表的用户。这仅适用于此应用程序的安全整体,但如果您实施一些额外的安全措施,您应该没问题。
考虑电子邮件通知?我猜有些管理员更喜欢从他们的手机上收到通知。
如果客户端拒绝在 HKLM\System\CurrentControlSet\Services\EventLog\ 下创建密钥,您也可以打电话回家(调用 Web 服务将日志写回您自己的服务器)
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 :)
The "ASP.NET X.Y.Z.0" source will, I think, always be available for writing.
您应该能够轻松写入内置事件日志(应用程序、安全性、系统)。