2009-08-13 113 views
174

我正在尝试将Server应用程序从Server 2003(和IIS6)移植到Server 2008(IIS7)。写入事件日志时发生System.Security.SecurityException

当我尝试并参观浏览器上的网页我得到这个:

Server Error in ‘/’ Application.

Security Exception

Description: The application attempted to perform an operation not allowed by the security policy. To grant this application the required permission please contact your system administrator or change the application’s trust level in the configuration file.

Exception Details: System.Security.SecurityException: The source was not found, but some or all event logs could not be searched. Inaccessible logs: Security

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and the location of the exception can be identified using the exception stack trace below.

Stack Trace:

[SecurityException: The source was not found, but some or all event logs could not be searched. Inaccessible logs: Security.]

System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly) +562 System.Diagnostics.EventLog.SourceExists(String source, String machineName) +251

[snip]

这是我做过尝试,并解决它的东西:

  1. 给“所有人”完全访问权限的密钥HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security。这工作。但自然,我无法在生产中做到这一点。所以我在运行应用程序几分钟后删除了“Everyone”权限,并且错误再次出现。

  2. 我在安装时使用提升的权限在应用程序日志和安全日志中创建了源(并且我通过regedit验证了它),但错误依然存在。

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

有没有人有一个洞察力,可以在这里做什么?

PS:这是question的后续行动。我遵循了给定的答案,但无济于事(参见上面的#2)。

+0

我在尝试写入作为NetworkService运行的.Net服务中的自定义源时遇到此问题。我只是将事件日志源更改为与通过.Net服务安装程序包安装的服务名称匹配,并且它在没有设置注册表权限的情况下工作。我注意到它通过查看服务名称已经在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application – 2011-03-31 18:10:36

+1

中的一个键相关的:http://stackoverflow.com/questions/286060/what-do-i-need-to-change -to-alllow-my-iis7-asp-net-3-5-application-to-create-an/7848414#7848414 – 2015-04-05 18:06:48

+0

另一个可能的答案:右键单击exe并选择“以管理员身份运行” – MacGyver 2016-01-21 08:15:23

回答

43

解决方法是在EventLog/Security密钥上给出“网络服务”帐户读取权限。

+1

我看到类似的解决方案。但我只是想知道为什么它是这样的。因为我可以看到很多服务以NetworkService身份登录,并且必须能够读取事件日志/安全性。那么为什么需要为NetworkService添加权限? – 2011-04-14 11:04:18

+11

对于那些通常无法通过注册表爬行的人,此链接可能会有帮助:http://social.msdn.microsoft.com/forums/en-US/windowsgeneraldevelopmentissues/thread/00a043ae-9ea1-4a55-8b7c -d088a4b08f09/ – Allan 2011-07-21 17:30:48

+0

不错的链接艾伦。接受答案的第3点很重要,并且已经咬过我一次。即,在父EventLog注册表项授予权限不会传播到“无法访问的日志”,如安全和虚拟服务器,即使它们是注册表中的子键。如果您想要完整的事件日志访问权限,您必须在父级事件日志级别和子级安全级别上授予权限。 – 2012-03-13 20:47:16

2

我不是在IIS上工作,但我确实有一个应用程序在2K8盒子上引发相同的错误。它在2K3盒子上工作得很好,去图。

我的解决方案是“以管理员身份运行”以赋予应用程序更高的权限,并且所有事情都可以愉快地工作。我希望这有助于你朝着正确的方向前进。

Windows 2008是权限/权限/高程真的不同于Windows 2003,gar。

7

对我来说,授予'NetworkService'的'读'权限为,整个'EventLog'分支都有效。

+0

这是不相关的,因为像“安全”或“虚拟服务器”这样的子密钥需要单独授予读访问权限,因为权限已被设置为不能从父密钥继承。 – Serge 2014-10-14 12:06:48

164

为了让在EventLog/Security键(如Firenzi和royrules22建议)Network Service读取权限,遵循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. 给它读取权限

更新:以上步骤在开发人员计算机上都可以,您不需要使用部署过程来安装应用程序。
但是,如果您将应用程序部署到其他机器,请考虑在安装时注册事件日志源,如SailAvid'sNicole Calinoiu's答案中建议的那样。

我使用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") 
      } 
    } 
} 
+1

