System.Security.SecurityException写入到事件日志时(System.S

2019-06-18 10:52发布

我正在试图从端口Server 2003中(和IIS6)的ASP.NET应用程序到Windows Server 2008(IIS7)。

当我尝试,并参观在​​浏览器上我得到这个页面:

在“/”应用程序的服务器错误。

安全例外

说明:应用程序试图执行安全策略不允许的操作。 要授予此应用程序所需的权限,请与系统管理员联系或更改配置文件中的应用程序的信任级别。

异常详细信息:System.Security.SecurityException:源未找到,但一些或所有事件日志不能被搜索到。 不可访问的日志:安全

源错误:

在当前web请求的执行过程中生成未处理的异常。 关于起源和异常的位置信息可以使用异常堆栈跟踪下面来识别。

堆栈跟踪:

[抛出:SecurityException:源未找到,但一些或所有事件日志不能被搜索到。 无法访问日志:安全。

System.Diagnostics.EventLog.FindSourceRegistration(字符串源,字符串MACHINENAME,布尔只读)562个System.Diagnostics.EventLog.SourceExists(字符串源,字符串MACHINENAME)251

[剪断]

这是我对我所做的尝试和解决它的东西:

  1. 给“每个人”完全访问权限的关键HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security 。 这个工作。 但是,我自然不能在生产中做到这一点。 所以,我跑了几分钟的应用程序和错误再次出现后,删除了“所有人”的权限。

  2. 我创建的应用程序日志和安全日志中源(和我验证它通过注册表编辑器存在)安装使用提升的权限时,但仍错误。

  3. 我给了应用程序在完全信任级别web.config文件(使用appcmd.exe ),但无济于事。

没有人有洞察力,以什么可以在这里完成?

PS:这是一个跟进这个问题 。 我跟着给定的答案,但无济于事(见上面的#2)。

Answer 1:

为了让Network Service读取权限的EventLog/Security密钥(由Firenzi和royrules22的建议)遵循指示http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx

  1. 打开注册表编辑器:
    1. 选择Start然后Run
    2. 输入regedt32regedit
  2. 导航/扩展到以下注册表项:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

  3. 右键单击该条目并选择权限

  4. 添加Network Service用户

  5. 给它阅读权限

UPDATE:以上步骤是开发者的机器,在您不使用部署过程中安装应用程序确定。
但是,如果您应用程序部署到其他机器上,考虑在建议安装过程中注册事件日志源 SailAvid的和妮可Calinoiu的答案。

我使用PowerShell的功能(在八达通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")
            }
    }
}


Answer 2:

问题是, 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);

但是,如果程序没有管理员权限,关键是不是下找到以下行失败EventLog\ApplicationEventLog.SourceExists然后将尝试访问EventLog\Security

if (!EventLog.SourceExists(sSource))
    EventLog.CreateEventSource(sSource, sLog);

因此,推荐的方法是创建一个安装脚本,创建相应的按键,分别是:

HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\事件日志\应用程序\ DOTNET示例应用程序

然后可以删除这两条线。

您还可以创建一个.reg文件来创建注册表项。 只需保存以下文本文件create.reg

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App]


Answer 3:

解决的办法是给“网络服务”帐户读取权限的事件日志/安全密钥。



Answer 4:

对我来说,ONY授予的“网络服务”“读取”权限, 对整个“事件日志”分支工作。



Answer 5:

我曾与VS2010下一个控制台程序我开发(XP下从VS2008升级)一个非常类似的问题,我的PROG使用EnLib做一些记录。 被解雇的错误,因为EntLib早已不是注册一个新的事件源的权限。

于是,我开始我的一次编译PROG 作为管理员 :它注册的事件源。 然后我回去的深化发展和调试从内VS没有问题。

(你也可以指http://www.blackwasp.co.uk/EventLog_3.aspx ,它帮助我



Answer 6:

我尝试在这里几乎一切解决这个问题......我在这里分享,帮助我的答案:

另一种方式来解决问题:

  • 在IIS控制台,转到应用程序池管理您的网站,并注意身份运行它(通常是网络服务)
  • 确保这个身份可以阅读KEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\事件日志(分辩单击,授权)
  • 现在改变这个应用程序池的身份本地系统,应用和切换回网络服务

证书将重新加载和事件日志reacheable

在http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx ,感谢迈克尔Freidgeim



Answer 7:

此异常是从.NET控制台应用程序运行的计划任务为发生我,我试图做的基本上是同样的事情 - 创建一个新的事件源和写入到事件日志。

最后,设置全权限下该任务在下列键运行的伎俩对我的用户:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog


Answer 8:

我遇到同样的问题,但我不得不去上一级充分获得大家到HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\事件日志\键,而不是下降到安全性,及时清理问题对我来说。



Answer 9:

在Windows 7 64位同样的问题。 以管理员身份运行解决了这个问题。



Answer 10:

FYI ...我的问题是,意外选择了“本地服务”作为对ProcessInstaller的性质的账户,而不是“本地系统”。 只是提了别人谁跟着MSDN教程为本地服务的选择显示了第一,我并没有密切关注....



Answer 11:

与源名称使用需要一个新的关键在HKEY_LOCAL_MACHINE \ SYSTEM当您使用System.Diagnostics.EventLog.WriteEntry(“SOURCENAME”,“的ErrorMessage”,EventLogEntryType.Error)创建\ CURRENTCONTROLSET \在注册表编辑器服务\事件日志\应用;

所以基本上你的用户没有权限创建密钥。 该能做到这取决于你是从应用程序池高级设置标识值使用用户的以下情况:

  1. 运行Regedit,然后转到HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\事件日志
  2. 右键单击事件日志键,选择权限...选项3.添加具有完全控制访问用户。

    -如果您正在使用“网络服务”添加网络服务用户

    -如果你是usinf“ApplicationPoolIdentity”添加IIS APPPOL {您的应用程序池的名称}(使用本地机器位置搜索用户时)。

    -如果您正在使用“本地系统”确保用户具有管理员权限。 这是不建议的漏洞。

  3. 重复1的步骤3 HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\事件日志\安全

对于使用Visual Studio调试我使用“网络服务”(这是ASP.NET用户),并在网站发布我用“AppicationPoolIdentity”。



Answer 12:

我不工作在IIS,但我有抛出同样的错误在2K8箱的应用程序。 它的工作原理在2K3箱就好了,去图。

我的决议是“以管理员身份运行”,给应用程序提升的权限和一切工作愉快。 我希望这有助于引导你在正确的方向。

Windows 2008中为权利/许可/仰角是从Windows 2003,噶尔真的不同。



Answer 13:

您好我碰到了同样的问题,当我开发一个应用程序,并希望在远程计算机上安装它,我做了以下固定它:

1)转到你的注册表中找到:HKLM \系统\ CurrentControlSet \服务\事件日志\应用程序(??? ??? YOUR_SERVICE_OR_APP_NAME)

