System.Security.SecurityException durante la scrittura nel registro eventi

Sto lavorando per provare a eseguire il porting di un’app ASP.NET da Server 2003 (e IIS6) a Server 2008 (IIS7).

Quando provo a visitare la pagina sul browser ottengo questo:

Errore del server nell’applicazione ‘/’

Eccezione di sicurezza

Descrizione: l’applicazione ha tentato di eseguire un’operazione non consentita dalla politica di sicurezza. Per concedere a questa applicazione l’authorization richiesta, contattare l’amministratore di sistema o modificare il livello di attendibilità dell’applicazione nel file di configurazione.

Dettagli eccezione: System.Security.SecurityException: l’origine non è stata trovata, ma alcuni o tutti i registri eventi non possono essere cercati. Log inaccessibile: sicurezza

Errore di origine:

Un’eccezione non gestita è stata generata durante l’esecuzione della richiesta web corrente. Le informazioni relative all’origine e alla posizione dell’eccezione possono essere identificate utilizzando la traccia dello stack di eccezioni di seguito.

Stack Trace:

[SecurityException: la fonte non è stata trovata, ma alcuni o tutti i log degli eventi non possono essere cercati. Log inaccessibile: sicurezza.]

System.Diagnostics.EventLog.FindSourceRegistration (Origine stringa, String machineName, Boolean readOnly) +562 System.Diagnostics.EventLog.SourceExists (Origine stringa, String machineName) +251

[Omissis]

Queste sono le cose che ho fatto per cercare di risolverlo:

  1. Assegna a “Tutti” l’authorization di accesso completo alla chiave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security . Questo ha funzionato. Ma naturalmente non posso farlo in produzione. Quindi ho cancellato il permesso “Tutti” dopo aver eseguito l’app per alcuni minuti e l’errore è ricomparso.

  2. Ho creato l’origine nel registro dell’applicazione e nel registro di sicurezza (e l’ho verificato tramite regedit) durante l’installazione con autorizzazioni elevate ma l’errore è rimasto.

  3. Ho dato all’app un livello di affidabilità completo nel file web.config (e utilizzando appcmd.exe ) ma senza risultati.

Qualcuno ha un’idea di cosa si potrebbe fare qui?

