找不到源,但是无法搜索某些或所有事件日志


125

我收到以下异常。我已经完全控制了注册表编辑器中Eventlogs上的Asp.net帐户。

[SecurityException:找不到源,但是无法搜索某些或所有事件日志。无法访问的日志:安全性。]

System.Diagnostics.EventLog.FindSourceRegistration(String source,  String machineName, Boolean readOnly, Boolean wantToCreate) +664
System.Diagnostics.EventLog.SourceExists(String source, String machineName, Boolean wantToCreate) +109
System.Diagnostics.EventLog.SourceExists(String source) +14 Microsoft.ApplicationBlocks.ExceptionManagement.DefaultPublisher.VerifyValidSource() +41

我猜这是由于服务器上的某些配置问题引起的?



我发布了答案,主持人删除了它。请确保将您的服务作为本地系统运行,而不要作为其他系统运行,因为本地系统只能创建事件日志和源。我将服务作为网络服务运行,并遇到了此异常。后来,我停止了服务,然后重新启动为本地系统,它运行良好,此后,我停止并重新启动了我的服务作为网络服务,然后它运行正常。
Ziggler

Answers:


105

EventLog.SourceExists枚举的子项,HKLM\SYSTEM\CurrentControlSet\services\eventlog以查看其是否包含具有指定名称的子项。如果运行代码的用户帐户在Security找到目标源之前没有对它试图访问的子项(在您的情况下为子项)的读取权限,则将看到类似您所描述的异常的信息。

处理此类问题的常用方法是在安装时注册事件日志源(使用管理员帐户),然后假定它们在运行时存在,如果目标事件日志源实际上不存在,则允许将任何导致的异常视为意外事件在运行时。


26
在Windows 8上,似乎即使禁用了UAC并且用户是Administrator,仍然有必要以Admin身份运行VS。这就是我的案子的解决方案
itsho 2013年

2
对我来说,仅第一次以管理员身份运行该应用程序就足够了。之后,事件源已创建,应用程序运行良好。
thomaskonrad

2
这是一个有关如何使用OS中的嵌入式工具阻止Windows的示例
Felice Pollano

67

有同样的例外。就我而言,我必须使用管理员权限运行命令提示符。

从“开始”菜单中,右键单击“命令提示符”,选择“以管理员身份运行”。


2
我的情况是以管理员身份运行Visual Studio 2015。(正在做一个Web API项目。)
Kevin .NET

9

对我来说,此错误是由于命令提示符所引起的,该命令不在管理员权限下运行。您需要右键单击命令提示符,然后说“ 以管理员身份运行 ”。

您需要管理员角色才能安装或卸载服务。


我已经摸索了大约2个小时,谢谢队友!
Mox Shah

8

启动开发人员命令行“作为管理员”。此帐户具有对安全日志的完全访问权限


6

没有为我工作。

我创建了一个新的键和字符串值,并设法使其正常工作

Key= HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application\<Your app name>\
String EventMessageFile value=C:\Windows\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll

我也一样 我刚刚使用应用程序内部使用的源名称创建了一个新密钥,并且该密钥有效。
Campinho


1

无法访问的日志:安全性

一个新的事件源在所有日志(包括安全性)中都必须具有唯一的名称(读取时需要管理员特权)。

因此,您的应用将需要管理员权限才能创建源。但这可能是一个过大的杀伤力。

我编写了此powershell脚本随意创建事件源。将其另存为*.ps1并以任何特权运行,它将自动提升。

# CHECK OR RUN AS ADMIN

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{   
    $arguments = "& '" + $myinvocation.mycommand.definition + "'"
    Start-Process powershell -Verb runAs -ArgumentList $arguments
    Break
}

# CHECK FOR EXISTENCE OR CREATE

$source = "My Service Event Source";
$logname = "Application";

if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) {
    [System.Diagnostics.EventLog]::CreateEventSource($source, $logname);
    Write-Host $source -f white -nonewline; Write-Host " successfully added." -f green;
}
else
{
    Write-Host $source -f white -nonewline; Write-Host " already exists.";
}

# DONE

Write-Host -NoNewLine 'Press any key to continue...';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');

1

我最近遇到了该错误,没有一种解决方案对我有用。对我来说,解决该错误的方法是将应用程序池用户添加到计算机管理中的“高级用户”组。由于公司政策,我无法使用管理员组。


0

如果您正在IIS上执行SenseNet TaskManagement网站的新安装(从源代码而不是WebPI),您将收到此消息,通常与SignalR通信有关。正如@ nicole-caliniou指出的,这是由于注册表中的键搜索失败。

要解决SenseNet TaskManagement v1.1.0的问题,请首先在web.config文件中找到注册表项名称。默认情况下为“ SnTaskWeb”。

 <appSettings>
   <add key="LogSourceName" value="SnTaskWeb" />

打开注册表编辑器regedit.exe,然后浏览到HKLM\SYSTEM\CurrentControlSet\Services\EventLog\SnTask。右键单击SnTask并选择New Key,然后SnTaskWeb为上面显示的配置命名。然后右键单击该SnTaskWeb元素,然后选择New Expandable String Value。名称应为EventMessageFile,值数据应为C:\Windows\Microsoft.NET\Framework\v4.0.30319\EventLogMessages.dll

关键字:Signalr,Sensenet,regedit,权限


0

如果您只是想嗅探本地计算机上是否存在Source,但没有获得执行此操作的授权的权限,则可以通过以下示例(VB)进行操作。

这绕过了安全错误。您可以类似地修改此函数以返回源的LogName。

Public Shared Function eventLogSourceExists(sSource as String) as Boolean
    Try
        EventLog.LogNameFromSourceName(sSource, ".")
        Return True
    Catch
        Return False
    End Try
End Function
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.