我正在尝试使用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 ERROR:"+ sx.Message);
只是为了完成Michael的回答在IIS8中,IIS在运行服务器端代码时使用的用户是:IIS_IUSRS
(实际上它更复杂,因为IIS_IUSRS中有虚拟帐户,但是他们从该帐户获得权限,请参阅IIS8中的IIS_IUSRS和IUSR权限表单更多详细信息)
该用户仅需要此注册表节点上的READ权限:
HKLM\CURRENTCONTROLSET\SYSTEM \服务\事件日志\安全
原因是当写入新的日志源时,在创建它之前,系统要检查它是否不存在,因此需要读取源名称.
此外,如果您使用的是visual studio的iis express,它将在您的个人凭据下运行,因此如果您没有上述注册表节点的读访问权限,则在Visual Studio下进行调试时也需要添加它.
(如果管理员拥有该节点的权限,并且您在该组中,那还不够,您需要以管理员身份运行visual studio - 这只能从visual studio快捷方式而不是sln快捷方式工作)
另一个注意事项:如果计算机位于域中,并且在编辑注册表权限时找不到IIS_IUSRS帐户,则可能是您查找了错误的"位置",在域活动目录而不是本地目录中搜索该帐户电脑)