2013-10-30 3 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); 
    } 
} 

말은 큰 차이 만들하지 않습니다하지만 시도 캐치를 사용하여 논리가 단지 더럽다고 느낀다.

+1

나는 try-catch가 아닌 옵션도 찾았지만 대안을 찾지 못했습니다. 따라서 가능한 경우이를 허용 가능한 프로그램 흐름으로 보아서는 안된다는 면책 조항과 함께 시도해보십시오. – Hans

+2

또한 일부 언어 (예 : Python)의 일부 예외는 일부 * 예외적 인 * 조건을 처리하는 데 선호됩니다. 그것은 단지 다른 접근 방식입니다 : LBYL (당신이 도약하기 전에보십시오) 대 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

Ha 이것은 try catch를 없애기위한 좋은 방법이지만, 결국 열쇠를 여는 동안 오류가 발생했는지 여전히 확인하고 있습니다. +1 시도 잡기를 얻으려고하지만, 실제로 그것을 열려고하기 전에 권한을 확인하는 방법을 찾고있었습니다. –

+1

이 코드가 속도가 느려질 것이라고 생각합니다.이 체크는 try-catch 또는 RegOpenEx보다 오래 걸릴 것입니다 ... 나는이 농담을 좋아했기 때문에 기쁩니다 ... –

0

확인. 나는 실패한 시도를 당신에게 말해주기 위해 이것을 포기합니다. 나는 조금 더 조사했고 조금 더 반영했고 대답은 실망 스럽다. 당신이 좋아하는 방식으로 이것을 할 수는 없다.

예외가 발생하지 않고 EventLogPermission (보안 권한이 일반적으로) 검사하는 방법을 찾으려고 시도했습니다 : FAILED.

예외없이 RegKey를 열려고 시도했습니다 : FAILED.

밖에 사실 unmanaged APIs에서 그 유용 할 수 있습니다,하지만 난 당신의 응용 프로그램이 SecurityUnmngdCodeAccess 줄 것이다 사람도 EventLogPermission이 부족하면 생각?