Discussion:
Eventlog schreiben ohne Admin - Rechte
(zu alt für eine Antwort)
Frank Liebelt
2004-10-08 12:07:20 UTC
Permalink
Hallo

Ich möchte gerne in einer Anwendung alle Fehler, Informationen u.s.w in das
Eventlog schreiben um besser Nachzuvollziehen in welcher Sub oder Function
der Fehler auftrat.
Ich habe hier das Problem, das ein Benutzer ohne lokale
Administrationsrechte nicht in das Eventlog schreiben kann.

Die Fehlermeldung beim Versuch zu schreiben gibt ja den Hinweis darauf, dass
man den Zugriff über die .NET Konfiguration einstellen kann.
Ich kann aber nicht verlangen, dass auf jedem Rechner, auf dem das Programm
installiert wird, manuell die Konfiguration angepasst wird.

Also stelle ich mir die Frage: Welche Möglichkeiten gibt es auch als 08/15
Benutzer in das Eventlog schreiben zu können?
Ich meine mich zurückerinnern zu können, dass dieses Problem mit VB6 nicht
auftrat.

Gruß
Frank
Harald M. Genauck
2004-10-08 12:32:40 UTC
Permalink
Hallo Frank,
Post by Frank Liebelt
Ich möchte gerne in einer Anwendung alle Fehler, Informationen u.s.w in das
Eventlog schreiben um besser Nachzuvollziehen in welcher Sub oder Function
der Fehler auftrat.
Ich habe hier das Problem, das ein Benutzer ohne lokale
Administrationsrechte nicht in das Eventlog schreiben kann.
Die Fehlermeldung beim Versuch zu schreiben gibt ja den Hinweis darauf, dass
man den Zugriff über die .NET Konfiguration einstellen kann.
Ich kann aber nicht verlangen, dass auf jedem Rechner, auf dem das Programm
installiert wird, manuell die Konfiguration angepasst wird.
Also stelle ich mir die Frage: Welche Möglichkeiten gibt es auch als 08/15
Benutzer in das Eventlog schreiben zu können?
Ich meine mich zurückerinnern zu können, dass dieses Problem mit VB6 nicht
auftrat.
Warum muss es das Eventlog sein? Täte es nicht auch einfach eine eigene
Datei?

Viele Grüße

Harald M. Genauck

ABOUT Visual Basic - das Webmagazin
http://www.aboutvb.de
Frank Liebelt
2004-10-08 13:03:45 UTC
Permalink
Hallo Harald
Post by Harald M. Genauck
Post by Frank Liebelt
Also stelle ich mir die Frage: Welche Möglichkeiten gibt es auch als
08/15
Post by Frank Liebelt
Benutzer in das Eventlog schreiben zu können?
Ich meine mich zurückerinnern zu können, dass dieses Problem mit VB6
nicht
Post by Frank Liebelt
auftrat.
Warum muss es das Eventlog sein? Täte es nicht auch einfach eine eigene
Datei?
Sicherlich würde das gehen.
Nur, dafür ist das EventLog doch da :)
Aber wichtiger noch: Das steht so auf dem Anforderungsbogen.

3.12)
Programmfehler sind auf Windows 200x, NT 4.x und XP im Ereignisprotokoll
(Anwendung) festzuhalten.
Diese Einträge müssen Informationen enthalten welche zur Fehlersuche
herbeigezogen werden können.
Solche Informationen könnten z.B.: sein : Aktuelle Prozedur/Methode in der
der Fehler auftrat.

Also wäre es sehr Hilfreich wenn ich dieses Problem beseitigen könnte.

Gruß
Frank
Frank Wallwitz
2004-10-08 16:24:42 UTC
Permalink
Hallo Harald,
Post by Harald M. Genauck
Warum muss es das Eventlog sein? Täte es nicht auch einfach eine eigene
Datei?
Viele Grüße
Harald M. Genauck
Das Eventlog ist DER Platz für Meldungen solcher Natur. Jeder Sysadmin, der
sein Geld wert ist, schaut bei Anwendungsfehlern ins Eventlog des Rechners,
auch in der Hoffnung, ggfs. dort Hinweise auf die Ursache und die
Fehlerbehebung zu finden.
Die Suche nach Logfiles einer Applikation kann von C:\ bis ins
System-Verzeichnis führen - evtl. ohne Erfolg. Absolut unprofessionell.