请注意,“(??? ??? YOUR_SERVICE_OR_APP_NAME)”是你定义它,当您创建.NET部署,例如,如果您命名新的应用程序“我的新应用程序”,然后重点将是您的应用程序服务名称: HKLM \系统\ CurrentControlSet \服务\事件日志\应用程序\我的新应用

注2:根据在iEventLog你写进去,你会发现你的DEV中,\应用\(如上所述),或者也(\ SYSTEM)或(\安全),取决于什么事件您的应用程序写入,大多(\应用程序)应罚款所有的时间。

2)上面的键,从菜单中作为; 选择“文件” - >“导出”,然后保存文件。 (注:这将创建必要的注册表设置,当应用程序需要访问该密钥写入到事件查看器),新文件将是一个.reg文件,为论证起见,称它为“我的新App.REG “

3)当上部署生产,请与服务器的系统管理员(SA),交出了“我的新App.REG”文件与应用程序一起,并要求SA安装这个REG文件,一旦完成(如管理员),这将为您的广告应用程式的关键。

4)运行应用程序,它不应该需要访问其他任何东西比这个键等。

问题现在应该解决。

原因:

当开发写入任何事件日志的应用程序,则需要根据事件日志注册表下的Key,如果该键没有找到,它会尝试创建它,然后失败,对于没有权限这么做。 上述过程,与部署,而我们正在建立这个自己的应用程序(手动),并且无需头疼,因为你没有被添加权限给大家这是在生产服务器上一个securty风险调整注册表。

我希望这有助于解决它。



Answer 14:

是否有似乎是一个有目共睹的解决这个,我还没有看到一个巨大的缺点,至少它是不实际的,以创建自己的事件源,以获得管理权限:使用一个已经存在。

我已经开始使用的是“.NET运行时”和‘应用程序错误’这两个,这两个看起来像他们将出现在大多数机器。

主要缺点是不能按该事件,并且您可能没有关联的事件ID,这意味着日志条目很可能是东西来的“的描述事件ID 0从源代码的.Net效果前缀运行时无法找到......”如果你忽略它,但日志进去,并且输出看起来大致合理。

由此得到的代码最终看起来像:

EventLog.WriteEntry(
    ".Net Runtime", 
    "Some message text here, maybe an exception you want to log",
    EventLogEntryType.Error
    );

当然,由于总有你不具备不管出于什么原因这些事件源的机器上的机会,你可能想try {} catch{}万一失败包裹它,使事情变得更糟,但事件现在saveable。



Answer 15:

曾与我们所有的2008和服务器的类似的问题。 安全日志停止,因为拿了组身份验证的用户和读权限远离关键GPO的完全工作HKLM\System\CurrentControlSet\Services\EventLog\security

把每微软的建议,这回修正了该问题。 我怀疑给所有授权用户在更高层次上阅读也将纠正你的问题。



Answer 16:

我打了类似的问题-在我的案件来源包含<>字符。 64个机都采用新的甚至数 - XML基础,我会说这些字符(从字符串集)创建无效的XML导致异常。 按理说这应该是考虑微软的问题 - 不处理源(名称/串),正确的。



Answer 17:

虽然安装程序的答案是一个很好的答案,它与你没有写软件打交道时,并不总是可行的。 一个简单的答案是创建日志和使用PowerShell命令则New-EventLog事件源( http://technet.microsoft.com/en-us/library/hh849768.aspx )

运行PowerShell中以管理员身份运行以下命令改变了你所需要的日志的名称和来源。

则New-EventLog -LogName 应用 -源TFSAggregator

我用它来解决,当聚集运行事件日志异常从CodePlex上的问题。



Answer 18:

我的应用程序被安装在客户端的Web服务器。 而不是网络服务权限和注册表摆弄,我选择检查SourceExists和运行CreateEventSource在我的安装程序。

我还添加了周围的try / catch log.source = "xx"的应用程序将其设置为一个已知的来源,如果没有创建我的事件源(这只会拿出如果我热插拔一个.dll,而不是重新的安装)。



Answer 19:

解决方法很简单 - 运行在管理员模式下Visual Studio应用程序!



Answer 20:

尝试在web.config中下方

 <system.web>

<trust level="Full"/>

</system.web>


Answer 21:

运行VS.内的应用程序,当我有这个问题 我所要做的就是运行程序作为管理员一次,然后我可以从VS.内运行

要以管理员身份运行,您只要前往debug文件夹在Windows资源管理器。 该程序右键单击并选择以管理员身份运行。



Answer 22:

重建解决方案为我



文章来源: System.Security.SecurityException when writing to Event Log