193

我正在尝试将 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

[剪辑]

这些是我为尝试解决它所做的事情:

  1. 授予“所有人”对密钥的完全访问权限HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security。这行得通。但自然我不能在生产中做到这一点。所以我在运行应用程序几分钟后删除了“所有人”权限,错误再次出现。

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

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

有没有人知道在这里可以做什么?

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

4

23 回答 23

172

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. 授予它读取权限

更新:上述步骤在开发人员机器上是可以的,您不使用部署过程来安装应用程序。
但是,如果您将应用程序部署到其他机器,请考虑按照SailAvidNicole 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")
            }
    }
}
于 2010-06-29T06:13:52.267 回答
61

问题是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\Application但是,如果程序没有管理员权限并且在as下找不到密钥,则以下EventLog.SourceExists行将失败,然后尝试访问EventLog\Security.

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

因此推荐的方法是创建一个安装脚本,它会创建相应的密钥,即:

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]
于 2013-02-23T17:44:21.807 回答
46

解决方案是授予“网络服务”帐户对 EventLog/Security 密钥的读取权限。

于 2009-08-27T04:01:28.077 回答
7

对我来说,只有将“NetworkService”的“读取”权限授予整个“EventLog”分支才有效。

于 2009-12-03T12:22:16.827 回答
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
于 2011-09-21T15:26:59.850 回答
7

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

因此,我以管理员身份开始编译编程序:它注册了事件源。然后我从 VS 内部返回开发和调试没有问题。

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

于 2011-10-18T17:02:08.127 回答
7

我在这里尝试了几乎所有方法来解决这个问题......我在这里分享对我有帮助的答案:

解决问题的另一种方法:

  • 在 IIS 控制台中,转到管理您的站点的应用程序池,并记下运行它的身份(通常是网络服务)
  • 确保此身份可以读取 KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog(右击,授权)
  • 现在将此应用程序池的标识更改为本地系统,应用并切换回网络服务

凭据将被重新加载并且 EventLog 可访问

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

于 2012-01-30T16:41:54.740 回答
5

使用System.Diagnostics.EventLog.WriteEntry("SourceName", "ErrorMessage", EventLogEntryType.Error);

所以基本上你的用户没有创建密钥的权限。根据您在应用程序池高级设置中的身份值使用的用户,可以执行以下操作:

  1. 运行 RegEdit 并转到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
  2. 右键单击 EventLog 键并选择 Permissions... 选项 3.添加具有完全控制访问权限的用户。

    - 如果您使用“NetworkService” ,请添加 NETWORK SERVICE 用户

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

    - 如果您使用“LocalSystem”,请确保用户具有管理员权限。不建议用于漏洞。

  3. 对HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security重复从 1 到 3 的步骤

为了使用 Visual Studio 进行调试,我使用“NetworkService”(它是 ASP.NET 用户),当网站发布时,我使用“AppicationPoolIdentity”。

于 2016-03-28T18:25:19.143 回答
4

我遇到了同样的问题,但我必须上一层,让每个人都可以完全访问 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\ 键,而不是降低安全性,这为我解决了问题。

于 2011-05-25T21:14:35.220 回答
4

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

于 2011-06-08T15:40:00.027 回答
4

似乎确实有一个显而易见的解决方案,我还没有看到一个巨大的缺点,至少在获得管理权限以创建自己的事件源不切实际的情况下:使用已经存在的事件源。

我开始使用的两个是“.Net 运行时”和“应用程序错误”,它们似乎都会出现在大多数机器上。

主要缺点是无法按该事件进行分组,并且您可能没有关联的事件 ID,这意味着日志条目很可能会以“来自源 .Net 的事件 ID 0 的描述”的效果为前缀找不到运行时....”,如果您省略它,但日志会进入,并且输出看起来很合理。

结果代码最终看起来像:

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

当然,由于您总是有可能在没有这些事件源的机器上,无论出于何种原因,您可能想要try {} catch{}包装它以防它失败并使事情变得更糟,但现在可以保存事件。

于 2017-04-19T17:10:51.403 回答
3

仅供参考...我的问题是意外选择了“本地服务”作为 ProcessInstaller 属性的帐户,而不是“本地系统”。只是提到其他遵循 MSDN 教程的人,因为本地服务选择首先显示,我并没有密切关注....

