9 Stimmen

Sicherheitsausnahme beim Schreiben in ein EventLog aus einer ASP.NET MVC-Anwendung

Ich habe eine Bibliothek, die ich mit einigen Geschäftslogik erstellt, die das Schreiben in eine System.Diagnostics.EventLog Instanz. Die Bibliothek wird normalerweise von einer Windows Service-Anwendung aufgerufen, aber jetzt versuche ich, die gleichen Bibliotheksfunktionen von meiner ASP.NET MVC-Anwendung aus aufzurufen.

Ich habe diesen Code in meinem Controller versucht, um die EventLog-Instanz zu erstellen, die ich an die Methode übergebe, die in das Protokoll schreiben muss.

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

Der folgende Fehler wird erzeugt, wenn der Code innerhalb der Bibliotheksmethode versucht, in das Protokoll zu schreiben:

[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

Meine Webanwendung wird als Netzwerkdienstbenutzer auf Windows Server 2003 mit IIS 6 ausgeführt. Muss ich etwas tun, um dem Netzwerkdienstbenutzer Zugriff auf die Registrierung zu geben?

Gibt es eine bessere Möglichkeit, eine EventLog-Instanz für die Verwendung in einer ASP.NET MVC-Anwendung zu erstellen? Gibt es eine, die bereits vom Framework erstellt wurde und die ich nur referenzieren muss?

19voto

UpTheCreek Punkte 29856

Aus MSDN: "Anwendungen, die mit der Netzwerkdienstidentität kann in das Ereignisprotokoll schreiben durch die Verwendung von vorhandene Ereignisquellen aber sie kann keine neuen Ereignisquellen erstellen wegen unzureichender Registrierungsberechtigungen".

Und...

" Wenn die Quelle für das mit der EventLog-Instanz verbundene Ereignisprotokoll nicht vorhanden ist, wird eine neue Ereignisquelle erstellt. "

Es sieht also so aus, als würde Ihre Ereignisprotokollquelle nicht existieren und es wird versucht, eine neue Ereignisprotokollquelle mit Hilfe des Netzwerkdienstbenutzers zu erstellen (was ein Schreiben in die Registrierung erfordert, also nicht funktionieren wird).

"Um Ihre ASP.NET-Anwendung in die Lage zu versetzen, in das Ereignisprotokoll zu schreiben, indem Sie eine Ereignisquelle verwenden, die noch nicht existiert, haben Sie zwei Möglichkeiten:"

  • Erstellen neuer Ereignisquellen bei der Anwendungsinstallation
  • Erstellen Sie manuell einen neuen Ereignisquelleneintrag in der Registrierung.

Das Protokoll muss also außerhalb der Anwendung erstellt werden (mit diesem Benutzer kann man das nicht programmatisch tun). Tun Sie es entweder manuell, oder erstellen Sie eine einfache Befehlszeilenanwendung, um die Installation zu vereinfachen).

Für weitere Informationen:

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

Ich persönlich würde empfehlen, dass Sie die Netzbenutzerrechte nicht ändern, sondern die Protokollquelle außerhalb der Webanwendung erstellen. Ich bevorzuge eine Konsolenanwendung (deren Erstellung etwa 5 Minuten dauert und die Sie auch zur Vorbereitung anderer Rechner verwenden können). Starten Sie eine neue Konsolenanwendung in VS.NET, und fügen Sie den Code zum Erstellen der Protokollquellen hinzu. Ein Beispiel:

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

Führen Sie dann einfach die Konsolenanwendung über die cmd-Zeile aus, wenn Sie mit den entsprechenden Berechtigungen angemeldet sind.

5voto

demoncodemonkey Punkte 11355

Wenn Sie nicht sicher sind, welche Ereignisquelle erstellt werden soll, wird es schwierig sein, die oben genannte Antwort zu finden.

Eine einfachere Lösung wäre, den Anwendungspool so umzustellen, dass er vorübergehend LocalSystem verwendet, dann die Anwendung auszuführen und einen Fehler zu erzeugen. Dadurch kann die entsprechende Ereignisprotokollquelle erstellt werden, und danach können Sie die Anwendung wieder auf NetworkService umstellen.

0voto

Vinod Srivastav Punkte 3046

Ich weiß nicht, warum Sie nicht Ihr eigenes EventLog erstellen können, anstatt in das Anwendungsprotokoll zu schreiben.

Sie können eine Fenster-/Konsolenanwendung mit dem folgenden Code erstellen und als Administrator ausführen; dadurch wird ein neues Protokoll für Sie erstellt.

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

wird ein neues Protokoll innerhalb des Ereignisprotokolls erstellt und in den Anwendungs- und Dienstprotokollen angezeigt.

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

Dadurch wird eine neue Quelle innerhalb des benutzerdefinierten "LOG_NAME" erstellt und Sie können den Code verwenden

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

um ein benutzerdefiniertes Protokoll zu erstellen.

0 Stimmen

Sehen Sie hier, wie Sie dem Protokoll eine Berechtigung zuweisen: stackoverflow.com/questions/1823433/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X