System.Security.SecurityException al escribir en el registro de eventos

Estoy trabajando en intentar portar una aplicación ASP.NET desde Server 2003 (e IIS6) a Server 2008 (IIS7).

Cuando bash visitar la página en el navegador, obtengo esto:

Error del servidor en la aplicación ‘/’.

Excepcion de seguridad

Descripción: la aplicación intentó realizar una operación no permitida por la política de seguridad. Para otorgar a esta aplicación el permiso requerido, comuníquese con el administrador del sistema o cambie el nivel de confianza de la aplicación en el archivo de configuración.

Detalles de la excepción: System.Security.SecurityException: no se encontró el origen, pero algunos o todos los registros de eventos no se pudieron buscar. Registros inaccesibles: seguridad

Error de fuente:

Se generó una excepción no controlada durante la ejecución de la solicitud web actual. La información sobre el origen y la ubicación de la excepción se puede identificar utilizando el seguimiento de la stack de excepción a continuación.

Stack Trace:

[SecurityException: no se encontró la fuente, pero algunos o todos los registros de eventos no se pudieron buscar. Registros inaccesibles: seguridad.]

System.Diagnostics.EventLog.FindSourceRegistration (String source, String machineName, Boolean readOnly) +562 System.Diagnostics.EventLog.SourceExists (String source, String machineName) +251

[recorte]

Estas son las cosas que he hecho para tratar de resolverlo:

  1. Otorgue permiso de acceso completo a “Todos” a la clave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security . Esto funcionó. Pero, naturalmente, no puedo hacer esto en producción. Así que eliminé el permiso “Todos” después de ejecutar la aplicación durante unos minutos y el error volvió a aparecer.

  2. Creé el origen en el registro de la aplicación y el registro de seguridad (y verifiqué que existe a través de regedit) durante la instalación con permisos elevados, pero el error permaneció.

  3. Le di a la aplicación un nivel de confianza completo en el archivo web.config (y usando appcmd.exe ) pero fue en vano.

¿Alguien tiene una idea de lo que se puede hacer aquí?

PD: Este es un seguimiento de esta pregunta . Seguí las respuestas dadas, pero fue en vano (ver n. ° 2 arriba).

Para dar permiso de lectura del Network Service en la clave EventLog EventLog/Security (como lo sugieren Firenzi y royrules22), siga las instrucciones de http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx

  1. Abra el Editor del Registro:
    1. Seleccione Start luego Run
    2. Ingrese regedt32 o regedit
  2. Navegue / expanda a la siguiente clave:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

  3. Haga clic derecho en esta entrada y seleccione Permisos

  4. Agregue el usuario del Network Service

  5. Darle permiso de lectura

ACTUALIZACIÓN: los pasos anteriores son correctos en las máquinas de desarrollador, donde no se utiliza el proceso de implementación para instalar la aplicación.
Sin embargo, si implementa su aplicación en otra (s) máquina (s), considere registrar las fonts del registro de eventos durante la instalación como se sugiere en las respuestas de SailAvid y Nicole Calinoiu .

Estoy usando la función PowerShell (llamando a Octopus Deploy.ps1)

 function Create-EventSources() { $eventSources = @("MySource1","MySource2" ) foreach ($source in $eventSources) { if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) { [System.Diagnostics.EventLog]::CreateEventSource($source, "Application") } } } 

El problema es que EventLog.SourceExists intenta acceder a la clave EventLog\Security , acceso que solo está permitido para un administrador.

Un ejemplo común para el inicio de sesión del Progtwig C # en EventLog es:

 string sSource; string sLog; string sEvent; sSource = "dotNET Sample App"; sLog = "Application"; sEvent = "Sample Event"; if (!EventLog.SourceExists(sSource)) EventLog.CreateEventSource(sSource, sLog); EventLog.WriteEntry(sSource, sEvent); EventLog.WriteEntry(sSource, sEvent, EventLogEntryType.Warning, 234); 

Sin embargo, las siguientes líneas fallan si el progtwig no tiene permisos de administrador y la clave no se encuentra en EventLog\Application ya que EventLog.SourceExists intentará acceder a EventLog\Security .

 if (!EventLog.SourceExists(sSource)) EventLog.CreateEventSource(sSource, sLog); 

Por lo tanto, la forma recomendada es crear un script de instalación, que crea la clave correspondiente, a saber:

Aplicación de ejemplo HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application \ dotNET

Uno puede entonces eliminar esas dos líneas.

También puede crear un archivo .reg para crear la clave de registro. Simplemente guarde el siguiente texto en un archivo create.reg :

 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App] 

La solución fue otorgar el permiso de lectura de la cuenta “Servicio de red” en la clave EventLog / Seguridad.

Para mí, ony otorga permisos de ‘lectura’ para ‘NetworkService’ a toda la twig ‘EventLog’ .

