PRB: Fehlermeldung "Der angeforderte Registrierungszugriff ist unzulässig" beim Versuch einer ASP.NET-Anwendung, eine neue Quelle in das Ereignisprotokoll zu schreiben

Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
329291 PRB: "Requested Registry Access Is Not Allowed" Error Message When ASP.NET Application Tries to Write New EventSource in the EventLog
Wichtig: Dieser Artikel enthält Informationen zum Bearbeiten der Registrierung. Vergewissern Sie sich, dass Sie die Registrierung wiederherstellen können, falls ein Problem auftritt. Weitere Informationen zum Erstellen einer Sicherungskopie, zum Wiederherstellen und Bearbeiten der Registrierung finden Sie in folgendem Artikel der Microsoft Knowledge Base:
256986 Beschreibung der Microsoft Windows-Registrierung

Problembeschreibung

Wenn Sie mit ASP.NET eine neue Quelle im Ereignisprotokoll erstellen, erhalten Sie möglicherweise folgende Fehlermeldung:
System.Security.SecurityException: Der angeforderte Registrierungszugriff ist unzulässig.

Ursache

Standardmäßig ist das Benutzertoken des ASP.NET-Workerprozesses "ASPNET" (bzw. "NetworkService" für Anwendungen, die auf Internet Information Services [IIS] 6.0 ausgeführt werden). Das im Abschnitt "Problembeschreibung" dieses Artikels beschriebene Problem tritt auf, wenn Ihr Benutzerkonto nicht über ausreichende Benutzerrechte zum Erstellen einer neuen Quelle verfügt.

Lösung

Warnung: Die falsche Verwendung des Registrierungseditors kann schwerwiegende Probleme verursachen, die das gesamte System betreffen und eine Neuinstallation des Betriebssystems erforderlich machen. Microsoft kann nicht garantieren, dass Probleme, die von einer falschen Verwendung des Registrierungseditors herrühren, behoben werden können. Benutzen Sie den Registrierungseditor auf eigene Verantwortung. Damit Sie dieses Problem beheben können, muss ein Benutzer mit Administratorrechten die Quelle erstellen, bevor Sie die ASP.NET-Webanwendung ausführen. Wenden Sie eines der folgenden Verfahren an, um eine Quelle zu erstellen.

Erstes Verfahren

Erstellen Sie im Registrierungseditor unterhalb des Ereignisprotokolls Application eine Quelle. Gehen Sie hierzu folgendermaßen vor:
  1. Klicken Sie auf Start und anschließend auf Ausführen.
  2. Geben Sie im Textfeld Öffnen den Befehl regedit ein.
  3. Gehen Sie zum folgenden Registrierungsunterschlüssel:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
  4. Klicken Sie mit der rechten Maustaste auf den Unterschlüssel Application, zeigen Sie auf Neu, und klicken Sie anschließend auf Schlüssel.
  5. Geben Sie als Namen des Schlüssels TEST ein.
  6. Schließen Sie den Registrierungseditor.

Zweites Verfahren

