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

189

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

Cuando intento visitar la página del 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 no se pudieron buscar algunos o todos los registros de eventos. 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 pila de excepciones a continuación.

Seguimiento de pila:

[SecurityException: no se encontró la fuente, pero no se pudieron buscar algunos o todos los registros de eventos. 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é la fuente 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 total en el web.configarchivo (y usando appcmd.exe) pero fue en vano.

¿Alguien tiene una idea de lo que podría hacerse aquí?

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

encee
fuente
Estaba obteniendo esto cuando intentaba escribir en una fuente personalizada en un servicio .Net que se ejecutaba como NetworkService. Acabo de cambiar la fuente del registro de eventos para que coincida con el nombre del servicio que se configuró a través del paquete de configuración del servicio .Net y funcionó sin establecer permisos de registro. Lo noté al ver el nombre del servicio como una clave ya en HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application
Jon Adams
2
Otra posible respuesta: haga clic con el botón derecho en exe y elija "Ejecutar como administrador"
MacGyver

Respuestas:

169

Para dar Network Servicepermiso de lectura sobre la EventLog/Securityclave (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 StartentoncesRun
    2. Entrar regedt32oregedit
  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. Agregar al Network Serviceusuario

  5. Darle permiso de lectura

ACTUALIZACIÓN: Los pasos anteriores están bien en máquinas de desarrolladores, donde no utiliza el proceso de implementación para instalar la aplicación.
Sin embargo, si implementa su aplicación en otras máquinas, considere registrar las fuentes de 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")
            }
    }
}
Michael Freidgeim
fuente
En IIS7, puede asignar el "SERVICIO DE RED" como la identidad de un grupo de aplicaciones (puede encontrar que ApplicationPoolIdentity es el predeterminado) o, en su lugar, puede crear un nuevo usuario por grupo de aplicaciones y establecer permisos en esa "cuenta personalizada". consulte Especificar una identidad para un grupo de aplicaciones (IIS 7)
Grokodile
55
Los cambios solo surten efecto después de reiniciar su aplicación en IIS
Zé Carlos
77
Le di permiso a IIS_IUSRS para leer / escribir la clave del registro de eventos y leer la clave de seguridad. Mi producto necesitaba acceso de escritura en la clave del registro de eventos porque crea su propio origen de eventos.
duck9
1
duck9 corrijo para IIS8, vea aquí para más detalles: stackoverflow.com/questions/712203/…
thedrs
1
También mire serverfault.com/a/81246/219898 con respecto a los usuarios del grupo de aplicaciones y los permisos relacionados, para esta solución. Gracias @Michael Freidgeim - fue de gran ayuda.
Anthony Horne
59

El problema es que EventLog.SourceExistsintenta acceder a la EventLog\Securityclave, acceso que solo está permitido para un administrador.

Un ejemplo común para iniciar sesión en un programa de C # EventLoges:

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 programa no tiene permisos de administrador y la clave no se encuentra debajo, EventLog\Applicationya EventLog.SourceExistsque luego intentará acceder 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:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application \ dotNET Sample App

Entonces se pueden eliminar esas dos líneas.

También puede crear un .regarchivo 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]
Stefan Profanter
fuente
1
Esto es exactamente lo que hago por todos mis servicios. Creo que esto es lo correcto. En cada servicio donde uso el registro de eventos, tengo un archivo .reg como el de arriba. Una pequeña nota de que el archivo debe guardarse como Unicode-32 (cp 1200.)
Valo
Esta respuesta describe la verdadera razón detrás del error. La comprobación existe intenta enumerar la clave completa. si existe, checkExists funciona bien.
DanO
EventLog \ Security esta es la clave para funcionar, asegúrese de tener permiso sobre eso.
Princa
45

La solución fue dar permiso de lectura de la cuenta "Servicio de red" en la clave EventLog / Security.