IIS7中正确的用户名是“NETWORK SERVICE”。 – Fueled 2012-12-24 15:05:16

+0

在IIS7中,您可以将“NETWORK SERVICE”分配为应用程序池的标识(您可能会发现ApplicationPoolIdentity是默认值),或者您可以为每个应用程序池创建一个新用户,并在该“自定义帐户”上设置权限。请参阅[指定应用程序池的标识(IIS 7)](http://technet.microsoft.com/zh-cn/library/cc771170(v = ws.10).aspx) – Grokodile 2013-03-04 23:25:57

+5

更改仅在您在IIS – 2013-04-01 19:12:24

1

我打了类似的问题 - 在我的案件来源包含<>字符。 64位机器正在使用新的偶数日志 - xml基础我会说,这些字符(从字符串设置)创建无效的XML导致异常。可以说这应该考虑微软的问题 - 不正确处理源(名称/字符串)。

4

我遇到了同样的问题,但我不得不上升到一个级别,并让所有人都能够完全访问HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ key,而不是下降到安全性,问题给我。

+1

另请尝试将应用程序设置为以LocalSystem身份运行,以便创建注册表项,然后可以在之后更改回NetworkService。 – demoncodemonkey 2013-06-13 21:46:29

+1

请参阅http://stackoverflow.com/a/17097799/61697 – demoncodemonkey 2013-06-13 21:54:14

3

Windows 7 64位上的相同问题。 以管理员身份运行解决了问题。

+0

这解决了我的问题,谢谢。 – TombMedia 2016-08-19 15:42:53

5

对于我而言,.NET控制台应用程序作为计划任务运行时发生了这种异常,我试图做的事情基本相同 - 创建新的事件源并写入事件日志。

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

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

谢谢,它的作品适合我。 – 2014-08-27 12:58:07

+3

你节省了我的一天。顺便说一下,'eventlog \ Application'和'eventlog \ Security'上的读取权限是足够的;仅在'eventlog'根目录上需要完全控制。 – 2014-09-19 10:28:28

2

您好我遇到了同样的问题,当我开发一个应用程序并希望将其安装在远程PC上,我通过执行以下操作来修复它:

1)转到您的注册表,找到:HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application(???YOUR_SERVICE_OR_APP_NAME ???)

请注意,“(??? YOUR_SERVICE_OR_APP_NAME ???)”是您在创建.NET部署时定义的应用程序服务名称,例如,如果您将新应用程序命名为“我的注意2:根据你正在写入的事件日志,你可以在你的DEV盒子上找到\ Application \ ApplicationLog \ HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application \ My New app

注意: (如上所述),或者也可以是(\ System)或(\ Security),具体取决于您的应用程序正在写入什么事件,大多数情况下(\ Application)应该始终处于良好状态。

2)正在上面的按键,从菜单;选择“文件” - >“导出”,然后保存该文件。 (注意:当应用程序需要访问此密钥才能写入事件查看器时,这将创建必要的注册表设置),新文件将成为.REG文件,因此,将其称为“My New App.REG “

3)在PRODuction上部署时,请咨询服务器的系统管理员(SA),将”我的新App.REG“文件与应用程序一起移交,并要求SA在完成后安装此REG文件作为管理员),这将为您的应用程序创建关键。

4)运行你的应用程序,它不应该访问除此键以外的任何其他内容。

问题现在应该解决。

原因:

当开发写入任何事件日志的应用程序,则需要根据事件日志注册表下的Key,如果该键没有找到,它会尝试创建它,然后失败因为没有权限这样做。上述过程类似于部署应用程序(手动),而我们自己创建这个应用程序,并且不需要头痛,因为您不通过为生产服务器上的安全风险添加对每个人的权限来调整注册表。

我希望这有助于解决它。

7