Die Klasse EventLogInstaller im Namespace System.Diagnostics ermöglicht Ihnen die Installation und Konfiguration eines Ereignisprotokolls, aus dem Ihre Anwendung während der Ausführung liest bzw. in das sie schreibt. Verwenden Sie EventLogInstaller zum Erstellen einer Quelle. Gehen Sie hierzu folgendermaßen vor:
  1. Erstellen Sie in Microsoft Visual Basic .NET oder Microsoft Visual C# .NET eine neue Klassenbibliothek mit dem Namen "EventLogSourceInstaller". Standardmäßig wird die Datei Class1.vb bzw. Class1.cs erstellt.
  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf EventLogSourceInstaller, und klicken Sie danach auf Verweis hinzufügen.
  3. Doppelklicken Sie im Dialogfeld Verweis hinzufügen auf System.Configuration.Install.dll, und klicken Sie dann auf OK.
  4. Benennen Sie "Class1.vb" bzw. "Class1.cs" um in "MyEventLogInstaller.vb" bzw. "MyEventLogInstaller.cs".
  5. Ersetzen Sie den vorhandenen Code in "MyEventLogInstaller.vb" oder "MyEventLogInstaller.cs" durch folgenden Beispielcode:

    Visual Basic .NET-Beispiel
     _
    Public Class MyEventLogInstaller
    Inherits Installer
    Private myEventLogInstaller As EventLogInstaller

    Public Sub New()
    ' Create an instance of 'EventLogInstaller'.
    myEventLogInstaller = New EventLogInstaller()
    ' Set the 'Source' of the event log, to be created.
    myEventLogInstaller.Source = "TEST"
    ' Set the 'Log' that the source is created in.
    myEventLogInstaller.Log = "Application"
    ' Add myEventLogInstaller to 'InstallerCollection'.
    Installers.Add(myEventLogInstaller)
    End Sub
    End Class
    Visual C# .NET-Beispiel
    using System;
    using System.Diagnostics;
    using System.ComponentModel;
    using System.Configuration.Install;


    namespace EventLogSourceInstaller
    {
    [RunInstaller(true)]
    public class MyEventLogInstaller : Installer
    {
    private EventLogInstaller myEventLogInstaller;

    public MyEventLogInstaller()
    {
    //Create Instance of EventLogInstaller
    myEventLogInstaller = new EventLogInstaller();

    // Set the Source of Event Log, to be created.
    myEventLogInstaller.Source = "TEST";

    // Set the Log that source is created in
    myEventLogInstaller.Log = "Application";
    // Add myEventLogInstaller to the Installers Collection.
    Installers.Add(myEventLogInstaller);
    }
    }
    }

  6. Klicken Sie im Menü Erstellen auf Projektmappe erstellen, um EventLogSourceInstaller.dll zu erstellen.
  7. Öffnen Sie die Visual Studio .NET-Eingabeaufforderung.
  8. Wechseln Sie an der Eingabeaufforderung in den Ordner, in dem sich EventLogSourceInstaller.dll befindet.
  9. Führen Sie den folgenden Befehl aus, um die Quelle zu erstellen:
    InstallUtil EventLogSourceInstaller.dll

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

  1. Erstellen Sie in Visual Basic .NET oder Visual C# .NET eine neue ASP.NET-Webanwendung. Standardmäßig wird die Datei WebForm1.aspx erstellt.
  2. Ersetzen Sie in der HTML-Ansicht von WebForm1.aspx den vorhandenen Code durch folgenden Beispielcode:

    Visual Basic .NET-Beispiel
    <%@ Page Language="vb" AutoEventWireup="true" %>
    <%@ Import namespace="System.Diagnostics" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <script language="VB" runat="server">
    Sub WriteEvent_Click(Src As Object, e As EventArgs)
    Dim ev As New EventLog("Application")
    ' Event's Source name
    ev.Source = "TEST"
    EventLog.CreateEventSource(ev.Source, "Application")
    Try
    ev.WriteEntry(TextBox1.Text)
    Catch b as exception
    Response.write ("WriteEntry " & b.message & "<br>")
    End Try
    ev = Nothing
    End Sub
    </script>

    <body>
    <form id="Form1" runat="server">
    Event message:
    <asp:textbox id="TextBox1" runat="server" Width="233px"></asp:textbox>
    <asp:button id="Button1" onclick="WriteEvent_Click" runat="server" NAME="Button1" text="Write to event log"></asp:button>
    </form>
    </body>
    </HTML>
    Visual C# .NET-Beispiel
    <%@ Page Language="c#" AutoEventWireup="true" %>
    <%@ Import namespace="System.Diagnostics" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <script language="C#" runat="server">
    void WriteEvent_Click(Object Src, EventArgs e)
    {
    EventLog ev = new EventLog("Application");
    // Event's Source name
    ev.Source = "TEST";
    EventLog.CreateEventSource(ev.Source, "Application");

    try
    {
    ev.WriteEntry(TextBox1.Text);
    }
    catch (Exception b)
    {
    Response.Write("WriteEntry " + b.Message + "<br>");
    }
    ev = null;
    }
    </script>

    <body>
    <form id="Form1" runat="server">
    Event message:
    <asp:textbox id="TextBox1" runat="server" Width="233px"></asp:textbox>
    <asp:button id="Button1" onclick="WriteEvent_Click" runat="server" NAME="Button1" text="Write to event log"></asp:button>
    </form>
    </body>
    </HTML>
  3. Klicken Sie im Menü Debuggen auf Starten, um die Seite WebForm1.aspx im Browser anzuzeigen.
  4. Geben Sie in TextBox einen beliebigen Text ein, und klicken Sie dann auf Write to event log (In Ereignisprotokoll schreiben).
  5. Die im Abschnitt "Problembeschreibung" dieses Artikels beschriebene Fehlermeldung wird angezeigt.
  6. Erstellen Sie, wie im Abschnitt "Lösung" beschrieben, eine Quelle, und kommentieren Sie den folgenden Code in WebForm1.aspx aus:
    EventLog.CreateEventSource(ev.Source, "Application")
  7. Wiederholen Sie die Schritte 3 und 4.
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Eigenschaften

Artikelnummer: 329291 – Letzte Überarbeitung: 21.05.2009 – Revision: 1

Feedback