Tuve un problema muy similar con un progtwig de consola que desarrollé bajo VS2010 (actualizado desde VS2008 bajo XP). Mi progtwig usa EnLib para hacer un poco de registro. El error se activó porque EntLib no tenía el permiso para registrar un nuevo origen de evento.

Así que comencé una vez mi progtwig comstackdo como administrador : registró el origen del evento. Luego volví a desarrollar y depurar desde VS sin problemas.

(También puede consultar http://www.blackwasp.co.uk/EventLog_3.aspx , me ayudó

Intento casi todo aquí para resolver este problema … comparto aquí la respuesta que me ayuda:

Otra forma de resolver el problema:

  • en la consola de IIS, diríjase al grupo de aplicaciones que administra su sitio y anote la identidad que lo ejecuta (por lo general, Servicio de red)
  • asegúrese de que esta identidad pueda leer KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog (rigth-click, autorizaciones)
  • ahora cambie la identidad de este grupo de aplicaciones al sistema local, aplique y vuelva a cambiar al servicio de red

Las credenciales se volverán a cargar y EventLog se podrá volver a leer

en http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx , gracias Michael Freidgeim

Esta excepción me estaba ocurriendo desde una aplicación de consola .NET que se ejecutaba como una tarea progtwigda, y estaba tratando de hacer básicamente lo mismo: crear un nuevo Origen del evento y escribir en el registro de eventos.

Al final, establecer los permisos completos para el usuario bajo el cual se ejecutaba la tarea en las siguientes claves me funcionó:

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog 

Me encontré con el mismo problema, pero tuve que subir un nivel y dar acceso completo a todos a la clave HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \, en lugar de bajar a la seguridad, eso me solucionó el problema.

Mismo problema en Windows 7 64bits. Ejecutar como administrador resolvió el problema.

FYI … mi problema fue que accidentalmente se seleccionó “Servicio local” como la Cuenta en las propiedades del ProcessInstaller en lugar de “Local System”. Solo mencioné a cualquier persona que siguiera el tutorial de MSDN, ya que la selección de Servicio local se muestra primero y no estaba prestando mucha atención …

Se debe crear una nueva clave con el nombre de origen utilizado en HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Application en el regEdit cuando use System.Diagnostics.EventLog.WriteEntry (“SourceName”, “ErrorMessage”, EventLogEntryType.Error);

Entonces, básicamente, su usuario no tiene permiso para crear la clave. Puede hacer lo siguiente dependiendo del usuario que esté utilizando desde el valor de Identidad en la configuración avanzada del conjunto de aplicaciones:

  1. Ejecute RegEdit y vaya a HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog
  2. Haga clic con el botón derecho en la clave EventLog y seleccione la opción Permisos … 3.Agregue a su usuario con acceso de control completo.

    -Si está utilizando “NetworkService”, agregue el usuario de NETWORK SERVICE

    -Si usas “ApplicationPoolIdentity”, agrega IIS APPPOL {nombre de tu grupo de aplicaciones} (usa la ubicación del equipo local cuando busques al usuario).

    -Si está utilizando “LocalSystem”, asegúrese de que el usuario tenga permisos de administrador. No es recomendable para vulnerabilidades.

  3. Repita los pasos del 1 al 3 para HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Security

Para la depuración con Visual Studio uso “NetworkService” (es usuario de ASP.NET) y cuando el sitio se publica utilizo “AppicationPoolIdentity”.

No estoy trabajando en IIS, pero sí tengo una aplicación que arroja el mismo error en un cuadro 2K8. Funciona bien en una caja de 2K3, imagínate.

Mi resolución fue “Ejecutarme como administrador” para dar a la aplicación derechos elevados y todo funciona felizmente. Espero que esto te guíe en la dirección correcta.

Windows 2008 es derechos / permisos / elevación es muy diferente de Windows 2003, gar.

Hola, me encontré con el mismo problema cuando estaba desarrollando una aplicación y quería instalarla en una PC remota. Lo arreglé haciendo lo siguiente:

1) Vaya a su registro, busque: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application (??? YOUR_SERVICE_OR_APP_NAME ???)

Tenga en cuenta que “(??? YOUR_SERVICE_OR_APP_NAME ???)” es el nombre de su servicio de aplicación tal como lo definió cuando creó su implementación de .NET; por ejemplo, si llamó a su nueva aplicación “Mi nueva aplicación”, la clave sería: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application \ My New app

Nota2: según el evento en el que esté escribiendo, puede encontrarlo en su recuadro DEV, \ Aplicación \ (como se indicó anteriormente), o también (\ Sistema) o (\ Seguridad) dependiendo de en qué evento esté escribiendo su aplicación, principalmente , (\ Aplicación) debería estar bien todo el tiempo.

