2009-10-22 12 views
9

Mam bibliotekę, którą utworzyłem z pewną logiką biznesową, która obejmuje zapis do instancji System.Diagnostics.EventLog. Biblioteka jest zwykle wywoływana z aplikacji Windows Service, ale teraz próbuję wywołać te same funkcje biblioteki z mojej aplikacji ASP.NET MVC.Wyjątek zabezpieczeń podczas zapisywania do Dziennika zdarzeń z aplikacji ASP.NET MVC

Próbowałem ten kod w moim kontrolerze, aby utworzyć instancję EventLog, którą przekazuję do metody, która musi zapisać w dzienniku.

Dim log = New EventLog("Application", My.Computer.Name, "MyMVCApp") 

następujący błąd jest generowany, gdy kod w metodzie biblioteki próbuje pisać do dziennika:

[SecurityException: Requested registry access is not allowed.] 
System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) +51 
Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) +7462217 
System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData) +366 
System.Diagnostics.EventLog.VerifyAndCreateSource(String sourceName, String currentMachineName) +194 
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData) +205 
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type) +14 

Moja aplikacja internetowa jest uruchomiona jako użytkownik usługi sieciowej w systemie Windows Server 2003 z usługami IIS 6 Czy jest coś, co muszę zrobić, aby umożliwić użytkownikom usługi sieciowej dostęp do rejestru?

Czy istnieje lepszy sposób utworzenia instancji EventLog do użycia w aplikacji ASP.NET MVC? Czy istnieje już stworzony przez ramy, które po prostu muszę odwołać?

Odpowiedz

19

Od MSDN: „Aplikacje działające z wykorzystaniem Usługa sieciowa tożsamość może zapisywać do dziennika zdarzeń za pomocą istniejących źródeł zdarzeń, ale nie można tworzyć nowych źródeł zdarzeń z powodu niewystarczających uprawnień rejestru.”

I ...

Jeśli źródło w dzienniku zdarzeń związany z instancją EventLog nie istnieje, zostanie utworzony nowy źródło zdarzenia.

Tak wygląda wydarzenia źródło dziennika nie istnieje i próbuje utworzyć nowe źródło dziennika zdarzeń za pomocą usługi Network Service User (która wymaga zapisania w rejestrze, więc nie będzie działać).

„Aby włączyć aplikację ASP.NET zapisu do dziennika zdarzeń przy użyciu źródła zdarzenia, który jeszcze nie istnieje, masz dwie opcje:”

  • Tworzenie nowych źródeł zdarzeń, przy zastosowaniu zainstalować czas
  • Ręcznie utwórz nowy wpis źródła zdarzenia w rejestrze.

Potrzebne jest więc utworzenie dziennika poza aplikacją (nie można tego zrobić programowo z tym użytkownikiem, wykonaj to ręcznie lub utwórz prostą aplikację z wierszem poleceń, aby uprościć instalację).

Aby uzyskać szczegółowe informacje:

http://msdn.microsoft.com/en-us/library/ms998320.aspx#paght000015_eventlogaccess

Osobiście polecam, aby nie zmieniać uprawnienia użytkowników sieci, ale raczej tworzyć źródło dziennika poza aplikacją internetową. Moją preferencją jest aplikacja konsolowa (która zajmie ci około 5 minut do napisania i którą możesz również wykorzystać do przygotowania innych maszyn). Uruchom nową aplikację konsoli w VS.NET i dodaj kod, aby utworzyć źródła dzienników.Przykład:

http://www.dotnetspider.com/resources/23593-Create-Event-log-VB-NET.aspx

Następnie wystarczy uruchomić aplikację konsoli z linii cmd, po zalogowaniu się z odpowiednimi uprawnieniami.

5

Jeśli nie masz pewności, jakie źródło zdarzenia próbuje utworzyć, powyższa zaakceptowana odpowiedź będzie trudna do wykrycia.

Prostszym rozwiązaniem byłoby przełączenie puli aplikacji w celu tymczasowego użycia LocalSystem, a następnie uruchomienie aplikacji i wygenerowanie błędu. Będzie w stanie utworzyć odpowiednie źródło dziennika zdarzeń, a następnie można go przełączyć z powrotem do usługi NetworkService.

0

Nie wiem, dlaczego nie można utworzyć własnego dziennika zdarzeń zamiast pisać w dzienniku aplikacji.

Możesz stworzyć aplikację okna/konsoli z następującym kodem i uruchomić ją jako administrator, utworzy to dla ciebie nowy log.

if (!EventLog.Exists("LOG_NAME")) 
    EventLog.CreateEventSource("LOG_NAME", "LOG_NAME"); 

spowoduje to utworzenie nowego dziennika w dzienniku zdarzeń i będzie widoczny w dziennikach aplikacji i usług.

if (!EventLog.SourceExists("MyMVCApp")) 
    EventLog.CreateEventSource("MyMVCApp", "LOG_NAME"); 

Spowoduje to utworzenie nowego źródła wewnątrz zwyczaju „LOG_NAME” i można skorzystać z kodu

Dim log = New EventLog("LOG_NAME", My.Computer.Name, "MyMVCApp") 

aby utworzyć dziennik niestandardowy.

+0

Zobacz, jak przypisać uprawnienia do dziennika: http://stackoverflow.com/questions/1823433/eventlog-permission-failing-in-asp-net-on-on-win-/35086503#35086503 –

Powiązane problemy