Error al escribir en el registro Windows de eventos desde una aplicación ASP.NET o ASP

Este artículo le ayuda a resolver el problema de que se podría lanzar un error inesperado al escribir en el registro de eventos de Windows desde una aplicación ASP.NET o proveedor de servicios de aplicaciones (ASP).

Versión del producto original:   Internet Information Services 8.0 y versiones posteriores
Número KB original:   2028427

Síntomas

Tiene una aplicación ASP ASP.NET o heredada que se ejecuta en Internet Information Services (IIS) 8.0 o posterior. La aplicación registra eventos en el Windows de eventos. Se produce un error al escribir en los registros de eventos con un mensaje de error similar al siguiente ejemplo:

ASP.NET aplicación

System.Security.SecurityException: no se permite el acceso solicitado al Registro.
System.ComponentModel.Win32Exception: se deniega el acceso
InvalidOperationException: no se puede abrir el registro de la aplicación de origen. Es posible que no tenga acceso de escritura.

Aplicación ASP heredada

Permiso denegado.

Causa

Este problema se produce porque, de forma predeterminada, el token de usuario de la aplicación no tiene los derechos de usuario necesarios para escribir en los registros de eventos Windows debido al acceso de seguridad limitado.

Solución

Importante

Esta sección, método o tarea contiene pasos que le indican cómo modificar el Registro. No obstante, pueden producirse problemas graves si modifica el registro de manera incorrecta. En consecuencia, asegúrese de seguir estos pasos cuidadosamente. Para mayor protección, cree una copia de seguridad del registro antes de modificarlo. Después, puede restaurar el registro si se produce un problema. Para obtener más información sobre cómo hacer una copia de seguridad del Registro y cómo restaurarlo, consulte Cómo realizar una copia de seguridad del Registro y restaurarlo en Windows.

Para proporcionar los permisos necesarios a la identidad del subproceso, modifique la seguridad del registro de eventos a través de las siguientes claves del Registro en el equipo servidor. Debe seleccionar el registro de eventos en el que la aplicación está escribiendo:

  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\Application\CustomSD
  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\System\CustomSD

El valor del Registro es de tipo REG_SZ y contiene un descriptor de seguridad en la sintaxis del Lenguaje de definición de descriptor de CustomSD seguridad (SDDL). Para obtener más información acerca de la sintaxis SDDL, vea los vínculos de la sección Más información a continuación.

Nota

Para crear una cadena SDDL, hay tres derechos distintos que pertenecen a los registros de eventos: Lectura, Escritura y Borrar. Estos derechos corresponden a los siguientes bits en el campo de derechos de acceso de la cadena ASCII Compatible Encoding (ACE):

  • 1 = Lectura
  • 2 = Escritura
  • 4 = Borrar

Importante

Puede configurar el registro de seguridad de la misma manera. Sin embargo, solo puede cambiar los permisos de acceso Lectura y Borrar. El acceso de escritura al registro de seguridad solo está reservado para Windows Local Security Authority (LSA).

El siguiente ejemplo es un SDDL de ejemplo que muestra la cadena SDDL predeterminada para el registro de aplicaciones. Los derechos de acceso (en hexadecimal) tienen una cara de negrita:

O:BAG:SYD:(D;;0 xf0007;;; AN)(D;;0 xf0007;;; BG)(A;;0 xf0007;;; SY)(A;;0 x5;;; BA)(A;;0 x7;;; SO)(A;;0 x3;;;I U)(A;;0 x2;;; BA)(A;;0 x2;;; LS)(A;;0 x2;;; NS)

Significados de entrada:

  • O:BA El propietario del objeto es Administrador integrado (BA).
  • G:SY El grupo principal es System (SY).
  • D: Es una lista de control de acceso discrecional (DACL), en lugar de una entrada de auditoría o SACL.
  • (D;;0xf0007;;;AN) Denegar anónimo (AN) todo el acceso. (1=Lectura + 2=Escritura + 4=Borrar) (Primera cadena ACE en este SDDL).
  • (D;;0xf0007;;;BG) Denegar todos los accesos a los invitados integrados (BG).
  • (A;;0xf0005;;;SY) Permitir lectura y borrar del sistema (1=Lectura + 4=Borrar), incluidos DELETE, READ_CONTROL, WRITE_DAC y WRITE_OWNER (indicado por el 0xf0000).
  • (A;;0x7;;;BA) Permitir que el administrador integrado lea, escriba y desactive.
  • (A;;0x7;;;SO) Permitir operadores de servidor READ, WRITE y CLEAR.
  • (A;;0x3;;;IU) Permitir que los usuarios interactivos lean y escriban.
  • (A;;0x3;;;SU) Permitir cuentas de servicio LECTURA y ESCRITURA.