encee
fuente
1
Veo soluciones similares a mi alrededor. Pero me pregunto por qué es así. Porque puedo ver que muchos servicios están conectados como NetworkService y deben poder leer el registro de eventos / seguridad. Entonces, ¿por qué es necesario agregar el permiso para NetworkService?
h - n
11
Para aquellos de nosotros que normalmente no rastreamos el registro, este enlace puede ser útil: social.msdn.microsoft.com/forums/en-US/…
Allan
Buen enlace Allan. El punto n. ° 3 de la respuesta aceptada es importante y ya me ha mordido una vez. es decir, otorgar permiso en la clave de registro EventLog principal NO se propaga a "registros inaccesibles" como Seguridad y Servidor Virtual, aunque sean claves secundarias en el registro. Si desea tener acceso completo al registro de eventos, debe otorgar permiso en AMBOS niveles de registro de eventos primarios y niveles de seguridad secundarios.
Ben Barreth
1
Los cambios solo surten efecto después de reiniciar su aplicación en IIS
Zé Carlos
Para aquellos que intentaron copiar / pegar, asegúrese de que haya un espacio entre las palabras "Servicio de red".
Chris Fremgen
7

Para mí, la concesión de permisos de 'Lectura' para 'NetworkService' a toda la rama 'EventLog' funcionó.

evictorov
fuente
eso no es muy relevante, porque las subclaves como "Seguridad" o "Servidor virtual" necesitan otorgar acceso de lectura individualmente, ya que los permisos se han configurado para que no se hereden de la clave principal.
Serge
7

Tuve un problema muy similar con un programa de consola que desarrollo bajo VS2010 (actualizado desde VS2008 bajo XP) Mi programa utiliza EnLib para realizar algunos registros. El error se activó porque EntLib no tenía permiso para registrar un nuevo origen de eventos.

Así que comencé una vez que mi programa compilado como Administrador : registró el origen del evento. Luego volví a desarrollar y depurar desde dentro de VS sin problema.

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

viejo brasil
fuente
7

Esta excepción me estaba ocurriendo desde una aplicación de consola .NET que se ejecutaba como una tarea programada, y estaba tratando de hacer básicamente lo mismo: crear una nueva Fuente de eventos y escribir en el registro de eventos.

Al final, configurar los permisos completos para el usuario bajo el cual se ejecutaba la tarea en las siguientes teclas fue el truco para mí:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
tswann
fuente
3
Salvaste mi día. Por cierto, el permiso de lectura fue suficiente en eventlog\Applicationy eventlog\Security; Se requiere control total eventlogsolo en la raíz.
Ruud Helderman
6

Intento casi todo aquí para resolver este problema ... Comparto aquí la respuesta que me ayuda:

Otra forma de resolver el problema:

  • en la consola IIS, vaya al grupo de aplicaciones que administra su sitio y anote la identidad que lo ejecuta (generalmente Servicio de red)
  • asegúrese de que esta identidad pueda leer KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog (clic con el botón derecho, autorizaciones)
  • ahora cambie la identidad de este grupo de aplicaciones a Sistema local, aplique y vuelva al Servicio de red

Las credenciales se volverán a cargar y EventLog será alcanzable

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

Gelásio
fuente
Cambiar el grupo de aplicaciones de "ApplicationPoolIdentity" a "LocalSystem" resolvió el problema de crear / leer registros de eventos para mí.
majestzim
4

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.

nodonoghue
fuente
1
También intente configurar la aplicación para que se ejecute como LocalSystem, de modo que se cree la clave de registro, luego puede volver a cambiar a NetworkService después.
demoncodemonkey
4

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

Dom
fuente
4

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

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

  1. Ejecute RegEdit y vaya a HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog
  2. Haga clic derecho en la tecla EventLog y seleccione la opción Permisos ... 3. Agregue a su usuario con acceso de Control total.

    -Si está utilizando "NetworkService" agregue usuario de SERVICIO DE RED

    -Si está utilizando "ApplicationPoolIdentity" agregue IIS APPPOL {nombre de su grupo de aplicaciones} (use la ubicación de la máquina local cuando busque al usuario).

    -Si está utilizando "LocalSystem", asegúrese de que el usuario tenga permisos de administrador. No se recomienda 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 utilizo "NetworkService" (es usuario de ASP.NET) y cuando se publica el sitio utilizo "AppicationPoolIdentity".

Pablishe
fuente
3

FYI ... mi problema fue que accidentalmente seleccioné "Servicio local" como la Cuenta en las propiedades de ProcessInstaller en lugar de "Sistema local". Solo menciono a cualquier otra persona que siguió el tutorial de MSDN como la selección del Servicio local se muestra primero y no estaba prestando mucha atención ...

DaleS
fuente
3

Parece haber una solución obvia para esto que todavía no he visto un gran inconveniente, al menos cuando no es práctico obtener derechos administrativos para crear su propia fuente de eventos: use una que ya esté allí.