我有一个非常类似的问题,我在VS2010下开发的控制台程序(从XP下升级到VS2008) 我的prog使用EnLib做一些日志记录。 错误被解雇,因为EntLib没有注册新事件源的权限。

于是我就开始我的一次编译前卫作为管理员:它注册的事件源。 然后我从VS里面开发和调试,没有问题。

(您也可以参考http://www.blackwasp.co.uk/EventLog_3.aspx,它帮助我

1

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

把每微软的建议,这回纠正这个问题。我怀疑给所有授权用户读取处于较高的水平还会纠正你的问题。

-3

重建解决方案为我

-1

我在VS中运行应用程序时遇到了此问题。我所要做的只是以管理员身份运行该程序一次,然后我可以在VS内运行。

要以管理员身份运行,只需在Windows资源管理器中导航到您的调试文件夹即可。右键单击该程序并选择以管理员身份运行。

6

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

Another way to resolve the issue :

  • in IIS console, go to application pool managing your site, and note the identity running it (usually Network Service)
  • make sure this identity can read KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog (rigth-click, authorisations)
  • now change the identity of this application pool to Local System, apply, and switch back to Network Service

Credentials will be reloaded and EventLog reacheable

http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx

,感谢迈克尔Freidgeim

+3

你的第三颗子弹对我来说就像是一种魅力。 – Anicho 2013-02-08 11:08:58

+0

将应用程序池从“ApplicationPoolIdentity”更改为“LocalSystem”解决了为我创建/读取事件日志的问题。 – majestzim 2016-08-18 15:54:05

3

FYI ...我的问题是意外地选择“本地服务”作为ProcessInstaller的属性上的帐户而不是“本地系统”。只是提到任何谁按照MSDN教程作为本地服务的选择显示第一,我没有密切关注的人......

45

问题是,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\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App

人们可以删除这些两行。

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

Windows Registry Editor Version 5.00 

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

这正是我为我所有的服务所做的。我相信这是正确的。在我使用事件日志的每个服务中,我都有一个。reg文件就像上面那个一样。有一点需要注意,该文件必须保存为Unicode-32(cp 1200)。 – Valo 2015-06-25 04:35:47

+0

这个答案描述了错误背后的真正原因。检查存在尝试枚举整个密钥。如果存在,checkExists可以正常工作。 – DanO 2015-07-29 16:40:49

+0

EventLog \ Security这是功能的关键,确保你有权限。 – Princa 2016-08-31 18:28:19

0

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

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

0

解决方案非常简单 - 在管理模式下运行Visual Studio应用程序!

+0

在管理模式下运行,仍然会出现此错误。 – 2014-08-25 21:56:28

+0

当在VS中排除故障并得到这个错误,这确实为我解决了这个问题 – wruckie 2015-02-01 00:16:15

+0

这将错误,因为它不是VS调用这个调用,它是可能运行在不同的安全上下文中的应用程序。 – CodeMonkey1313 2015-03-12 12:25:51

1

尽管安装程序的答案是一个很好的答案,但在处理您没有编写的软件时并不总是实用。一个简单的答案是创建日志和使用PowerShell命令则New-EventLoghttp://technet.microsoft.com/en-us/library/hh849768.aspx

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

则New-EventLog -LogName 应用 - 源TFSAggregator

我用它来从CodePlex上解决Event Log Exception when Aggregator runs问题。

3

使用时,需要在regEdit的HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Application下创建使用源名称的新密钥System.Diagnostics.EventLog.WriteEntry(“SourceName”,“ErrorMessage”, EventLogEntryType.Error);

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

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

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

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

    - 如果您使用的是“LocalSystem”请确保该用户具有管理员权限。不建议安全漏洞。

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

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

0

下面尝试在web.config中

<system.web> 

<trust level="Full"/> 

</system.web> 
1

是否有似乎是一个有目共睹的解决这个,我还没有看到一个巨大的缺点,至少它是不实际获得管理权限为了创建自己的事件源:使用已经存在的事件源。我已经开始使用的是“.NET运行时”和‘应用程序错误’,

两个两者看起来他们将出席在大多数机器上。

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

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

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

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