2013-10-30 30 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