未找到源,但无法搜索部分或全部事件日志

我得到了下面的例外。我已经给予完全控制 Asp.net 帐户的 Eventlog 在注册表编辑。

[ 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

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

177781 次浏览

EventLog.SourceExists枚举 HKLM\SYSTEM\CurrentControlSet\services\eventlog的子键,以查看它是否包含具有指定名称的子键。如果运行代码的用户帐户在找到目标源之前不能读取它试图访问的子键(在您的例子中是 Security子键) ,那么您将看到一个类似您所描述的异常。

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

启动开发人员命令行“作为管理员”。此帐户可以完全访问安全日志

具有相同的异常。在我的情况下,我必须使用管理员权限运行命令提示符。

在开始菜单中,右键单击命令提示符,选择“作为管理员运行”。

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

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

不适合我。

我创建了一个新的键和字符串值,并设法让它工作

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

对我来说,我刚刚使用了 iisreet (作为管理员运行 cmd-> iisreet) ,也许有人可以尝试一下。

如果在 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、权限

无法访问的日志: 安全性

新的事件源需要在所有日志(包括 保安)中包含 一个独特的名字(在读取时需要管理员特权)。

所以你的应用程序需要 行政特权来创建一个源代码,但是这可能有点过了。

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

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

如果您只是想嗅探本地机器上是否存在 Source,但是无法获得授权,那么您可以通过下面的示例(VB)使用它。

类似地,您可以修改此函数以返回 Source 的 LogName。

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

如果在事件查看器中看到来自 Application源的错误消息:

无法记录.NET 应用程序事件

那么很有可能你的应用根本不会创建事件日志源,而只是使用它,因为从来没有发现你需要自己创建源。下面是在 PowerShell 中创建源代码的命令:

New-EventLog-Source“ AppName”-LogName“ Application”