我正在尝试将一些消息写入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;
}
答案 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;
}
}