Gruss
Frank
Peter Fleischer
2004-10-08 18:34:50 UTC
Permalink
Frank Wallwitz wrote:
...
Post by Frank Wallwitz
Das Eventlog ist DER Platz für Meldungen solcher Natur. Jeder
Sysadmin, der sein Geld wert ist, schaut bei Anwendungsfehlern ins
Eventlog des Rechners, auch in der Hoffnung, ggfs. dort Hinweise auf
die Ursache und die Fehlerbehebung zu finden.
Die Suche nach Logfiles einer Applikation kann von C:\ bis ins
System-Verzeichnis führen - evtl. ohne Erfolg. Absolut
unprofessionell.
Frank,
so absolut ist das Unsinn. Wie in vielen Dingen liegt das Optimum in der die
Mitte. Im Eventlog wird vermerkt, dass etwas war, ohne das Event-Protokoll
mit Tausenden Bytes zu überfrachten, und in einem Trace-Protokoll findest du
die genaueren Angaben. Wo das Trage-Protokoll liegt, kann im Event-Protokoll
vermerkt werden. Außer dem Anwendungsdaten-Ordner des konkreten Users gibt
es bestimmt keine günstigere Stelle für da Trace-Protokoll.

Peter
Frank Wallwitz
2004-10-08 19:47:28 UTC
Permalink
Hallo Peter,
Post by Harald M. Genauck
...
Post by Frank Wallwitz
Das Eventlog ist DER Platz für Meldungen solcher Natur. Jeder
Sysadmin, der sein Geld wert ist, schaut bei Anwendungsfehlern ins
Eventlog des Rechners, auch in der Hoffnung, ggfs. dort Hinweise auf
die Ursache und die Fehlerbehebung zu finden.
Die Suche nach Logfiles einer Applikation kann von C:\ bis ins
System-Verzeichnis führen - evtl. ohne Erfolg. Absolut
unprofessionell.
Frank,
so absolut ist das Unsinn. Wie in vielen Dingen liegt das Optimum in der die
Mitte. Im Eventlog wird vermerkt, dass etwas war, ohne das Event-Protokoll
mit Tausenden Bytes zu überfrachten, und in einem Trace-Protokoll findest du
die genaueren Angaben. Wo das Trage-Protokoll liegt, kann im
Event-Protokoll
Post by Harald M. Genauck
vermerkt werden. Außer dem Anwendungsdaten-Ordner des konkreten Users gibt
es bestimmt keine günstigere Stelle für da Trace-Protokoll.
Wir reden offensichtlich von unterschiedlichen Dingen.
Ein Tracelog nach dem Motto: "cmdDoSomething_Clicked -> Methode
DoSomeStuff -> Error, Stack trallala", zur Ablaufverfolgung, ist in der
Designphase einer Applikation, vielleicht noch bei sehr komplexen
Anwendungen während der User-Akzeptanztests ein Weg, Fehler und ihre
Entstehung zu lokalisieren. Wir wissen alle, das solche Probleme bei
Ereignis-orientierter Programmierung fast unausweichlich sind. Wer sie als
Mittel zur 'Weiterentwicklung' der Software durch den Kunden benutzt, hat
ein Qualitäts- bzw. Design-Problem.
Ich weiß, Tracelogs werden oft standardmäßig verwendet, ich habe selbst auch
schon der Versuchung nicht widerstehen können, aber eigentlich ist es oft
Bequemlichkeit (oder einfach nur Murks ?).

Ein Eintrag ins Eventlog weist auf einen klar zu identifizierenden Fehler
hin, der z.B. aus bestimmten Konstellationen in der Interaktion des
Programmes mit dem OS oder anderen Programmen herrührt. Der gehört ganz klar
ins Eventlog, hier ist ja z.B. auch die zeitliche Abfolge ersichtlich.

Vielleicht liegen wir ja doch nicht so weit auseinander ;) ?

Gruss
Frank
Peter Fleischer
2004-10-09 02:56:53 UTC
Permalink
Frank Wallwitz wrote:
...
Post by Frank Wallwitz
Ich weiß, Tracelogs werden oft standardmäßig verwendet, ich habe
selbst auch schon der Versuchung nicht widerstehen können, aber
eigentlich ist es oft Bequemlichkeit (oder einfach nur Murks ?).
Frank,
dazu nutze ich system.diagnostics.switches im Config-File.
Post by Frank Wallwitz
Ein Eintrag ins Eventlog weist auf einen klar zu identifizierenden
Fehler hin, der z.B. aus bestimmten Konstellationen in der
Interaktion des Programmes mit dem OS oder anderen Programmen
herrührt. Der gehört ganz klar ins Eventlog, hier ist ja z.B. auch
die zeitliche Abfolge ersichtlich.
Vielleicht liegen wir ja doch nicht so weit auseinander ;) ?
So relativiert bin ich mit dir einverstanden:-)

Peter
Arne Janning
2004-10-09 00:11:54 UTC
Permalink
Hallo Frank!

"Frank Liebelt" schrieb
Post by Frank Liebelt
Ich möchte gerne in einer Anwendung alle Fehler, Informationen u.s.w in das
Eventlog schreiben um besser Nachzuvollziehen in welcher Sub oder Function
der Fehler auftrat.
Siehe Beitrag von Frank. Besser nur vermerken, dass ein Fehler aufgetreten
ist und für Details ggf. auf eine Tracelog-Datei verweisen.
Wenn sich der Einarbeitungsaufwand für Dein Projekt lohnt, ist vielleicht
log4net für Dich interessant:
http://logging.apache.org/log4net/
Post by Frank Liebelt
Ich habe hier das Problem, das ein Benutzer ohne lokale
Administrationsrechte nicht in das Eventlog schreiben kann.
In welches Eventlog denn: Application, Security, System? In ein eigenes?
Dafür gibt es jeweils andere Sicherheitsanforderungen
http://msdn.microsoft.com/library/en-us/vbcon/html/vbconsecurityramificationsofeventlogs.asp
Post by Frank Liebelt
Die Fehlermeldung beim Versuch zu schreiben gibt ja den Hinweis darauf, dass
man den Zugriff über die .NET Konfiguration einstellen kann.
Ich kann aber nicht verlangen, dass auf jedem Rechner, auf dem das Programm
installiert wird, manuell die Konfiguration angepasst wird.
Also stelle ich mir die Frage: Welche Möglichkeiten gibt es auch als 08/15
Benutzer in das Eventlog schreiben zu können?
AFAIK sollte er für das normale "Application"-Eventlog Schreibrechte haben.
Was der 08/15 nicht kann, ist ein custom event log selbst anlegen
(EventLog.CreateEventSource).
Das kannst Du aber mit während des Setups erledigen, das vom Admin
durchgeführt wird:
http://msdn.microsoft.com/library/en-us/vbcon/html/vbwlkWalkthroughCreatingEventLogInstallers.asp

HTH

Arne Janning
Arne Janning
2004-10-09 00:17:25 UTC
Permalink
Post by Arne Janning
Siehe Beitrag von Frank.
Korrektur: ich meinte den Beitrag von Peter

Gruß

AJ
Frank Liebelt
2004-10-11 10:49:19 UTC
Permalink
Hallo Arne
Post by Arne Janning
In welches Eventlog denn: Application, Security, System? In ein eigenes?
Dafür gibt es jeweils andere Sicherheitsanforderungen
http://msdn.microsoft.com/library/en-us/vbcon/html/vbconsecurityramificationsofeventlogs.asp

Schreiben möchte ich nur in das Anwendungslog und das sollte doch möglich
sein.
Zumindest ersehe ich das aus dem Link.

Was übrigens die Datenmenge betrifft.
Wenn etwas ins Eventlog geschrieben werden soll, dann nur das nötigste.
Ich hatte nicht vor ein Buch zu verfassen und das dann ins EL zu schreiben.
Dort soll nur erscheinen:
Fehler in : #quellcodedatei# sowie die aktuelle Sub/Funktion zum Zeitpunkt
des Fehlers.
Post by Arne Janning
AFAIK sollte er für das normale "Application"-Eventlog Schreibrechte haben.
Was der 08/15 nicht kann, ist ein custom event log selbst anlegen
(EventLog.CreateEventSource).
Das kannst Du aber mit während des Setups erledigen, das vom Admin
http://msdn.microsoft.com/library/en-us/vbcon/html/vbwlkWalkthroughCreatingEventLogInstallers.asp

Der Code in einem eigenen Modul sieht so aus:

Module _Eventlog
Public Sub WriteEvent(ByVal EventMessage As String)
Dim ApplicationName As String = "myApp"
Dim elLog As New EventLog("Application", Environment.MachineName,
ApplicationName)
elLog.WriteEntry(EventMessage, EventLogEntryType.Information, 1000)
elLog.Dispose()
End Sub
End Module

und das schreiben: (Beispiel)

Dim detail As String
detail = "Fehler in : form1.vb, Sub : Form1_Close()" & vbCrLf
_EventLog.WriteEvent(detail & ex.Message)

Das sollte dann doch funktionieren oder stehe ich immer noch neben der Spur?

Gruß
Frank
Arne Janning
2004-10-11 23:45:08 UTC
Permalink
Hallo Frank!

"Frank Liebelt" schrieb
Post by Frank Liebelt
Schreiben möchte ich nur in das Anwendungslog und das sollte doch möglich
sein.
Zumindest ersehe ich das aus dem Link.
So sehe ich das auch.
Post by Frank Liebelt
Das sollte dann doch funktionieren oder stehe ich immer noch neben der Spur?
Ich habe Deinen Code genommen, in ein Projekt kopiert und das Programm unter
mehreren Benutzerkonten probiert.
Mein Ergebnis war: es funktioniert für alle Accounts, außer für Gäste.

In welcher Gruppe sind die User, die Dein Programm ausführen sollen? Welche
Fehlermeldung bekommst Du genau?

Gruß

Arne Janning
Frank Liebelt
2004-10-12 12:19:42 UTC
Permalink
Hallo
Post by Arne Janning
Ich habe Deinen Code genommen, in ein Projekt kopiert und das Programm unter
mehreren Benutzerkonten probiert.
Mein Ergebnis war: es funktioniert für alle Accounts, außer für Gäste.
In welcher Gruppe sind die User, die Dein Programm ausführen sollen? Welche
Fehlermeldung bekommst Du genau?
Ich könnte Kot***, sorry für den Audruck.
Vom Kunden habe ich den Hinweis bekommen, dass der Fehler auftritt beim
Versuch ins EventLog zu schreiben.
Jetzt hat er es entlich geschafft mir einen Screenshot zu schicken.
Und! Was musste ich feststellen?
Der Fehler ist nicht das schreiben ins EventLog sondern das hier:

Public Function GetComputerName()

Dim regKey As RegistryKey

regKey =
Registry.LocalMachine.OpenSubKey("System\CurrentControlSet\Control\ComputerN
ame\ComputerName", True)

GetComputerName = regKey.GetValue("ComputerName")

regKey.Close()

End Function

System.Security.SecurityException: Der angeforderte Registrierungszugriff
ist unzulässig.

at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable)



Der Pfad stimmt ja! Ich denke mal, dass am Ende ein FALSE stehen sollte
damit der User darauf zugreifen kann.

Gruß
Frank
Arne Janning
2004-10-12 12:31:24 UTC
Permalink
Hallo Frank!

"Frank Liebelt" schrieb
Post by Frank Liebelt
Public Function GetComputerName()
Dim regKey As RegistryKey
regKey =
Registry.LocalMachine.OpenSubKey("System\CurrentControlSet\Control\ComputerN
ame\ComputerName", True)
GetComputerName = regKey.GetValue("ComputerName")
regKey.Close()
End Function
System.Security.SecurityException: Der angeforderte Registrierungszugriff
ist unzulässig.
at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable)
Der Pfad stimmt ja! Ich denke mal, dass am Ende ein FALSE stehen sollte
damit der User darauf zugreifen kann.
System.Environment.MachineName wäre in dem Fall einfacher ;-)

Gruß

Arne Janning
Frank Liebelt
2004-10-12 18:46:28 UTC
Permalink
Hallo
Post by Arne Janning
System.Environment.MachineName wäre in dem Fall einfacher ;-)
Danke! Da bin ich echt nicht drauf gekommen! Danke

Gruß
Frank

Loading...