PRB: При попытке приложения АSP.NET сделать запись о новом источнике событий в журнале событий появляется сообщение об ошибке «Запрошенный доступ к реестру запрещен»

Внимание! Решения, приведенные в этой статье, связаны с внесением изменений в системный реестр. Перед внесением изменений в системный реестр рекомендуется создать резервную копию системного реестра и изучить процедуру его восстановления. Дополнительные сведения об архивировании, восстановлении и изменении реестра см. в следующей статье базы знаний Майкрософт:
256986 Описание реестра Microsoft Windows

Проблема

Если для создания нового источника событий в журнале событий используется приложение ASP.NET, может появиться следующее сообщение об ошибке:
System.Security.SecurityException: Запрошенный доступ к реестру запрещен.

Причина

По умолчанию, метка пользователя для рабочего процесса ASP.NET — ASPNET (или NetworkService для приложений, работающих со службами IIS 6.0). Проблемы, описанные в разделе «Проблема», возникают из-за отсутствия у используемой учетной записи прав, необходимых для создания источника событий.

Решение

Предупреждение. Неправильное использование редактора реестра может привести к возникновению серьезных неполадок, требующих переустановки операционной системы. Корпорация Майкрософт не несет ответственности за неправильное использование редактора реестра. При изменении реестра полагайтесь на свой опыт и знания.
Для устранения этой неполадки пользователь с правами администратора должен создать источник событий до запуска веб-приложения ASP.NET. Для создания источника событий используйте один из следующих способов.

Первый способ

Создайте источник событий в журнале событий Application с помощью редактора реестра. Для этого выполните следующие действия.
  1. Нажмите кнопку Пуск и выберите пункт Выполнить.
  2. В поле Открыть введите команду regedit.
  3. Найдите следующий раздел реестра:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
  4. Щелкните правой кнопкой мыши элемент Application, выберите пункт Создать, а затем – Раздел.
  5. Введите TEST в качестве имени раздела.
  6. Закройте редактор реестра.

Второй способ

Класс EventLogInstaller в пространстве имен System.Diagnostics позволяет установить и настроить журнал событий, который будет использоваться для чтения и записи приложением во время работы. Источник событий можно создать с помощью средства EventLogInstaller. Для этого выполните следующие действия.
  1. С помощью Microsoft Visual Basic .NET или Microsoft Visual C# .NET создайте новую библиотеку классов с именем EventLogSourceInstaller. По умолчанию будет создан файл Class1.vb или файл Class1.cs.
  2. В обозревателе решений щелкните правой кнопкой мыши проект EventLogSourceInstaller и выберите команду Добавить ссылку.
  3. В диалоговом окне Добавление ссылки дважды щелкните объект System.Configuration.Install.dll и нажмите кнопку .
  4. Переименуйте файл Class1.vb\Class1.cs в MyEventLogInstaller.vb\MyEventLogInstaller.cs.
  5. Замените существующий код в MyEventLogInstaller.vb или MyEventLogInstaller.cs следующим кодом:

    Пример кода на Visual Basic .NET
    Imports System.Diagnostics
    Imports System.Configuration.Install
    Imports System.ComponentModel

    <RunInstaller(True)> _
    Public Class MyEventLogInstaller
    Inherits Installer
    Private myEventLogInstaller As EventLogInstaller

    Public Sub New()
    ' Создание экземпляра класса 'EventLogInstaller'.
    myEventLogInstaller = New EventLogInstaller()
    ' Назначение источника журнала событий для создания.
    myEventLogInstaller.Source = "TEST"
    ' Назначение журнала, в котором создан источник.
    myEventLogInstaller.Log = "Application"
    ' Добавление myEventLogInstaller в коллекцию InstallerCollection.
    Installers.Add(myEventLogInstaller)
    End Sub
    End Class
    Пример кода на Visual C# .NET
    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()
    {
    //Создание экземпляра EventLogInstaller
    myEventLogInstaller = new EventLogInstaller();

    // Назначение источника журнала событий для создания.
    myEventLogInstaller.Source = "TEST";

    // Назначение журнала, в котором создан источник
    myEventLogInstaller.Log = "Application";

    // Добавление myEventLogInstaller в коллекцию Installers.
    Installers.Add(myEventLogInstaller);
    }
    }
    }

  6. Выберите в меню Build команду Build Solution, чтобы создать файл EventLogSourceInstaller.dll.
  7. Откройте командную строку Visual Studio .NET.
  8. В командной строке перейдите в папку, где находится файл EventLogSourceInstaller.dll.
  9. Выполните следующую команду, чтобы создать источник событий EventSource:
    InstallUtil EventLogSourceInstaller.dll

Дополнительная информация

Действия для воспроизведения проблемы

  1. С помощью Visual Basic .NET или Visual C# .NET создайте новое веб-приложение ASP.NET. По умолчанию создается файл WebForm1.aspx.
  2. В HTML-представлении файла WebForm1.aspx замените существующий код на следующий:

    Пример кода на 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")
    ' Имя источника события
    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
    <%@ 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");
    // Имя источника события
    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. В меню Debug выберите команду Start, чтобы просмотреть страницу WebForm1.aspx в обозревателе.
  4. Введите любой текст в поле TextBox и нажмите кнопку Write to event log.
  5. Появится сообщение об ошибке, приведенное в разделе «Проблема» этой статьи.
  6. Для устранения неполадки создайте источник событий, как описано в разделе «Решение», и закомментируйте в файле WebForm1.aspx следующий код:
    EventLog.CreateEventSource(ev.Source, "Application")
  7. Повторите действия 3 и 4.
Свойства

Номер статьи: 329291 — последний просмотр: 21 мая 2009 г. — редакция: 1

Отзывы и предложения