C# 找不到源,但无法搜索部分或所有事件日志

C# 找不到源,但无法搜索部分或所有事件日志,c#,.net,windows-7,event-log,securityexception,C#,.net,Windows 7,Event Log,Securityexception,我得到以下例外情况。我已在注册表编辑中完全控制Asp.net帐户的事件日志 [SecurityException:未找到源,但找到部分或全部事件 无法搜索日志。无法访问的日志:安全性。] System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly, Boolean wantToCreate) +664 System.Diagnostics.Event

我得到以下例外情况。我已在注册表编辑中完全控制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

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

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


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

以管理员身份启动开发人员命令行。此帐户具有对安全日志的完全访问权限,但有相同的异常。在我的例子中,我必须使用管理员权限运行命令提示符


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

对于我来说,此错误是由于命令提示符未在管理员权限下运行所致。您需要右键单击命令提示符并说“以管理员身份运行”

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

对我不起作用

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

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
Key=HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application\\
字符串EventMessageFile value=C:\Windows\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll

对我来说,刚刚完成了iisreset(以管理员身份运行cmd->iisreset)。也许有人可以试一试

如果您正在IIS上执行SenseNet TaskManagement网站的新安装(来自源代码,而不是WebPI),您将收到此消息,通常与Signal通信相关。由于注册表中的键搜索失败

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


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

关键词:信号器、传感器、regedit、权限

不可访问日志:安全性

新事件源需要在所有日志(包括安全性)中具有唯一名称(读取时需要管理员权限)

因此,您的应用程序需要管理权限才能创建源。但这可能是过火了

我编写了这个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');

我最近经历了这个错误,没有一个解决方案对我有效。对我来说,解决此错误的方法是将应用程序池用户添加到计算机管理中的超级用户组。由于公司策略的原因,我无法使用管理员组。

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

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

Public Shared Function eventLogSourceExists(sSource as String) as Boolean
    Try
        EventLog.LogNameFromSourceName(sSource, ".")
        Return True
    Catch
        Return False
    End Try
End Function

在Windows8上,似乎即使禁用了UAC并且用户是管理员,仍然需要以管理员身份运行VS。这是我案例中的解决方案,对于我来说,仅在第一次以管理员身份运行应用程序就足够了。之后,创建了事件源,应用程序运行良好。这是一个windows如何阻止在OSI中使用嵌入式工具的示例。我刚刚用我在应用程序中使用的源代码名创建了一个新密钥,它成功了。我摸索了大约2个小时,谢谢你,伙计!可能是重复的我张贴了我的答案和版主删除了它。请确保将您的服务作为本地系统运行,而不是其他系统,因为本地系统只能创建事件日志和源。我正在以网络服务的形式运行我的服务,但遇到了此异常。后来我停止了服务并作为本地系统重新启动,它工作正常,之后我停止并重新启动了作为网络服务的服务,它工作正常。我的情况是作为管理员运行Visual Studio 2015。(正在执行Web API项目。)