PS: questo è un seguito a questa domanda . Ho seguito le risposte date ma senza risultato (vedi # 2 sopra).

Per dare il permesso di lettura del Network Service sulla chiave EventLog/Security (come suggerito da Firenzi e royrules22) seguire le istruzioni da http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx

  1. Apri l’editor del registro:
    1. Seleziona Start quindi Run
    2. Inserisci regedt32 o regedit
  2. Naviga / espandi alla seguente chiave:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

  3. Fare clic con il tasto destro su questa voce e selezionare Autorizzazioni

  4. Aggiungi l’utente del Network Service

  5. Dagli il permesso di leggere

AGGIORNAMENTO: i passaggi precedenti sono ok sui computer degli sviluppatori, in cui non si utilizza il processo di distribuzione per installare l’applicazione.
Tuttavia, se si distribuisce l’applicazione su altre macchine, prendere in considerazione la registrazione delle fonti del registro eventi durante l’installazione come suggerito nelle risposte di SailAvid e Nicole Calinoiu .

Sto usando la funzione PowerShell (chiamata 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") } } } 

Il problema è che EventLog.SourceExists prova ad accedere alla chiave EventLog\Security , accesso che è consentito solo per un amministratore.

Un esempio comune di registrazione di un programma C # in EventLog è:

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

Tuttavia, le righe seguenti non hanno esito positivo se il programma non dispone di autorizzazioni di amministratore e la chiave non viene trovata in EventLog\Application poiché EventLog.SourceExists tenterà quindi di accedere a EventLog\Security .

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

Pertanto il modo consigliato è quello di creare uno script di installazione, che crea la chiave corrispondente, vale a dire:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application \ dotNET Esempio di app

Si può quindi rimuovere quelle due linee.

È anche ansible creare un file .reg per creare la chiave di registro. Basta salvare il seguente testo in un file create.reg :

 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App] 

La soluzione era di dare l’authorization di lettura dell’account “Servizio di rete” sulla chiave EventLog / Security.

Per me, la concessione di permessi di “lettura” per “NetworkService” all’intero ramo “EventLog” ha funzionato.

Ho avuto un problema molto simile con un programma di console che sviluppo sotto VS2010 (aggiornato da VS2008 in XP) Il mio prog utilizza EnLib per fare un po ‘di registrazione. L’errore è stato generato perché EntLib non aveva il permesso di registrare una nuova fonte di eventi.

Così ho iniziato una volta il mio prog compilato come amministratore : ha registrato la fonte dell’evento. Poi sono tornato a sviluppare ed eseguire il debugging da VS senza problemi.

(Puoi anche fare riferimento a http://www.blackwasp.co.uk/EventLog_3.aspx , mi ha aiutato

Provo quasi tutto qui dentro per risolvere questo problema … Condivido qui la risposta che mi aiuta:

Un altro modo per risolvere il problema:

  • nella console di IIS, vai al pool di applicazioni che gestisce il tuo sito e prendi nota dell’identity framework che lo esegue (solitamente Servizio di rete)
  • assicurati che questa id quadro possa leggere KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog (rigth-click, autorizzazioni)
  • ora cambia l’identity framework di questo pool di applicazioni in Sistema locale, applica e torna al servizio di rete

Le credenziali verranno ricaricate e EventLog raggiungibile

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

Questa eccezione si stava verificando per me da un’app di console .NET in esecuzione come attività pianificata e stavo cercando di fare praticamente la stessa cosa: creare una nuova origine evento e scrivere nel registro eventi.

Alla fine, l’impostazione delle autorizzazioni complete per l’utente con cui l’attività era in esecuzione sulle seguenti chiavi ha fatto il trucco per me:

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

Mi sono imbattuto nello stesso problema, ma ho dovuto salire di un livello e concedere l’accesso completo a tutti alla chiave HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \, invece di scendere alla sicurezza, che ha risolto il problema per me.

Stesso problema su Windows 7 a 64 bit. Esegui come amministratore risolto il problema.

Cordiali saluti … il mio problema era che accidentalmente selezionato “Servizio locale” come account sulle proprietà di ProcessInstaller invece di “Sistema locale”. Solo menzionando per chiunque altro che ha seguito il tutorial MSDN come mostra la selezione del servizio locale prima e non stavo prestando molta attenzione ….

È necessario creare una nuova chiave con il nome sorgente utilizzato in HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Application in regEdit quando si utilizza System.Diagnostics.EventLog.WriteEntry (“SourceName”, “ErrorMessage”, EventLogEntryType.Error);

Quindi in pratica il tuo utente non ha il permesso di creare la chiave. È ansible eseguire quanto segue in base all’utente che si sta utilizzando dal valore Identity framework nelle impostazioni avanzate del pool di applicazioni:

  1. Esegui RegEdit e vai a HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog
  2. Fare clic con il tasto destro del mouse su EventLog key e selezionare select … option 3. Aggiungere il proprio utente con accesso completo al controllo.

    -Se si utilizza “NetworkService”, aggiungere l’utente SERVIZIO DI RETE

    -Se ci si trova in “ApplicationPoolIdentity”, aggiungere IIS APPPOL {nome del pool di app} (utilizzare la posizione della macchina locale durante la ricerca dell’utente).

    -Se si utilizza “LocalSystem”, assicurarsi che l’utente disponga delle autorizzazioni di amministratore. Non è consigliabile per le vulnerabilità.

  3. Ripeti i passaggi da 1 a 3 per HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Security

Per il debugging con Visual Studio uso “NetworkService” (è utente ASP.NET) e quando il sito è pubblicato ho usato “AppicationPoolIdentity”.

Non sto lavorando su IIS, ma ho un’applicazione che genera lo stesso errore su una scatola 2K8. Funziona bene su una scatola 2K3, vai a capire.

La mia risoluzione era “Esegui come amministratore” per dare all’applicazione diritti elevati e tutto funziona felicemente. Spero che questo ti aiuti a guidarti nella giusta direzione.

Windows 2008 è diritti / permessi / elevazione è molto diverso da Windows 2003, gar.

Ciao Ho avuto lo stesso problema quando stavo sviluppando un’applicazione e volevo installarlo su un PC remoto, l’ho risolto facendo quanto segue:

1) Vai al tuo registro, individua: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application (??? YOUR_SERVICE_OR_APP_NAME ???)

Tieni presente che “(??? YOUR_SERVICE_OR_APP_NAME ???)” è il nome del servizio dell’applicazione che hai definito quando hai creato la tua implementazione .NET, ad esempio, se hai nominato la tua nuova applicazione “La mia nuova app”, la chiave sarebbe: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application \ My New app

Nota 2: A seconda del registro eventi in cui si sta scrivendo, è ansible trovare nella propria casella DEV, \ Applicazione \ (come indicato sopra) o anche (\ Sistema) o (\ Sicurezza) a seconda dell’evento in cui la propria applicazione sta scrivendo, principalmente , (\ Applicazione) dovrebbe andare bene tutte le volte.

2) Essere sulla chiave sopra, dal menu; Seleziona “FILE” -> “Esporta”, quindi salva il file. (Nota: questo creerebbe le necessarie impostazioni del registro quando l’applicazione avrebbe bisogno di accedere a questa chiave per scrivere nel Visualizzatore eventi), il nuovo file sarà un file .REG, per l’argomento, chiamalo “La mia nuova app.REG ”

3) Quando si distribuisce su PRODuction, consultare l’amministratore del sistema del server (SA), consegnare il file “My New App.REG” insieme all’applicazione e chiedere all’AS di installare questo file REG, una volta eseguito (come admin) ciò crea la chiave per la tua applicazione.

4) Esegui la tua applicazione, non dovrebbe essere necessario accedere ad altro che non sia questa chiave.

Il problema dovrebbe essere risolto ora.

Causa:

Quando si sviluppa un’applicazione che scrive qualcosa nel EventLog, richiederebbe un KEY per esso nel registro Eventlog se questa chiave non viene trovata, proverebbe a crearla, che quindi non riesce a non avere permessi per farlo. Il processo sopra descritto è simile alla distribuzione di un’applicazione (manualmente) mentre noi stiamo creando questo da noi stessi, e non c’è bisogno di avere mal di testa poiché non si modifica il registro aggiungendo autorizzazioni a TUTTI che è un rischio di sicurezza sui server di produzione.

Spero che questo aiuti a risolverlo.

Ho avuto un problema simile con tutti i nostri server 2008. Il registro di sicurezza ha smesso di funzionare completamente a causa di un object Criteri di gruppo che ha preso il gruppo Authenticated Users e ha letto l’authorization dalla chiave HKLM\System\CurrentControlSet\Services\EventLog\security

Mettendo questo indietro per raccomandazione di Microsoft ha corretto il problema. Sospetto che dare a tutti gli utenti autenticati la lettura ad un livello più alto correggerà anche il tuo problema.

Ho riscontrato un problema simile – nel mio caso Source conteneva < , > caratteri. Le macchine a 64 bit usano la nuova anche log - base xml direi e questi caratteri (impostati dalla stringa) creano un xml non valido che causa un'eccezione. Probabilmente questo dovrebbe essere considerato problema di Microsoft - non gestendo correttamente il Source (nome / stringa).

Sebbene la risposta dell’installatore sia una buona risposta, non è sempre pratica quando si ha a che fare con software che non hai scritto. Una semplice risposta è creare il log e l’origine dell’evento usando il comando PowerShell New-EventLog ( http://technet.microsoft.com/en-us/library/hh849768.aspx )

Eseguire PowerShell come amministratore ed eseguire il seguente comando modificando il nome e l’origine del registro necessari.

New-EventLog -LogName Application -Source TFSAggregator

L’ho usato per risolvere l’ Eccezione registro eventi quando Aggregator esegue il problema da codeplex.

Sembra che ci sia una soluzione evidente per questo che devo ancora vedere un enorme svantaggio, almeno dove non è pratico ottenere i diritti amministrativi per creare la propria fonte di eventi: usarne uno che è già lì.

I due che ho iniziato a utilizzare sono “.Net Runtime” e “Application Error”, che sembrano entrambi presenti sulla maggior parte delle macchine.

I principali svantaggi sono l’incapacità di raggruppare per quell’evento e probabilmente non si ha un ID evento associato, il che significa che la voce di log potrebbe essere preceduta da qualcosa con l’effetto di “La descrizione per l’ID evento 0 dalla sorgente .Net” Runtime non può essere trovato …. “se lo ometti, ma il log entra e l’output sembra sensibilmente comprensibile.

Il codice risultante si presenta come:

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

Naturalmente, dato che c’è sempre la possibilità che tu sia su una macchina che non ha queste sorgenti di eventi per qualsiasi motivo, probabilmente vorrai try {} catch{} nel caso in cui fallisca e peggiori le cose, ma gli eventi sono ora salvabile.

La mia app viene installata sui server Web dei client. Invece di manipolare le autorizzazioni del servizio di rete e il registro, ho optato per controllare SourceExists ed eseguire CreateEventSource nel mio programma di installazione.

Ho anche aggiunto un try / catch attorno a log.source = "xx" nell’app per impostarlo su un’origine conosciuta se la mia fonte di eventi non è stata creata (Questo verrebbe solo se hot swapped un dll invece di re installazione).

La soluzione è molto semplice – Esegui l’applicazione Visual Studio in modalità amministratore!

prova di seguito in web.config

     

Ho avuto questo problema durante l’esecuzione di un’app all’interno di VS. Tutto quello che dovevo fare era eseguire il programma come amministratore una volta, quindi avrei potuto eseguire da VS.

Per eseguire come amministratore, basta navigare nella cartella di debug in Windows Explorer. Fare clic con il tasto destro del mouse sul programma e selezionare Esegui come amministratore.

La ricostruzione della soluzione ha funzionato per me