Agregue la cadena ACE adecuada para que la página web pueda tener acceso a los registros de eventos. Si la página web se ejecuta de forma anónima (es decir, que se ejecuta con autenticación anónima en IIS), tendrá que conceder a IUSR o a la cuenta anónima personalizada los permisos adecuados en esta clave del CustomSD Registro. El grupo Usuarios autenticados debe tener los permisos necesarios si se ejecuta en Windows-Integrated autenticación.

Para ello, anexe la entrada siguiente al valor predeterminado de debajo del CustomSD registro de eventos que seleccionó.

  • Para el grupo Usuarios autenticados (si hay una autenticación integrada en windows): (A;;0x0003;;;AU) donde AU = Usuarios autenticados.

  • Para IUSR o la cuenta anónima configurada personalizada si hay una autenticación anónima, busque el SID para esa cuenta y, a continuación, cree una, que parece donde el último campo es el SID de la cuenta IUSR en mi (A;;0x3;;;S-1-5-21-1985444312-785446638-2839930158-1121) equipo.

  • Para la autenticación de Windows en IIS y la suplantación de ASP.NET activada con una cuenta de usuario específica, busque el SID para esa cuenta suplantada y, a continuación, cree una cadena SDDL, que tiene el aspecto siguiente: donde el último campo es el SID de la cuenta (A;;0x3;;;S-1-5-21-1985444312-785446638-2839930158-1121) suplantada.

Para conceder a su grupo permisos de lectura, agregue lo siguiente al valor al CustomSD final de la cadena CustomSD actual:
(A;;0x1;;;[Your Group Name/user account SID])

Para conceder a su grupo permisos de lectura y escritura, agregue lo siguiente al valor al CustomSD final de la cadena CustomSD actual:
(A;;0x3;;;[Your Group Name/user account SID])

Windows Server 2008

En su lugar, en Windows servidor de 2008, si proporciona a los usuarios y grupos en cuestión acceso de lectura a todos los registros de eventos, solo puede agregarlos al grupo integrado de lectores de registro de eventos. Sin embargo, si no desea dar acceso a todos los registros de eventos, aún tiene que recurrir al uso del SDDL, para el que puede usar la WevtUtil utilidad. En el siguiente ejemplo se muestra cómo definir el acceso al inicio de sesión del evento System Windows 2008 Server:

  1. Abra el símbolo del sistema y ejecute el siguiente comando para volcar el SDDL del inicio de sesión del sistema en un archivo txt.

    wevtutil gl system > C:\temp\out.txt
    
  2. Abra el archivo de texto y copie la entrada channelAccess:

    channelAccess: O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x5;;;SO)(A;;0x1;;;IU)(A;;0x1;;;AU)(A;;0x1;;;SU)(A;;0x1;;;S-1-5-3)(A;;0x2;;;LS)(A;;0x2;;;NS)(A;;0x2;;;S-1-5-33)
    
  3. Agregue el usuario o grupo a esta cadena y ejecute el siguiente comando para aplicar el nuevo SDDL. Reemplace O:BAG:XXXX por la cadena SDDL que creó en el paso anterior:

    wevtutil sl System /ca:O:BAG:XXXX
    

Nota

Una vez que edite este valor y reinicie el equipo, la nueva configuración tendrá efecto. Asegúrese de comprender completamente SDDL y los permisos predeterminados que se colocan en cada registro de eventos antes de usar este procedimiento. Además, asegúrese de probar los cambios a fondo antes de implementarlos en un entorno de producción, ya que podría configurar accidentalmente las listas de control de acceso (ACL) en un registro de eventos de forma que nadie pueda acceder a él.

Más información