2013-10-30 29 views
1

如何在不使用try catch的情况下验证事件日志写入权限?我已阅读以下问题:Checking Event Log writing Permissions without writing an entry,但答案建议使用EventLogPermissionAttribute。据我所知,我不能用它来验证权限,它只是在没有请求的权限时抛出一个Exception验证事件日志写入权限

我的代码现在看起来是这样的:

public void WriteMessage(string message) 
{ 
    try { 
     var trace = new TraceSource("MySource"); 
     trace.TraceEvent(TraceEventType.Information, 1000, message); 
    } catch() { 
     var log = LogManager.GetLogger<MyClass>(); 
     log.Info(message); 
    } 
} 

不过,我想是这样的:

public void WriteMessage(string message) 
{ 
    if(EventLogPermission("MySource")) 
    { 
     var trace = new TraceSource("MySource"); 
     trace.TraceEvent(TraceEventType.Information, 1000, message); 
    } else { 
     var log = LogManager.GetLogger<MyClass>(); 
     log.Info(message); 
    } 
} 

Ofcourse在结束它并没有太大的差别,但使用尝试捕捉因为逻辑只是感觉肮脏。

+1

我寻找一个非try-catch选项,但还没有找到替代方案。所以,试一下就可以了,除此之外,如果可能的话,这不应该被视为可接受的程序流程。 – Hans

+2

另外,在某些语言中(例如python),在某些情况下,异常是处理某些*异常*条件的首选方式。这只是一种不同的方法:LBYL(看你跳跃之前)vs EAFP(比容许更容易要求原谅)。 – J0HN

+0

谢谢@ J0HN从不同的角度获得不同的观点总是很好的。 –

回答

1
[DllImport("advapi32.dll", CharSet = CharSet.Auto)] 
    public static extern int RegOpenKeyEx(
     UIntPtr hKey, 
     string subKey, 
     int ulOptions, 
     int samDesired, 
     out UIntPtr hkResult); 

    public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u); 
    public static int KEY_WRITE = 0x20006; 

    /// <summary> 
    /// This method checks write permissions to HKLM\SYSTEM\CurrentControlSet\Services\EventLog which is necessary to create event log source 
    /// </summary> 
    /// <returns>True if permission to create Event log source is granted, false if not</returns> 
    public bool HasCurrentUserEventLogWritePermissions() 
    { 
     UIntPtr x; 
     long err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, @"SYSTEM\CurrentControlSet\Services\EventLog", 0, KEY_WRITE, out x); 
     return err == 0; 
    } 
+0

哈这是一个很好的方式来摆脱try catch,但毕竟我们仍然检查是否在打开密钥时发生错误。 +1来获得尝试抓住,但我实际上正在寻找一种方法,在尝试打开它之前验证权限。 –

+1

我相信这会降低代码的速度 - 这个检查需要比try-catch或RegOpenEx更长的时间...我很高兴你喜欢这个笑话... –

0

好的。我放弃了,这只是为了告诉你失败的尝试。我搜索了一下,反映了一点,答案令人失望:你不能按照你喜欢的方式来做。

我试图找到一种方法来检查EventLogPermission(安全权限一般),但没有得到异常:FAILED。

试图打开RegKey而没有发生异常:FAILED。

其实有unmanaged APIs在那里,可能是有用的,但我认为,如果你的应用程序甚至缺乏EventLogPermission谁给它SecurityUnmngdCodeAccess