2) Estar en la tecla de arriba, del menú; Seleccione “ARCHIVO” -> “Exportar”, y luego guarde el archivo. (Nota: Esto crearía su configuración de registro necesaria cuando la aplicación necesitaría acceder a esta clave para escribir en el Visor de eventos), el nuevo archivo será un archivo .REG, para el argumento sake, llámelo “Mi nueva aplicación.REG ”

3) Al implementar en PRODuction, consulte al administrador del sistema del servidor (SA), entregue el archivo “Mi nueva aplicación.REG” junto con la aplicación, y solicite a la SA que instale este archivo REG, una vez hecho (como administrador) esto haría crea la clave para tu aplicación.

4) Ejecute su aplicación, no debería necesitar acceder a otra cosa que no sea esta clave.

El problema debería resolverse por ahora.

Porque:

Al desarrollar una aplicación que escriba algo en EventLog, se requeriría una LLAVE para ello bajo el registro de registro de eventos si esta clave no se encuentra, intentaría crearla, lo que luego falla al no tener permisos para hacerlo. El proceso anterior es similar al despliegue de una aplicación (manualmente), mientras que nosotros mismos lo estamos creando y no es necesario tener un dolor de cabeza ya que no está retocando el registro agregando permisos a TODOS los que son un riesgo grave en los servidores de producción.

Espero que esto ayude a resolverlo.

Tuvimos un problema similar con todos nuestros servidores de 2008. El registro de seguridad dejó de funcionar por completo debido a un GPO que tomó el grupo Usuarios autenticados y leyó el permiso fuera de la clave HKLM\System\CurrentControlSet\Services\EventLog\security

Devolver esto por recomendación de Microsoft corrigió el problema. Sospecho que darles a todos los usuarios autenticados que lean en un nivel superior también corregirá su problema.

Me tocó un problema similar: en mi caso, la fuente contenía < , > caracteres. Las máquinas de 64 bits están usando una nueva base de registro incluso xml. Diría que estos caracteres (establecidos a partir de cadenas) crean un xml no válido que causa una excepción. Podría decirse que esto debería tener en cuenta el problema de Microsoft, no manejar el origen (nombre / cadena) correctamente.

Aunque la respuesta del instalador es una buena respuesta, no siempre es práctico cuando se trata de software que no se escribió. Una respuesta simple es crear el registro y el origen del evento utilizando el comando de PowerShell New-EventLog ( http://technet.microsoft.com/en-us/library/hh849768.aspx )

Ejecute PowerShell como administrador y ejecute el siguiente comando cambiando el nombre de registro y el origen que necesita.

New-EventLog -LogName Application -Source TFSAggregator

Lo usé para resolver la Excepción de registro de eventos cuando el agregador ejecuta el problema desde Codeplex.

Parece que hay una solución evidentemente obvia a esto que aún no he visto un gran inconveniente, al menos donde no es práctico obtener derechos administrativos para crear su propia fuente de eventos: utilice uno que ya esté allí.

Los dos que comencé a utilizar son “.Net Runtime” y “Application Error”, que parecen estar presentes en la mayoría de las máquinas.

Las desventajas principales son la incapacidad de agrupar por ese evento, y que probablemente no tenga un Id. De evento asociado, lo que significa que la entrada del registro puede muy bien tener un prefijo con el efecto de “La descripción para el Id. De evento 0 de la fuente .Net No se puede encontrar el tiempo de ejecución …. “si lo omite, pero el registro entra, y el resultado parece bastante sensato.

El código resultante termina pareciéndose a:

 EventLog.WriteEntry( ".Net Runtime", "Some message text here, maybe an exception you want to log", EventLogEntryType.Error ); 

Por supuesto, dado que siempre hay una posibilidad de que estés en una máquina que no tenga esos orígenes de eventos por alguna razón, es probable que quieras try {} catch{} envolverlo en caso de que falle y empeore las cosas, pero los eventos son ahora salvable

Mi aplicación se instala en los servidores web del cliente. En lugar de juguetear con los permisos del Servicio de red y el registro, opté por verificar SourceExists y ejecutar CreateEventSource en mi instalador.

También agregué un try / catch alrededor de log.source = "xx" en la aplicación para configurarlo en una fuente conocida si no se creó el origen de mi evento (Esto solo aparecería si cambiaba en caliente un archivo .dll en lugar de hacerlo instalación).

La solución es muy simple: ¡ejecute la aplicación Visual Studio en el modo Administrador!

prueba debajo en web.config

     

Tuve este problema al ejecutar una aplicación dentro de VS. Todo lo que tuve que hacer fue ejecutar el progtwig como Administrador una vez, luego pude ejecutar desde VS.

Para ejecutar como administrador, simplemente navegue a su carpeta de depuración en el explorador de Windows. Haga clic derecho en el progtwig y seleccione Ejecutar como administrador.

Reconstruir la solución funcionó para mí