Los dos que he comenzado a utilizar son ".Net Runtime" y "Application Error", que parecen estar presentes en la mayoría de las máquinas.

Las principales desventajas son la incapacidad de agruparse por ese evento, y que probablemente no tenga una ID de evento asociada, lo que significa que la entrada del registro puede estar prefijada con algo como "Descripción de la 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 la salida se ve ampliamente sensata.

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 existe la posibilidad de que esté en una máquina que no tiene esas fuentes de eventos por cualquier razón, es probable que desee try {} catch{}envolverlo en caso de que falle y empeore las cosas, pero los eventos ahora se pueden guardar.

Tobriand
fuente
2

No estoy trabajando en IIS, pero 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 "Ejecutar como administrador" para otorgarle a la aplicación derechos elevados y todo funcionará correctamente. Espero que esto ayude a guiarte en la dirección correcta.

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

omgtitb
fuente
2

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

1) Pase 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 del servicio de su aplicación tal como lo definió cuando creó su implementación de .NET, por ejemplo, si denominó a su nueva aplicación "Mi nueva aplicación", la clave sería: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application \ My New app

Nota 2: Dependiendo del evento en el que esté escribiendo, puede encontrar en su cuadro DEV, \ Aplicación \ (como se indicó anteriormente), o también (\ Sistema) o (\ Seguridad) dependiendo del evento en el que está escribiendo su aplicación, principalmente , (\ Application) debería estar bien todo el tiempo.

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

3) Al implementar en PRODuction, consulte al administrador del sistema del servidor (SA), entregue el archivo "My New App.REG" junto con la aplicación y solicite a la SA que instale este archivo REG, una vez hecho (como administrador) esto cree la clave para su aplicación.

4) Ejecute su aplicación, no debería necesitar acceder a nada más que esta clave.

El problema ya debería estar resuelto.

Porque:

Al desarrollar una aplicación que escriba cualquier cosa en el EventLog, requeriría una CLAVE para ello en el registro de Eventlog si no se encuentra esta clave, intentaría crearla, lo que luego falla por no tener permisos para hacerlo. El proceso anterior es similar a la implementación de una aplicación (manualmente), mientras que la estamos creando nosotros mismos, y no es necesario tener un dolor de cabeza ya que no está modificando el registro al agregar permisos a TODOS, lo que es un riesgo seguro en los servidores de producción.

Espero que esto ayude a resolverlo.

Heider Sati
fuente
2

Aunque la respuesta del instalador es una buena respuesta, no siempre es práctica cuando se trata de software que no escribió. Una respuesta simple es crear el registro y el origen del evento utilizando el comando 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 la fuente que necesita.

New-EventLog -LogName Application -Source TFSAggregator

Lo usé para resolver la excepción del registro de eventos cuando Aggregator ejecuta un problema desde codeplex.

John Brown
fuente
1

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

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

Steve M
fuente
1

Golpeé problema similar - en mi caso contenía Fuente <, >caracteres. Las máquinas de 64 bits están utilizando un nuevo registro par - base xml, diría yo, y estos caracteres (establecidos a partir de una cadena) crean un xml no válido que causa una excepción. Podría decirse que esto debería considerarse un problema de Microsoft: no manejar la Fuente (nombre / cadena) correctamente.

alflesio
fuente
1

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

fragata
fuente
Al solucionar problemas en VS y obtuve este error, esto me lo solucionó
wruckie
Esto daría error porque no es VS lo que invoca esta llamada, es la aplicación que probablemente se ejecuta en un contexto de seguridad diferente.
CodeMonkey1313
0

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

También agregué un try / catch log.source = "xx"en la aplicación para establecerlo en una fuente conocida si no se creó mi fuente de evento (Esto solo aparecería si intercambiara en caliente un .dll en lugar de reinstalarlo).

basher
fuente
0

intente a continuación en web.config

 <system.web>

<trust level="Full"/>

</system.web>
Anjan Kant
fuente
-1

Tuve este problema al ejecutar una aplicación dentro de VS. Todo lo que tenía que hacer era ejecutar el programa como Administrador una vez, luego podría ejecutarlo desde VS.

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

Bob Horn
fuente
-3

Reconstruir la solución funcionó para mí

Stephen Ebichondo
fuente