于 2012-02-08T21:54:23.013 回答
2

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

我的决定是“以管理员身份运行”以赋予应用程序更高的权限,并且一切正常。我希望这有助于引导您朝着正确的方向前进。

Windows 2008 是权限/权限/提升与 Windows 2003 真的不同,gar。

于 2009-08-20T17:10:42.833 回答
2

嗨,我在开发应用程序并想将其安装在远程 PC 上时遇到了同样的问题,我通过执行以下操作修复了它:

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

请注意,“(???YOUR_SERVICE_OR_APP_NAME???)”是您在创建 .NET 部署时定义的应用程序服务名称,例如,如果您将新应用程序命名为“我的新应用程序”,则键为: HKLM\System\CurrentControlSet\Services\EventLog\Application\我的新应用

注意 2:根据您写入的事件日志,您可能会在 DEV 框、\Application\(如上所述)或 (\System) 或 (\Security) 上找到,具体取决于您的应用程序写入的事件,主要是, (\Application) 应该一直没问题。

2)在上面的键上,从菜单中;选择“文件”->“导出”,然后保存文件。(注意:当应用程序需要访问此键以写入事件查看器时,这将创建您必要的注册表设置),新文件将是一个 .REG 文件,为了参数起见,将其命名为“My New App.REG "

3) 在 PRODuction 上部署时,请咨询服务器系统管理员 (SA),将“My New App.REG”文件连同应用程序一起交出,并要求 SA 安装此 REG 文件,一旦完成(以管理员身份),这将为您的应用程序创建密钥。

4) 运行您的应用程序,它不需要访问除此密钥以外的任何其他内容。

现在问题应该已经解决了。

原因:

在开发将任何内容写入 EventLog 的应用程序时,如果找不到该密钥,它将在 Eventlog 注册表下需要一个 KEY,它会尝试创建它,然后由于没有权限而失败。上述过程类似于(手动)部署应用程序,而我们是自己创建的,无需头疼,因为您没有通过向每个人添加权限来调整注册表,这对生产服务器来说是一个安全风险。

我希望这有助于解决它。

于 2011-10-04T05:59:39.230 回答
2

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

以管理员身份运行 PowerShell 并运行以下命令,更改您需要的日志名称和源。

New-EventLog -LogName应用程序 -Source TFSAggregator

当聚合器从 codeplex 运行问题时,我用它来解决事件日志异常。

于 2014-12-12T23:23:29.423 回答
1

我遇到了类似的问题-在我的情况下 Source contains <>字符。64 位机器正在使用新的偶数日志 - 我会说这些字符(从字符串设置)创建导致异常的无效 xml。可以说这应该是微软的问题——没有正确处理源(名称/字符串)。

于 2011-04-19T14:51:48.600 回答
1

我们所有 2008 年的服务器都有类似的问题。安全日志完全停止工作,因为 GPO 将组 Authenticated Users 带走并从密钥中读取权限HKLM\System\CurrentControlSet\Services\EventLog\security

根据 Microsoft 的建议将其放回去更正了该问题。我怀疑让所有经过身份验证的用户在更高级别上阅读也可以解决您的问题。

于 2011-11-10T23:31:46.777 回答
1

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

于 2013-08-26T05:18:44.923 回答
0

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

如果没有创建我的事件源,我还在应用程序中添加了一个 try/catchlog.source = "xx"以将其设置为已知源(这只会在我热交换 .dll 而不是重新安装时出现)。

于 2013-07-22T14:31:04.657 回答
0

我有一个控制台应用程序,我还做了一个“发布”来创建一个安装磁盘。
我在 OP 遇到了同样的错误: 错误信息

解决方案是右键单击setup.exe并单击Run as Administrator

这使安装过程具有必要的权限。

于 2021-01-22T22:42:48.937 回答
-1

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

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

于 2011-12-13T15:08:57.923 回答
-1

在 web.config 中尝试以下

 <system.web>

<trust level="Full"/>

</system.web>
于 2016-05-10T09:55:24.033 回答
-3

重建解决方案对我有用

于 2011-12-09T11:24:39.707 回答