enc*_*cee 186 windows asp.net iis-7 exception-handling event-log
我正在努力尝试将ASP.NET应用程序从Server 2003(和IIS6)移植到Server 2008(IIS7).
当我尝试访问浏览器上的页面时,我得到了这个:
'/'应用程序中的服务器错误.
安全例外
说明:应用程序尝试执行安全策略不允许的操作.要授予此应用程序所需的权限,请与您的系统管理员联系或在配置文件中更改应用程序的信任级别.
异常详细信息:System.Security.SecurityException:找不到源,但无法搜索部分或全部事件日志.无法访问的日志:安全性
来源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
堆栈跟踪:
[SecurityException:找不到源,但无法搜索部分或全部事件日志.无法访问的日志:安全.]
System.Diagnostics.EventLog.FindSourceRegistration(String source,String machineName,Boolean readOnly)+562 System.Diagnostics.EventLog.SourceExists(String source,String machineName)+251
[剪断]
这些是我为尝试解决它而做的事情:
授予"Everyone"对密钥的完全访问权限HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security.这很有效.但我自然不能在生产中这样做.所以我在运行应用程序几分钟后删除了"Everyone"权限,错误重新出现.
我在应用程序日志和安全日志中创建了源代码(我通过regedit对其进行了验证)在安装期间使用提升的权限,但错误仍然存在.
我在应用程序中给了应用程序一个完整的信任级别web.config(并使用appcmd.exe),但无济于事.
有没有人能够了解这里可以做些什么?
PS:这是对这个问题的跟进.我按照给出的答案但没有用(见上面的#2).
MiF*_*vil 170
要Network Service获得EventLog/Security密钥的读取权限(如Firenzi和royrules22所建议),请按照http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx中的说明进行操作.
Start然后选择Runregedt32或regedit导航/展开到以下键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security
右键单击此条目并选择权限
添加Network Service用户
给它读取权限
更新:上述步骤适用于开发人员计算机,您不使用部署过程来安装应用程序.
但是,如果将应用程序部署到其他计算机,请考虑在安装过程中注册事件日志源,如SailAvid和Nicole Calinoiu的回答所示.
我正在使用PowerShell功能(在Octopus Deploy.ps1中调用)
function Create-EventSources() {
$eventSources = @("MySource1","MySource2" )
foreach ($source in $eventSources) {
if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) {
[System.Diagnostics.EventLog]::CreateEventSource($source, "Application")
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*ter 55
问题是EventLog.SourceExists尝试访问EventLog\Security密钥,只允许管理员访问.
登录C#程序的一个常见示例EventLog是:
string sSource;
string sLog;
string sEvent;
sSource = "dotNET Sample App";
sLog = "Application";
sEvent = "Sample Event";
if (!EventLog.SourceExists(sSource))
EventLog.CreateEventSource(sSource, sLog);
EventLog.WriteEntry(sSource, sEvent);
EventLog.WriteEntry(sSource, sEvent, EventLogEntryType.Warning, 234);
Run Code Online (Sandbox Code Playgroud)
但是,如果程序没有管理员权限并且未找到密钥,则以下行将失败EventLog\Application,EventLog.SourceExists然后尝试访问EventLog\Security.
if (!EventLog.SourceExists(sSource))
EventLog.CreateEventSource(sSource, sLog);
Run Code Online (Sandbox Code Playgroud)
因此,推荐的方法是创建一个安装脚本,该脚本创建相应的密钥,即:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET示例应用程序
然后可以删除这两行.
您还可以创建一个.reg文件来创建注册表项.只需将以下文本保存到文件中create.reg:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App]
Run Code Online (Sandbox Code Playgroud)
enc*_*cee 46
解决方案是在EventLog/Security密钥上为"网络服务"帐户授予读取权限.
小智 7
我在VS2010下开发的控制台程序有一个非常类似的问题(在XP下从VS2008升级)我的编程使用EnLib进行一些日志记录.由于EntLib没有注册新事件源的权限,因此触发了错误.
所以我作为管理员编写了一个编程的prog :它注册了事件源.然后我从VS内部开始进行开发和调试没有问题.
(你也可以参考http://www.blackwasp.co.uk/EventLog_3.aspx,它帮助了我
小智 6
我从一个作为计划任务运行的.NET控制台应用程序中发生了这个异常,我试图做同样的事情 - 创建一个新的事件源并写入事件日志.
最后,为以下按键设置运行任务的用户的完全权限对我来说很有用:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
Run Code Online (Sandbox Code Playgroud)
我在这里尝试几乎所有东西来解决这个问题......我在这里分享帮助我的答案:
解决问题的另一种方法:
- 在IIS控制台中,转到管理站点的应用程序池,并记下运行它的标识(通常是网络服务)
- 确保此标识可以读取KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog(rigth-click,authorizations)
- 现在将此应用程序池的标识更改为本地系统,应用并切换回网络服务
将重新加载凭据并且可以使用EventLog
在http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx,感谢Michael Freidgeim
当您使用System.Diagnostics.EventLog.WriteEntry("SourceName", "ErrorMessage", EventLogEntryType.Error);时,需要在 regEdit 中的 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application 下创建一个使用源名称的新密钥。
所以基本上你的用户没有创建密钥的权限。根据您在应用程序池高级设置中的身份值中使用的用户,可以执行以下操作:
右键单击 EventLog 键并选择 Permissions... 选项 3. 添加具有完全控制访问权限的用户。
-如果您使用“NetworkService”,请添加 NETWORK SERVICE 用户
-如果您使用inf “ApplicationPoolIdentity”添加IIS APPPOL {您的应用程序池的名称}(搜索用户时使用本地计算机位置)。
-如果您使用“LocalSystem”,请确保该用户具有管理员权限。由于存在漏洞,不建议使用。
对HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security重复步骤 1 到 3
为了使用 Visual Studio 进行调试,我使用“NetworkService”(它是 ASP.NET 用户),当发布站点时,我使用“AppicationPoolIdentity”。
似乎确实有一个明显的解决方案,但我还没有看到一个巨大的缺点,至少在获得管理权限以创建自己的事件源是不切实际的情况下:使用已经存在的解决方案。
我开始使用的两个是“.Net Runtime”和“Application Error”,这两个似乎都将出现在大多数机器上。
主要缺点是无法按该事件进行分组,并且您可能没有关联的事件 ID,这意味着日志条目很可能以“来自源 .Net 的事件 ID 0 的描述”为前缀找不到运行时....”如果您省略它,但日志会进入,并且输出看起来大致合理。
结果代码最终看起来像:
EventLog.WriteEntry(
".Net Runtime",
"Some message text here, maybe an exception you want to log",
EventLogEntryType.Error
);
Run Code Online (Sandbox Code Playgroud)
当然,由于无论出于何种原因,您总是有可能在一台没有这些事件源的机器上,您可能希望将其try {} catch{}包装起来以防它失败并使事情变得更糟,但现在事件是可以保存的。
| 归档时间: |
|
| 查看次数: |
294685 次 |
| 最近记录: |