【发布时间】:2010-10-17 06:24:03
【问题描述】:
我正在尝试使用 log4net 在 Windows Server 2008 SP1 上的 IIS7 下写入客户事件日志。但是,帐户似乎无权写入事件日志。有人有什么建议吗?
【问题讨论】:
我正在尝试使用 log4net 在 Windows Server 2008 SP1 上的 IIS7 下写入客户事件日志。但是,帐户似乎无权写入事件日志。有人有什么建议吗?
【问题讨论】:
问题可能是您的事件源。您必须先创建一个事件源,然后才能写入事件日志(如果您不这样做,事件日志对象会在您第一次写入日志时尝试“自动”为您创建一个)。
您必须拥有更高的权限才能创建事件日志源。在我的一些网络应用程序中,我已将用于创建事件源的代码放入我的设置中(设置以管理员身份运行,因此我始终保证能够创建源)。
您只需创建一次源。之后,您的 ASP.Net 应用程序应该有足够的权限来编写指定您创建的源(或源)的条目。
您可以在设置中使用 EventLogInstaller 来创建源,或者您可以编写一个小实用程序以管理员身份调用 EventLog.CreateEventSource()。
我会告诉你两种方式:
// You would do this one from within an Installer class in a setup:
private void InstallEventLog()
{
EventLogInstaller logInstaller;
//Create an instance of an EventLogInstaller.
logInstaller = new EventLogInstaller();
//Set the source name of the event log.
logInstaller.Source = "TheEventSourceName";
Installers.Add(logInstaller);
}
方法2:只需以管理员身份调用一次CreateEventSource(例如,您可以将以下代码放入控制台应用程序中,并以管理员身份运行控制台应用程序
EventLog.CreateEventSource("TheSourceName", "Application");
奖金: 如果您在服务器上安装了 Powershell,则可以从 Powershell 命令提示符执行此操作: (确保您以管理员身份运行 Powershell)
[system.Diagnostics.EventLog]::CreateEventSource("SourceName", "Application")
有帮助的跳
【讨论】:
向事件日志授予 ASPNET 权限。
运行 -> regedit -> 浏览到
HKEY_LOCAL_MACHINE
\SYSTEM
\CurrentControlSet
\Services
\Eventlog
右键选择权限并赋予 ASPNET 帐户完全控制权
【讨论】:
IIS 8权限解决答案
我很懒,并没有在我的代码中创建一个特殊的日志,而是我使用了:
System.Diagnostics.EventLog.WriteEntry("MyAppName", "Bla Bla SQL 错误:“+sx.Message);
只是为了完成迈克尔的回答 在 IIS8 中,IIS 在运行服务器端代码时使用的用户是:IIS_IUSRS
(实际上它更复杂,因为 IIS_IUSRS 中有虚拟帐户,但它们从该帐户获得权限,请参阅IIS_IUSRS and IUSR permissions in IIS8 形成更多详细信息)
该用户只需要此注册表节点的 READ 权限:
HKLM\System\CurrentControlSet\Services\Eventlog\Security
原因是当一个新的日志源被写入时,在创建它之前,系统想要检查它是否不存在,所以它需要读取源名称。
另外,如果你使用的是visual studio的iis express,它会在你的个人凭据下运行,所以如果你对上面的注册表节点没有读取权限,你在visual下调试时也需要添加它工作室。
(如果管理员拥有该节点的权限并且您在该组中,这还不够,您需要以“管理员身份”运行 Visual Studio - 这仅适用于 Visual Studio 快捷方式而不是 sln 快捷方式)
另一个注意事项:如果计算机在域中,并且在编辑注册表权限时找不到 IIS_IUSRS 帐户,则可能是您在错误的“位置”中查找,而是在域活动目录中搜索帐户本地计算机)
【讨论】:
我认为@Michael Kniskern 的好例子更安全的选择是:
注册...
HKEY_LOCAL_MACHINE \系统 \当前控制集 \服务 \事件日志 \your_new_application_log
完全控制为您的应用程序创建的特定应用程序日志(在此示例中,右键单击 your_new_application_log 并在此处设置权限)。创建新的日志名称后,它将出现在嵌套在上面的 eventlog 节点下的注册表中。
【讨论】:
我使用的是 IIS 10,并将池标识设置为本地系统
【讨论】: