写入事件日志 - 找不到源,但无法搜索部分或全部事件日志。无法访问的日志:安全。“

时间:2013-03-21 15:45:46

标签: event-log

我正在尝试将一些消息写入Windows事件日志。

调用函数“SourceExists()”时会抛出(安全性)异常。

private bool CheckIfEventLogSourceExits()
    {
        try
        {
            if (!EventLog.SourceExists(this.BaseEventLog))
            {
                return false;
            }
            return true;
        }
        catch (System.Security.SecurityException)
        {
            return false;
        }
    }

此问题的所有答案都解释了如何手动解决问题。 就像这里:Stackoverflow Thread。解决方案是更改一些注册表项

但是你不能指望消费你的应用程序的每个人都知道这些变化。

所以我的问题是,我们如何以编程方式解决这个问题?

在我的代码下面:

 try
            {
                string sLog = "Application";
                if (CheckIfEventLogSourceExits())
                {
                    EventLog.CreateEventSource(this.BaseEventLog, sLog);
                }

                EventLog.WriteEntry(this.BaseEventLog, message, eventLogEntryType);
            }
            catch (Exception ex)
            {
                ex.Source = "WriteToEventLog";
                throw ex;
            }

2 个答案:

答案 0 :(得分:-1)

我在新服务器上安装webapp时遇到了类似的问题。 webapp使用的是nettiers(v.1.1),我认为安全例外 说明:应用程序尝试执行安全策略不允许的操作。要授予此应用程序所需的权限,请与系统管理员联系或在配置文件中更改应用程序的信任级别。

异常详细信息:System.Security.SecurityException:找不到源,但无法搜索部分或全部事件日志。要创建源,您需要具有读取所有事件日志的权限,以确保新源名称是唯一的。无法访问的日志:安全性。

堆栈跟踪: [SecurityException:找不到源,但无法搜索部分或全部事件日志。要创建源,您需要具有读取所有事件日志的权限,以确保新源名称是唯一的。无法访问的日志:安全。]    System.Diagnostics.EventLog.FindSourceRegistration(String source,String machineName,Boolean readOnly,Boolean wantToCreate)+657    System.Diagnostics.EventLog.SourceExists(String source,String machineName,Boolean wantToCreate)+104    System.Diagnostics.EventLogInternal.VerifyAndCreateSource(String sourceName,String currentMachineName)+86    System.Diagnostics.EventLogInternal.WriteEntry(String message,EventLogEntryType type,Int32 eventID,Int16 category,Byte [] rawData)+201    System.Diagnostics.EventLog.WriteEntry(String message,EventLogEntryType type)+21    Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.PerformanceCounterInstances.ReportCounterFailure(String message)+141    Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.PerformanceCounterInstances..ctor(String categoryName,String counterName,Boolean createNewInstance)+439    Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.InstrumentedEvent.AddPerformanceCounter(String category,String [] counterNames,Boolean createNewInstance)+169    Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.InstrumentedEvent.Initialize(String counterCategory,String [] counterNames,Boolean createNewInstance,String eventLogSource,EventLogIdentifier [] eventIds)+168    Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.InstrumentedEvent..ctor(String counterCategory,String [] counterNames,Boolean createNewInstance,String eventLogSource,EventLogIdentifier [] eventIds)+59    Microsoft.Practices.EnterpriseLibrary.Data.Instrumentation.DataServiceEvent..ctor(String [] counterNames,EventLogIdentifier [] eventLogIds)+140    Microsoft.Practices.EnterpriseLibrary.Data.Instrumentation.DataConnectionFailedEvent..ctor(String [] counterNames,EventLogIdentifier [] eventLogIDs)+39    Microsoft.Practices.EnterpriseLibrary.Data.Instrumentation.DataConnectionFailedEvent..cctor()+248

我的解决方案是在注册表中手动输入以下两个键和字符串:

HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\事件日志\应用程序\

新密钥:企业库数据服务 键入:名称:EventMessageFile,类型:REG_EXPAND_SZ,数据:C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ EventLogMessages.dll

新密钥:企业库工具 键入:名称:EventMessageFile,类型:REG_EXPAND_SZ,数据:C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ EventLogMessages.dll

答案 1 :(得分:-2)

我知道这篇帖子已经太晚了,但我从类似的经验中得出的答案是,你所运行的服务没有机器的管理权限,因此无法写入日志。

很容易弄清楚应用是否在管理员权限下运行。您可以在代码中添加类似这样的内容,并在消息框中建议用户运行“admin”。

private void GetServicePermissionLevel()
{
bool bAdmin = false;
try {
    SecurityIdentifier sidAdmin = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
    AppDomain myDomain = Thread.GetDomain();
    myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
    WindowsPrincipal myPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
    if (myPrincipal.IsInRole(sidAdmin)) {
        bAdmin = true;
    } else {
        bAdmin = false;
    }
} catch (Exception ex) {
    throw new Exception("Error in GetServicePermissionlevel(): " + ex.Message + " - " + ex.StackTrace);
} finally {
    _ServiceRunAsAdmin = bAdmin;
}
}