Pregunta

Tengo un código que lee el registro de eventos de Windows. Utiliza OpenEventLog, ReadEventLog y obtiene el origen del evento y el ID del evento. Luego busca la fuente debajo de

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application

clave, carga los archivos DLL adecuados de acuerdo con lo que se indica en EventMessageFile y finalmente utiliza FormatMessage para combinar las cadenas de eventos con el contenido del mensaje DLL para obtener el Mensaje final del mensaje de texto. Esta es la forma recomendada, y aunque un poco molesta, funciona muy bien.

Hasta ... Voy a buscar la fuente y encuentro que no tiene un EventMessageFile , sino una entrada de ProviderGuid . Esta parece ser la nueva forma (se muestran en Vista y Windows 2008). Uggh: no hay nada que pasar a FormatMessage para buscar el texto del mensaje y fusionar las cadenas de datos

:(

La búsqueda en el registro del guid conduce a referencias a otros archivos (http.sys en el caso de la fuente HTTP), pero nunca puedo obtener el mensaje de texto completo. ¿Tengo que usar las API EvtOpenSession ? Espero que no, ya que ya tengo el EVENTLOGRECORD * de una llamada a ReadEventLog , y el hecho de que el software debe ejecutarse en Windows 2003 donde EvtOpenSession no es compatible (solo disponible en Vista y Windows 2008). NOTA: Algunas fuentes en Vista tienen ProviderGUID y otras tienen EventMessageFile, por lo que el método anterior aún es viable.

Por lo tanto, lo que busco es una forma de ver ProviderGuid y obtener el DLL que debe pasarse a FormatMessage para mostrar el texto completo del mensaje de registro de eventos.

Gracias por cualquier entrada

¿Fue útil?

Solución

Las API con las que Richard se vincula son para el nuevo estilo Sistema de eventos (llamado Crimson, a veces llamado Proveedores basados ??en manifiesto) introducido en Vista / Server 2K8. Uno de los artefactos de este nuevo sistema son las nuevas API para consumir estos registros, otra es la clave ProviderGuid para ciertos EventSources que producen eventos usando este nuevo marco.

Creo que deberías usar las funciones en Windows Vista más adelante para consumir estos registros, debería manejar el trabajo por ti. Puede usar el método EvtFormatMessage para formatear las cadenas. Creo que estas API también leerán los eventos producidos por " Classic " proveedores.

Si está consumiendo estos mensajes desde una aplicación .NET, puede usar tipos en el espacio de nombres System.Diagnostics.Eventing.Reader, introducido en .NET 3.5.

Otros consejos

Hay API de Win32 para leer / expandir las entradas del registro de eventos.

Vea MSDN: http://msdn.microsoft .com / en-us / library / aa385780 (VS.85) .aspx

Cualquier otra cosa, y es probable que encuentre problemas con los parches, por no hablar de paquetes de servicio o nuevas versiones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top