2009-10-22 13 views
9

Tengo una biblioteca que creé con alguna lógica empresarial que incluye escribir en una instancia System.Diagnostics.EventLog. Normalmente, se llama a la biblioteca desde una aplicación de servicio de Windows, pero ahora intento llamar a esas mismas funciones de biblioteca desde mi aplicación ASP.NET MVC.Excepción de seguridad al escribir en un EventLog desde una aplicación ASP.NET MVC

Probé este código dentro de mi controlador para crear la instancia EventLog que paso al método que debe escribir en el registro.

Dim log = New EventLog("Application", My.Computer.Name, "MyMVCApp") 

se genera el siguiente error cuando el código en el método de biblioteca intenta escribir en el registro:

[SecurityException: Requested registry access is not allowed.] 
System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) +51 
Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) +7462217 
System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData) +366 
System.Diagnostics.EventLog.VerifyAndCreateSource(String sourceName, String currentMachineName) +194 
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData) +205 
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type) +14 

Mi aplicación web se ejecuta como el usuario del servicio de red en Windows Server 2003 con IIS 6 ¿Hay algo que deba hacer para que el usuario del Servicio de Red pueda acceder al registro?

¿Existe alguna forma mejor de crear una instancia de EventLog para usar en una aplicación ASP.NET MVC? ¿Ya hay uno creado por el marco al que solo tengo que hacer referencia?

Respuesta

19

De MSDN: "Las aplicaciones que se ejecutan utilizando la identidad de servicio de red puede escribir en el registro de eventos mediante el uso de fuentes de eventos existentes , pero no pueden crear nuevas fuentes de eventos a causa de permisos de registro insuficientes".

Y ...

"Si la Fuente para el registro de sucesos asociada a la instancia EventLog no existe, se crea un nuevo origen de eventos."

Por lo tanto se parece a su evento la fuente de registro no existe, y está tratando de crear una nueva fuente de registro de eventos utilizando el usuario del servicio de red (que requiere escribir en el registro, por lo que no funcionará).

"Para permitir que su aplicación ASP.NET para escribir en el registro de eventos usando una fuente de eventos que no existe ya, usted tiene dos opciones:"

  • Crear nuevas fuentes de eventos en la aplicación momento de la instalación
  • Cree manualmente una entrada de origen de evento nueva en el registro.

Por lo tanto, necesita crear el registro fuera de la aplicación (no puede hacerlo programáticamente con este usuario. Hágalo manualmente o cree una aplicación de línea de comandos simple para simplificar la instalación).

Para más detalles:

http://msdn.microsoft.com/en-us/library/ms998320.aspx#paght000015_eventlogaccess

Personalmente te recomiendo que no modifican los permisos de usuario de red, sino más bien crear el origen de registro fuera de la aplicación web. Mi preferencia es en una aplicación de consola (que le tomará aproximadamente 5 minutos para escribir, y que también puede usar para preparar otras máquinas). Inicie una nueva aplicación de consola en VS.NET y agregue el código para crear las fuentes de registro.Un ejemplo:

http://www.dotnetspider.com/resources/23593-Create-Event-log-VB-NET.aspx

A continuación, basta con ejecutar la aplicación de consola de la línea cmd, cuando se conectó con los permisos adecuados.

5

Si no está seguro de qué fuente de evento está intentando crear, la respuesta aceptada será difícil de adivinar.

Una solución más simple sería cambiar el grupo de aplicaciones para usar temporalmente LocalSystem, luego ejecutar la aplicación y producir un error. Podrá crear la fuente de registro de eventos relevante, y luego podrá volver a usar NetworkService.

0

No sé por qué no puedes crear tu propio EventLog en lugar de escribir en el registro de la aplicación.

Puede crear una aplicación de ventana/consola con el siguiente código y ejecutarlo como administrador, esto creará un nuevo registro para usted.

if (!EventLog.Exists("LOG_NAME")) 
    EventLog.CreateEventSource("LOG_NAME", "LOG_NAME"); 

esto creará un nuevo registro dentro del registro de eventos y visible en los registros de aplicaciones y servicios.

if (!EventLog.SourceExists("MyMVCApp")) 
    EventLog.CreateEventSource("MyMVCApp", "LOG_NAME"); 

Esto creará una nueva fuente en el interior del "NOMBRE_REGISTRO" costumbre y se puede hacer uso del código

Dim log = New EventLog("LOG_NAME", My.Computer.Name, "MyMVCApp") 

para crear un registro personalizado.

+0

Vea cómo asignar permisos al registro: http://stackoverflow.com/questions/1823433/eventlog-permission-failing-in-asp-net-on-win7/35086503#35086503 –

Cuestiones relacionadas