PRB: Mensaje de Error "No se permite el acceso al registro solicitado" cuando la aplicación de ASP.NET intenta escribir nuevo origen de eventos en el registro de sucesos

Síntomas

Cuando se utiliza ASP.NET para crear un nuevo origen de eventos en el registro de sucesos, puede recibir el siguiente mensaje de error:
System.Security.SecurityException: No se permite el acceso al registro solicitado.

Causa

De forma predeterminada, el token de usuario del proceso de trabajo ASP.NET es ASPNET (o NetworkService para aplicaciones que se ejecutan en servicios de Internet Information Server [IIS] 6.0). El problema en la sección "Síntomas" se produce porque la cuenta no tiene permisos adecuados para crear un origen de eventos.

Solución

Importante: esta sección, el método o la tarea contiene pasos que indican cómo modificar el registro. Sin embargo, pueden producirse problemas graves si modifica incorrectamente el registro. Por lo tanto, asegúrese de que sigue estos pasos cuidadosamente. Para una mayor protección, haga una copia de seguridad del registro antes de modificarlo. Entonces, puede restaurar el registro si se produce un problema. Para obtener más información acerca de cómo hacer copia de seguridad y restaurar el registro, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
322756 cómo hacer copia de seguridad y restaurar el registro en Windows
Para resolver este problema, un usuario que tenga derechos administrativos debe crear el origen de eventos antes de ejecutar la aplicación Web de ASP.NET. Para crear un origen de eventos, utilice uno de los métodos siguientes.

Primer enfoque

Crear un origen de eventos en el registro de sucesos de aplicación en el Editor del registro. Para ello, siga estos pasos:
  1. Haga clic en Inicioy, a continuación, haga clic en
    Ejecutar.
  2. En el cuadro de texto Abrir , escriba
    regedit.
  3. Busque la siguiente subclave del registro:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
  4. Haga clic en la subclave de la aplicación , seleccione nuevoy, a continuación, haga clic en clave.
  5. Tipo de prueba para el nombre de clave.
  6. Cierre el Editor del registro.

Segundo enfoque

La clase EventLogInstaller en el espacio de nombres System.Diagnostics le permite instalar y configurar un registro de eventos que la aplicación lee o escribe en mientras se ejecutan. Puede crear un origen de evento utilizando EventLogInstaller. Para ello, siga estos pasos:
  1. Utilice Microsoft Visual Basic .NET o Microsoft Visual C# .NET para crear una nueva Biblioteca de clases denominado EventLogSourceInstaller. De forma predeterminada, el archivo Class1.vb o la
    Se crea el archivo Class1.cs .
  2. En el Explorador de soluciones, haga clic en
    EventLogSourceInstallery, a continuación, haga clic en Agregar referencias.
  3. En el cuadro de diálogo Agregar referencia , haga doble clic en System.Configuration.Install.dlly, a continuación, haga clic en
    OK.
  4. Cambie el nombre de la Class1.vb\Class1.cs a MyEventLogInstaller.vb\MyEventLogInstaller.cs.
  5. Reemplace el código existente en MyEventLogInstaller.vb o MyEventLogInstaller.cs con el código de ejemplo siguiente:

    Ejemplo de Visual Basic .NET
    Imports System.DiagnosticsImports System.Configuration.Install
    Imports System.ComponentModel

    <RunInstaller(True)> _
    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

    Ejemplo de .NET de Visual C#
    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. En el menú Generar , haga clic en Generar solución para crear
    EventLogSourceInstaller.dll.
  7. Abra el símbolo del sistema de Visual Studio. NET.
  8. En el símbolo del sistema, cambie a la carpeta donde
    Se encuentra EventLogSourceInstaller.dll .
  9. Ejecute el comando siguiente para crear el origen de eventos:
    InstallUtil EventLogSourceInstaller.dll

Más información

Pasos para reproducir el comportamiento

  1. Utilizar Visual Basic .NET o Visual C# .NET para crear un nuevo
    Aplicación Web de ASP.NET. De forma predeterminada,
    Se crea el archivo WebForm1.aspx .
  2. En la vista HTML de WebForm1.aspx, reemplace el código existente con el código de ejemplo siguiente:

    Ejemplo de Visual Basic .NET
    <%@ 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>

    Ejemplo de .NET de Visual C#
    <%@ 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. En el menú Depurar , haga clic en
    Empezar a ver la página WebForm1.aspx en el explorador.
  4. Escriba algún texto en el TextBoxy, a continuación, haga clic en
    Escribir en el registro de sucesos.
  5. Aparece el mensaje de error que se describe en la sección "Síntomas" de este artículo.
  6. Para resolver este problema, cree un origen de eventos, como se describe en la sección "Resolución" y marque como comentario el código siguiente en
    WebForm1.aspx :
    EventLog.CreateEventSource(ev.Source, "Application")
  7. Repita los pasos 3 y 4.
Propiedades

Id. de artículo: 329291 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios