wake-up-neo.com

System.Security.SecurityException beim Schreiben in das Ereignisprotokoll

Ich arbeite daran, eine ASP.NET-App von Server 2003 (und IIS6) auf Server 2008 (IIS7) zu portieren.

Wenn ich versuche, die Seite im Browser aufzurufen, erhalte ich Folgendes:

Serverfehler in '/' Anwendung.

Sicherheitsaußnahme

Beschreibung: Die Anwendung hat versucht, einen Vorgang auszuführen, der von der Sicherheitsrichtlinie nicht zugelassen wird. Um dieser Anwendung die erforderliche Berechtigung zu erteilen, wenden Sie sich an Ihren Systemadministrator oder ändern Sie die Vertrauensebene der Anwendung in der Konfigurationsdatei.

Ausnahmedetails: System.Security.SecurityException: Die Quelle wurde nicht gefunden, aber einige oder alle Ereignisprotokolle konnten nicht durchsucht werden. Unzugängliche Protokolle: Sicherheit

Quellfehler:

Während der Ausführung der aktuellen Webanforderung wurde eine nicht behandelte Ausnahme generiert. Informationen zum Ursprung und zum Speicherort der Ausnahme können mithilfe des folgenden Ausnahmestapel-Trace ermittelt werden.

Stack Trace:

[SecurityException: Die Quelle wurde nicht gefunden, aber einige oder alle Ereignisprotokolle konnten nicht durchsucht werden. Unzugängliche Protokolle: Sicherheit.]

System.Diagnostics.EventLog.FindSourceRegistration (String-Quelle, String-Maschinenname, Boolean readOnly) +562 System.Diagnostics.EventLog.SourceExists (String-Quelle, String-Maschinenname) +251

[snip]

Dies sind die Dinge, die ich getan habe, um sie zu lösen:

  1. Erteilen Sie "Jeder" die volle Zugriffsberechtigung für den Schlüssel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security. Das hat funktioniert. Aber in der Produktion kann ich das natürlich nicht. Daher habe ich die Berechtigung "Jeder" gelöscht, nachdem ich die App einige Minuten lang ausgeführt habe, und der Fehler ist erneut aufgetreten.

  2. Ich habe die Quelle während der Installation mit erhöhten Berechtigungen im Anwendungsprotokoll und im Sicherheitsprotokoll erstellt (und überprüft, dass sie über regedit vorhanden ist), aber der Fehler blieb bestehen.

  3. Ich habe der App in der web.config Datei (und mit appcmd.exe) aber ohne Erfolg.

Hat jemand einen Einblick, was hier getan werden könnte?

PS: Dies ist ein Follow-up zu diesem Frage . Ich folgte den gegebenen Antworten, aber ohne Erfolg (siehe # 2 oben).

185
encee

Die Lösung bestand darin, dem Konto "Network Service" die Leseberechtigung für den EventLog/Security-Schlüssel zu erteilen.

46
encee

Geben Network Service Leserechte auf dem EventLog/Security key (wie von Firenzi und royrules22 vorgeschlagen) folgen Sie den Anweisungen von http: //geekswithblogs.net/timh/archive/2005/10/05/56029.aspx

  1. Öffnen Sie den Registrierungseditor:
    1. Wählen Sie Start und dann Run
    2. Eingeben regedt32 oder regedit
  2. Navigieren/erweitern Sie zu der folgenden Taste:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

  3. Klicken Sie mit der rechten Maustaste auf diesen Eintrag und wählen Sie Berechtigungen

  4. Ergänzen Sie die Network Service Benutzer

  5. Gib es Leseerlaubnis

UPDATE: Die obigen Schritte sind auf Entwicklermaschinen in Ordnung, auf denen Sie den Bereitstellungsprozess nicht zum Installieren der Anwendung verwenden.
Wenn Sie Ihre Anwendung jedoch auf anderen Computern bereitstellen, sollten Sie während der Installation Ereignisprotokollquellen registrieren , wie in SailAvid's Empfohlen = und Nicole Calinoius Antworten.

Ich benutze die PowerShell-Funktion (Aufruf in 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")
            }
    }
}
168

Das Problem ist, dass der EventLog.SourceExists Versucht, auf den EventLog\Security - Schlüssel zuzugreifen, der nur für einen Administrator zulässig ist.

Ein gängiges Beispiel für ein C # -Programm, das sich bei EventLog anmeldet, ist:

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);

Die folgenden Zeilen schlagen jedoch fehl, wenn das Programm keine Administratorrechte hat und der Schlüssel nicht unter EventLog\Application Gefunden wird, da EventLog.SourceExists Dann versucht, auf EventLog\Security Zuzugreifen.

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

Daher wird empfohlen, ein Installationsskript zu erstellen, das den entsprechenden Schlüssel erstellt, nämlich:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET-Beispielanwendung

Diese beiden Zeilen kann man dann entfernen.

Sie können auch eine .reg - Datei erstellen, um den Registrierungsschlüssel zu erstellen. Speichern Sie einfach den folgenden Text in eine Datei create.reg:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App]
54

Für mich hat nur das Erteilen von "Leseberechtigungen" für "Netzwerkdienst" für den gesamten Zweig "EventLog" funktioniert.

8
evictorov

Ich hatte ein sehr ähnliches Problem mit einem Konsolenprogramm, das ich unter VS2010 entwickelt habe (von VS2008 unter XP aktualisiert). Mein Prog verwendet EnLib, um einige Protokollierungen durchzuführen. Der Fehler wurde ausgelöst, weil EntLib nicht die Berechtigung hatte, eine neue Ereignisquelle zu registrieren.

Also habe ich einmal mein kompiliertes Programm als Administrator gestartet: Es hat die Ereignisquelle registriert. Dann ging ich zurück, ohne Probleme, aus VS heraus zu entwickeln und Fehler zu beheben.

(Sie können sich auch auf http: //www.blackwasp.co.uk/EventLog_3.aspx beziehen , es hat mir geholfen

7
oldbrazil

Ich versuche fast alles, um dieses Problem zu lösen ... Ich teile hier die Antwort, die mir hilft:

Eine andere Möglichkeit, das Problem zu beheben:

  • wechseln Sie in der IIS Konsole zum Anwendungspool, der Ihre Site verwaltet, und notieren Sie sich die Identität, unter der sie ausgeführt wird (normalerweise Netzwerkdienst).
  • stellen Sie sicher, dass diese Identität KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog lesen kann (Rechtsklick, Berechtigungen).
  • ändern Sie nun die Identität dieses Anwendungspools in "Lokales System", wenden Sie ihn an und wechseln Sie zurück zu "Netzwerkdienst"

Die Anmeldeinformationen werden neu geladen und EventLog ist erreichbar

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

6
Gelásio

Diese Ausnahme trat bei mir in einer .NET-Konsolenanwendung auf, die als geplante Aufgabe ausgeführt wurde, und ich versuchte, im Grunde dasselbe zu tun: eine neue Ereignisquelle zu erstellen und in das Ereignisprotokoll zu schreiben.

Das Festlegen der vollständigen Berechtigungen für den Benutzer, unter dem die Aufgabe ausgeführt wurde, auf den folgenden Schlüsseln hat mir letztendlich geholfen:

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

Gleiches Problem unter Windows 7 64-Bit. Als Administrator ausführen löste das Problem.

4
Dom

Ich bin auf dasselbe Problem gestoßen, musste jedoch eine Ebene höher gehen und allen Benutzern uneingeschränkten Zugriff auf den Schlüssel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\gewähren.

4
nodonoghue

Zu Ihrer Information ... mein Problem war, dass ich versehentlich "Lokaler Dienst" als Konto in den Eigenschaften von ProcessInstaller anstelle von "Lokales System" ausgewählt habe. Nur zu erwähnen für alle anderen, die dem MSDN-Tutorial gefolgt sind, wie die Auswahl des lokalen Dienstes zuerst zeigt, und ich habe nicht genau aufgepasst ...

3
DaleS

Bei Verwendung von System.Diagnostics.EventLog.WriteEntry ("SourceName", "ErrorMessage", EventLogEntryType " .Error);

Ihr Benutzer hat also im Grunde keine Berechtigung, den Schlüssel zu erstellen. Dies kann je nach verwendetem Benutzer anhand des Werts "Identität" in den erweiterten Einstellungen des Anwendungspools Folgendes bewirken:

  1. Führen Sie RegEdit aus, und wechseln Sie zu HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
  2. Klicken Sie mit der rechten Maustaste auf den EventLog-Schlüssel und wählen Sie die Option Berechtigungen ... aus. 3. Fügen Sie Ihrem Benutzer Vollzugriff hinzu.

    -Wenn Sie "NetworkService" verwenden, fügen Sie einen NETWORK SERVICE-Benutzer hinzu

    -Wenn Sie usinf sind "ApplicationPoolIdentity" add IIS APPPOL {Name Ihres App-Pools}) (verwenden Sie den lokalen Computer-Standort, wenn Sie den Benutzer suchen).

    -Wenn Sie "LocalSystem" verwenden, stellen Sie sicher, dass der Benutzer über Administratorrechte verfügt. Es wird nicht für Sicherheitslücken empfohlen.

  3. Wiederholen Sie die Schritte 1 bis 3 für HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security

Für das Debuggen mit Visual Studio verwende ich "NetworkService" (es ist ASP.Net User) und wenn die Site veröffentlicht wird, verwende ich "AppicationPoolIdentity".

3
Pablishe

Hallo, ich bin auf dasselbe Problem gestoßen, als ich eine Anwendung entwickelte und sie auf einem Remote-PC installieren wollte. Ich habe es folgendermaßen behoben:

1) Suchen Sie in Ihrer Registrierung nach: HKLM\System\CurrentControlSet\Services\EventLog\Application (??? YOUR_SERVICE_OR_APP_NAME ???)

Beachten Sie, dass "(??? YOUR_SERVICE_OR_APP_NAME ???)" Ihr Anwendungsdienstname ist, wie Sie ihn beim Erstellen Ihrer .NET-Bereitstellung definiert haben. Wenn Sie beispielsweise Ihre neue Anwendung "Meine neue App" genannt haben, lautet der Schlüssel: HKLM\System\CurrentControlSet\Services\EventLog\Application\Meine neue App

Hinweis 2: Abhängig davon, in welches Ereignisprotokoll Sie schreiben, finden Sie möglicherweise auf Ihrer DEV-Box\Application\(wie oben angegeben) oder auch (\ System) oder (\ Security), je nachdem, in welches Ereignis Ihre Anwendung schreibt , (\ Application) sollte immer in Ordnung sein.

2) Auf der Taste oben sein, Aus dem Menü; Wählen Sie "DATEI" -> "Exportieren" und speichern Sie die Datei. (Hinweis: Dadurch würden die erforderlichen Registrierungseinstellungen erstellt, wenn die Anwendung auf diesen Schlüssel zugreifen müsste, um in die Ereignisanzeige zu schreiben.) Die neue Datei ist eine .REG-Datei. Nennen Sie sie für das Argument "My New App.REG" "

3) Wenden Sie sich bei der Bereitstellung unter PRODuction an den Administrator des Serversystems (SA), übergeben Sie die Datei "My New App.REG" zusammen mit der Anwendung und fordern Sie SA zur Installation dieser REG-Datei auf Sobald dies erledigt ist (als Administrator), wird der Schlüssel für Ihre Anwendung erstellt.

4) Führen Sie Ihre Anwendung aus. Es sollte kein anderer Zugriff als dieser Schlüssel erforderlich sein.

Das Problem sollte jetzt behoben sein.

Ursache:

Bei der Entwicklung einer Anwendung, die etwas in das EventLog schreibt, wird ein KEY in der Eventlog-Registrierung benötigt. Wird dieser Schlüssel nicht gefunden, wird versucht, ihn zu erstellen. Dies schlägt fehl, da keine Berechtigungen dafür vorhanden sind. Der oben beschriebene Vorgang ähnelt dem Bereitstellen einer Anwendung (manuell), während wir diese selbst erstellen, und Sie müssen keine Kopfschmerzen haben, da Sie die Registrierung nicht optimieren, indem Sie JEDER Person Berechtigungen hinzufügen, was ein Sicherheitsrisiko für Produktionsserver darstellt.

Ich hoffe, das hilft bei der Lösung.

2
Heider Sati

Ich arbeite nicht an IIS, aber ich habe eine Anwendung, die den gleichen Fehler auf einer 2K8-Box auslöst. Es funktioniert gut mit einer 2K3-Box.

Mein Vorsatz war, "Als Administrator ausführen", um der Anwendung erhöhte Rechte zu gewähren, und alles funktioniert problemlos. Ich hoffe, das hilft Ihnen, in die richtige Richtung zu führen.

Windows 2008 ist Rechte/Berechtigungen/Elevation ist wirklich anders als Windows 2003, gar.

2
thomasnguyencom

Es scheint eine offensichtliche Lösung für dieses Problem zu geben, für die ich noch keinen großen Nachteil sehe, zumindest wenn es nicht praktikabel ist, Administratorrechte zu erhalten, um eine eigene Ereignisquelle zu erstellen: Verwenden Sie eine, die bereits vorhanden ist.

Die beiden, von denen ich angefangen habe, Gebrauch zu machen, sind ".Net Runtime" und "Application Error". Beide scheinen auf den meisten Computern vorhanden zu sein.

Die Hauptnachteile sind die Unfähigkeit, nach diesem Ereignis zu gruppieren, und dass Sie wahrscheinlich keine zugehörige Ereignis-ID haben, was bedeutet, dass dem Protokolleintrag möglicherweise etwas vorangestellt wird, das den Effekt "Die Beschreibung für Ereignis-ID 0 aus dem Quellennetz" hat "Laufzeit kann nicht gefunden werden ....", wenn Sie es weglassen, das Protokoll jedoch eingeht und die Ausgabe im Großen und Ganzen sinnvoll aussieht.

Der resultierende Code sieht dann so aus:

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

Natürlich, da es immer die Möglichkeit gibt, dass Sie sich auf einem Computer befinden, auf dem diese Ereignisquellen aus irgendeinem Grund nicht vorhanden sind, möchten Sie wahrscheinlich try {} catch{} wickeln Sie es für den Fall, dass es fehlschlägt und die Dinge noch schlimmer macht, aber Ereignisse können jetzt gespeichert werden.

2
tobriand

Ich bin auf ein ähnliches Problem gestoßen - in meinem Fall enthielt Source <, > Figuren. 64-Bit-Maschinen verwenden eine neue, gerade Log-XML-Basis, und diese Zeichen (gesetzt aus einer Zeichenfolge) erzeugen eine ungültige XML-Datei, die eine Ausnahme verursacht. Möglicherweise sollte dies ein Problem von Microsoft sein, da die Quelle (Name/Zeichenfolge) nicht korrekt behandelt wird.

1
alflesio

Hatte ein ähnliches Problem mit allen unseren 2008-Servern. Das Sicherheitsprotokoll hat aufgrund eines GPO), das der Gruppe Authentifizierte Benutzer die Leseberechtigung vom Schlüssel weggenommen hat, vollständig funktioniert. HKLM\System\CurrentControlSet\Services\EventLog\security

Durch Zurücksetzen auf die Empfehlung von Microsoft wurde das Problem behoben. Ich vermute, alle authentifizierten Benutzer auf einer höheren Ebene lesen zu lassen, behebt auch Ihr Problem.

1
Steve M

Obwohl die Antwort des Installationsprogramms eine gute Antwort ist, ist sie nicht immer praktisch, wenn Sie mit Software arbeiten, die Sie nicht geschrieben haben. Eine einfache Antwort besteht darin, das Protokoll und die Ereignisquelle mit dem PowerShell-Befehl New-EventLog ( http://technet.Microsoft. de/de-de/library/hh849768.aspx )

Führen Sie PowerShell als Administrator aus und führen Sie den folgenden Befehl aus, um den Protokollnamen und die Quelle zu ändern, die Sie benötigen.

New-EventLog -LogName Application -Source TFSAggregator

Ich habe es verwendet, um das Ereignisprotokoll-Ausnahme, wenn Aggregator ausgeführt wird Problem von Codeplex zu lösen.

1
John Brown

Meine App wird auf Client-Webservern installiert. Anstatt mit den Netzwerkdienst-Berechtigungen und der Registrierung zu fummeln, habe ich mich dafür entschieden, SourceExists zu überprüfen und CreateEventSource in meinem Installationsprogramm auszuführen.

Ich habe der App auch einen Versuch/Haken um log.source = "xx" Hinzugefügt, um sie auf eine bekannte Quelle zu setzen, wenn meine Ereignisquelle nicht erstellt wurde ).

0
basher

versuchen Sie es unten in web.config

 <system.web>

<trust level="Full"/>

</system.web>
0
Anjan Kant

Die Lösung ist sehr einfach - Führen Sie Visual Studio Application im Admin-Modus aus!

0
frigate