2014-03-12 5 views
-1

내가 관리자 인 계정에서이 코드를 실행하고 있습니다 :CreateEventSource도 관리자 계정에서 예외를 생성

if (EventLog.Exists("AppName") == false) 
    EventLog.CreateEventSource("AppName", "Application"); // exception here 

그것은 SecurityException가 발생합니다 :

"소스를 찾을 수 없습니다,하지만 일부 또는 모든 이벤트 로그를 검색 할 수 없습니다. 소스를 만들려면 모든 이벤트 로그를 읽을 수있는 권한이 있어야 새 소스 이름이 고유해야합니다. 액세스 할 수없는 로그 : 보안. "

내가이 일을하지 않고 이벤트 로그에 이벤트를 기록 할 수 있지만 로그에서이 엉터리보고 텍스트가 포함이 :. 제기

"소스 응용 프로그램에서 이벤트 ID 0에 대한 설명을 찾을 수 없습니다 어느 구성 요소 이 이벤트가 로컬 컴퓨터에 설치되어 있지 않거나 설치가 손상되었습니다. 로컬 컴퓨터에 구성 요소를 설치하거나 복구 할 수 있습니다. "

무엇이 누락 되었습니까?

+0

당신을 했을 HKLM \ System \ CurrentControlSet \ Services \ Eventlog 레지스트리 키에 대한 사용 권한을 확인 하시겠습니까? 어쩌면 아이 키? – schglurps

+0

나는 모든 권한을 가진 관리자입니다. 어떤 경우에도 다른 시스템에 배포 할 때 작동해야하며 관리자가 실행해야합니다. 그것은 레지스트리와 함부로 광고하지 않고 작동합니다. –

답변

2

이 문제를 처리하는 가장 좋은 방법이지만,이 작품과 내가 더 나은 솔루션을 찾을 수 있다면 나도 몰라 : 여기 호출

// ---- Create Event Log Source --------------------------------- 
// 
// returns True if is it created or already exists. 
// 
// Only administrators can create event logs. 

static public bool CreateEventLogSource() 
{ 
    System.Diagnostics.Debug.WriteLine("CreateEventLogSource...."); 

    try 
    { 
     // this call is looking for this RegKey: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\EventLog\Application\<app Name> 
     if (EventLog.SourceExists(Application.ProductName)) 
     { 
      System.Diagnostics.Debug.WriteLine("Log exists, returning true."); 
      return true; 
     } 
    } 
    catch (System.Security.SecurityException) 
    { 
     // it could not find the EventLog Source and we are not admin so this is thrown 
     // when it tries to search the Security Log. 
     // We know it isn't there so ignore this exception 
    } 

    System.Diagnostics.Debug.WriteLine("EventLog Source doesn't exist....try to create it..."); 

    if (new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)) 
    { 
     System.Diagnostics.Debug.WriteLine("Running as Admin....trying to create...."); 
     try 
     { 
      EventLog.CreateEventSource(Application.ProductName, "Application"); 

      System.Diagnostics.Debug.WriteLine("Successfully create EventLogSource"); 
      return true; 
     } 
     catch (Exception Exp) 
     { 
      MessageBox.Show("Error Creating EventLog Source: " + Exp.Message, Application.ProductName); 
      return false; 
     } 
    } 
    else 
    { 
     System.Diagnostics.Debug.WriteLine("Need to restart with admin roles"); 

     ProcessStartInfo AdminProcess = new ProcessStartInfo(); 
     AdminProcess.UseShellExecute = true; 
     AdminProcess.WorkingDirectory = Environment.CurrentDirectory; 
     AdminProcess.FileName = Application.ExecutablePath; 
     AdminProcess.Verb = "runas"; 

     try 
     { 
      Process.Start(AdminProcess); 
      return false; 
     } 
     catch 
     { 
      MessageBox.Show("The EventLog source was NOT created", Application.ProductName); 
      // The user refused to allow privileges elevation. 
      return false; 
     } 
    } 
} 

:

static void Main(string[] args) 
{ 
    if (CreateEventLogSource() == false) 
      return;