System.Security.SecurityException durante la scrittura nel registro eventi


189

Sto lavorando per provare a trasferire 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'autorizzazione 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 non è stato possibile cercare alcuni o tutti i registri eventi. Registri inaccessibili: sicurezza

Errore sorgente:

È stata generata un'eccezione non gestita 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 delle eccezioni riportata di seguito.

Stack Trace:

[SecurityException: l'origine non è stata trovata, ma non è stato possibile cercare alcuni o tutti i registri degli eventi. Registri inaccessibili: 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 provare a risolverlo:

  1. Concedi alla chiave l'accesso completo a "Tutti" HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security. Questo ha funzionato. Ma naturalmente non posso farlo in produzione. Quindi ho eliminato l'autorizzazione "Tutti" dopo aver eseguito l'app per alcuni minuti e l'errore è riapparso.

  2. Ho creato l'origine nel registro applicazioni e nel registro sicurezza (e ho verificato che esiste tramite regedit) durante l'installazione con autorizzazioni elevate ma l'errore è rimasto.

  3. Ho fornito all'app un livello di attendibilità completo nel web.configfile (e nell'uso 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 fornite ma senza risultati (vedi sopra # 2).


Lo stavo ottenendo quando provavo a scrivere su una fonte personalizzata in un servizio .Net che era in esecuzione come NetworkService. Ho appena cambiato l'origine del registro eventi in modo che corrisponda al nome del servizio impostato tramite il pacchetto di installazione del servizio .Net e ha funzionato senza impostare le autorizzazioni del registro. L'ho notato vedendo il nome del servizio come chiave già in HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application
Jon Adams


2
Un'altra possibile risposta: fare clic con il tasto destro del mouse su exe e selezionare "Esegui come amministratore"
MacGyver

Risposte:


169

Per Network Serviceautorizzare la EventLog/Securitylettura della chiave (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 StartquindiRun
    2. Immettere regedt32oregedit
  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' Network Serviceutente

  5. Dagli il permesso di lettura

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 altri computer, considerare di registrare le origini del registro eventi durante l'installazione, come suggerito in SailAvid e Nicole Calinoiu .

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

In IIS7 è possibile assegnare il "SERVIZIO DI RETE" come identità per un pool di app (è possibile scoprire che ApplicationPoolIdentity è l'impostazione predefinita) oppure è possibile creare un nuovo utente per pool di applicazioni e impostare le autorizzazioni su tale "Account personalizzato". vedere Specificare un'identità per un pool di applicazioni (IIS 7)
Grokodile

5
Le modifiche hanno effetto solo dopo aver riavviato l'applicazione su IIS
Zé Carlos,

7
Ho concesso a IIS_IUSRS l'autorizzazione a leggere / scrivere la chiave del registro eventi e a leggere la chiave di sicurezza. Il mio prodotto necessitava di accesso in scrittura sulla chiave del registro eventi perché creava la propria fonte di eventi.
duck9

1
duck9 correggo per IIS8, vedi qui per maggiori dettagli: stackoverflow.com/questions/712203/...
thedrs

1
Guarda anche serverfault.com/a/81246/219898 per quanto riguarda gli utenti del pool di app e le relative autorizzazioni - per questa soluzione. Grazie @Michael Freidgeim - è stato di grande aiuto.
Anthony Horne,

59

Il problema è che EventLog.SourceExiststenta di accedere alla EventLog\Securitychiave, accesso che è consentito solo per un amministratore.

Un esempio comune per l'accesso al programma C # 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 seguenti righe hanno esito negativo se il programma non dispone delle autorizzazioni di amministratore e la chiave non viene trovata in EventLog\Applicationquanto EventLog.SourceExiststenterà quindi di accedere EventLog\Security.

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

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

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application \ dotNET App di esempio

Uno può quindi rimuovere quelle due linee.

È inoltre possibile creare un .regfile 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]

1
Questo è esattamente ciò che faccio per tutti i miei servizi. Credo che questa sia la cosa giusta da fare. In ogni servizio in cui utilizzo il registro eventi ho un file .reg come quello sopra. Una piccola nota sul file deve essere salvato come Unicode-32 (cp 1200.)
Valo

Questa risposta descrive il vero motivo dietro l'errore. Il controllo esiste tenta di enumerare l'intera chiave. se esiste, checkExists funziona bene.
DanO,

EventLog \ Security questa è la chiave per funzionare, assicurati di avere il permesso per farlo.
Princa,

45

La soluzione consisteva nel concedere l'autorizzazione di lettura all'account "Servizio di rete" sulla chiave EventLog / Security.


1
Vedo soluzioni simili in giro. Ma mi chiedo solo perché sia ​​così. Perché vedo che molti servizi sono connessi come NetworkService e devono essere in grado di leggere il registro / la sicurezza degli eventi. Quindi perché è necessario aggiungere l'autorizzazione per NetworkService?
h - n

11
Per quelli di noi che normalmente non eseguono la scansione del registro, questo link può essere utile: social.msdn.microsoft.com/forums/en-US/…
Allan

Bel collegamento Allan. Il punto 3 della risposta accettata è importante e mi ha già morso una volta. vale a dire la concessione dell'autorizzazione nella chiave di registro principale EventLog NON si propaga a "registri inaccessibili" come Security e Virtual Server, anche se sono chiavi figlio nel registro. Se si desidera l'accesso completo al registro eventi, è necessario concedere l'autorizzazione SIA a livello di registro eventi padre che a livello di sicurezza figlio.
Ben Barreth,

1
Le modifiche hanno effetto solo dopo aver riavviato l'applicazione su IIS
Zé Carlos,

Per coloro che hanno provato a copiare / incollare, assicurarsi che ci sia uno spazio tra le parole "Servizio di rete".
Chris Fremgen,

7

Per me, concedere le autorizzazioni "Leggi" per "NetworkService" all'intero ramo "EventLog" ha funzionato.


questo non è molto rilevante, poiché per le sottochiavi come "Sicurezza" o "Server virtuale" è necessario concedere l'accesso in lettura singolarmente, poiché le autorizzazioni sono state impostate su non eredità dalla chiave padre.
Serge,

7

Ho avuto un problema molto simile con un programma console che sviluppo sotto VS2010 (aggiornato da VS2008 sotto XP) Il mio prog usa EnLib per fare un po 'di registrazione. L'errore è stato generato perché EntLib non era autorizzato a registrare una nuova fonte di eventi.

Così ho iniziato una volta il mio programma compilato come amministratore : ha registrato la fonte dell'evento. Poi sono tornato indietro sviluppando e debug dall'interno di VS senza problemi.

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


7

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

Alla fine, impostare le autorizzazioni complete per l'utente in base al quale l'attività era in esecuzione sui seguenti tasti mi ha aiutato:

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

3
Mi hai salvato la giornata. A proposito, il permesso di lettura era sufficiente su eventlog\Applicatione eventlog\Security; pieno controllo richiesto solo sulla eventlogradice.
Ruud Helderman,

6

Cerco quasi tutto qui per risolvere questo problema ... Condivido qui la risposta che mi aiuta:

Un altro modo per risolvere il problema:

  • nella console IIS, vai al pool di applicazioni che gestiscono il tuo sito e prendi nota dell'identità che lo esegue (di solito Servizio di rete)
  • assicurarsi che questa identità sia in grado di leggere KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog (clic destro, autorizzazioni)
  • ora cambia l'identità di questo pool di applicazioni in Sistema locale, applica e torna a Servizio di rete

Le credenziali verranno ricaricate e EventLog sarà raggiungibile

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


La modifica del pool di app da "ApplicationPoolIdentity" a "LocalSystem" ha risolto il problema della creazione / lettura dei registri eventi per me.
majestzim

4

Ho riscontrato lo stesso problema, ma ho dovuto salire di un livello e dare pieno accesso a tutti alla chiave HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \, invece di passare alla sicurezza, che ha risolto il problema per me.


1
Prova anche a impostare l'applicazione per l'esecuzione come LocalSystem, in modo da creare la chiave di registro, quindi puoi tornare a NetworkService in seguito.
demoncodemonkey

4

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


4

Una nuova chiave con il nome sorgente utilizzato deve essere creata 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 i permessi per creare la chiave. È possibile effettuare le seguenti operazioni a seconda dell'utente che si sta utilizzando dal valore Identità 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 sul tasto EventLog e selezionare l'opzione Autorizzazioni ... 3. Aggiungere l'utente con accesso Controllo completo.

    -Se stai usando "NetworkService" aggiungere l'utente SERVIZIO DI RETE

    -Se sei usinf "ApplicationPoolIdentity" aggiungi IIS APPPOL {nome del tuo pool di app} (usa la posizione del computer locale quando cerchi l'utente).

    -Se stai usando "LocalSystem" assicurarsi che l'utente disponga delle autorizzazioni di amministratore. Non è raccomandato per le vulnerabilità.

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

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


3

Cordiali saluti ... il mio problema era che accidentalmente selezionato "Servizio locale" come l'account sulle proprietà del ProcessInstaller anziché "Sistema locale". Sto solo citando per chiunque abbia seguito il tutorial MSDN come mostra la selezione del servizio locale e non stavo prestando molta attenzione ....


3

Sembra che ci sia una soluzione palesemente ovvia a questo che devo ancora vedere un enorme svantaggio, almeno dove non è pratico ottenere diritti amministrativi per creare la tua fonte di eventi: usane uno che è già lì.

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

Gli svantaggi principali sono l'incapacità di raggruppare per quell'evento e che probabilmente non hai un ID evento associato, il che significa che la voce di registro potrebbe benissimo essere preceduta da qualcosa con l'effetto di "La descrizione dell'ID evento 0 dalla sorgente .Net Il runtime non può essere trovato .... "se lo ometti, ma il log si avvia e l'output appare ampiamente sensato.

Il codice risultante si presenta come:

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

Naturalmente, poiché c'è sempre la possibilità che tu sia su una macchina che non ha quelle fonti di eventi per qualsiasi motivo, probabilmente vorrai try {} catch{}avvolgerlo nel caso in cui fallisca e peggiori le cose, ma ora gli eventi sono salvabili.


2

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 è stata "Esegui come amministratore" per conferire all'applicazione diritti elevati e tutto funziona alla perfezione. Spero che questo ti aiuti nella giusta direzione.

Windows 2008 è diritti / autorizzazioni / elevazione è davvero diverso da Windows 2003, gar.


2

Ciao, ho riscontrato lo stesso problema durante lo sviluppo di un'applicazione e volevo installarlo su un PC remoto, l'ho risolto procedendo come segue:

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

Si noti che "(??? YOUR_SERVICE_OR_APP_NAME ???)" è il nome del servizio dell'applicazione così come lo hai definito al momento della creazione della distribuzione .NET, ad esempio, se la nuova applicazione fosse denominata "La mia nuova app", la chiave sarebbe: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application \ My New app

Nota2: a seconda dell'eventoLog in cui si sta scrivendo, è possibile trovare nella casella DEV, \ Applicazione \ (come indicato sopra) o anche (\ Sistema) o (\ Sicurezza) a seconda dell'evento in cui l'applicazione sta scrivendo, principalmente , (\ Applicazione) dovrebbe andare sempre bene.

2) Essere sul tasto sopra, Dal menu; Selezionare "FILE" -> "Esporta", quindi salvare il file. (Nota: questo creerebbe le impostazioni del registro necessarie 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 "My New 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 alla SA di installare questo file REG, una volta fatto (come admin) questo crea la chiave per la tua applicazione.

4) Esegui l'applicazione, non dovrebbe avere bisogno di accedere a nient'altro che a questa chiave.

Ormai il problema dovrebbe essere risolto.

Causa:

Quando si sviluppa un'applicazione che scrive qualsiasi cosa nel EventLog, richiederebbe un KEY per esso nel registro Eventlog se questa chiave non viene trovata, proverà a crearla, che quindi non riesce a non avere le autorizzazioni per farlo. Il processo sopra descritto è simile alla distribuzione di un'applicazione (manualmente) mentre la stiamo creando noi stessi e non è necessario avere mal di testa poiché non si sta modificando il registro aggiungendo autorizzazioni a TUTTI, il che rappresenta un rischio sicuro sui server di produzione.

Spero che questo aiuti a risolverlo.


2

Sebbene la risposta dell'installatore sia una buona risposta, non è sempre pratico quando si tratta di software che non si è scritto. Una semplice risposta è quella di creare il registro e l'origine eventi utilizzando il comando PowerShell New-EventLog ( http://technet.microsoft.com/en-us/library/hh849768.aspx )

Esegui PowerShell come amministratore ed esegui il comando seguente modificando il nome registro e l'origine di cui hai bisogno.

New-EventLog -logname Applicazione -Source TFSAggregator

L'ho usato per risolvere l' eccezione del registro eventi quando Aggregator esegue il problema da codeplex.


1

Si è verificato un problema simile con tutti i nostri server 2008. Il registro di sicurezza ha smesso di funzionare del tutto a causa di un oggetto Criteri di gruppo che ha portato il gruppo Utenti autenticati e ha letto l'autorizzazione dalla chiaveHKLM\System\CurrentControlSet\Services\EventLog\security

Rimettendo questo secondo la raccomandazione di Microsoft, il problema è stato corretto. Sospetto che dare a tutti gli utenti autenticati la lettura a un livello superiore risolverà anche il tuo problema.


1

Ho riscontrato un problema simile: nel mio caso conteneva la fonte <, i >personaggi. Le macchine a 64 bit usano una nuova base di log - xml direi e questi caratteri (impostati dalla stringa) creano xml non validi che causano eccezioni. Probabilmente questo dovrebbe essere considerato il problema di Microsoft - non gestire correttamente l'origine (nome / stringa).


1

La soluzione è molto semplice: esegui l'applicazione Visual Studio in modalità amministratore!


Durante la risoluzione dei problemi in VS e ho
riscontrato

Questo errore sarebbe perché non è VS che sta invocando questa chiamata, è l'applicazione che probabilmente è in esecuzione in un diverso contesto di sicurezza.
CodeMonkey1313

0

La mia app viene installata sui server Web client. Invece di armeggiare con le autorizzazioni del servizio di rete e il registro, ho scelto di controllare SourceExistsed eseguire CreateEventSourcenel mio programma di installazione.

Ho anche aggiunto un tentativo / catch log.source = "xx"in the app per impostarlo su una fonte nota se la mia fonte di eventi non è stata creata (Ciò si verificherebbe solo se avessi scambiato a caldo un .dll invece di reinstallarlo).


0

prova di seguito in web.config

 <system.web>

<trust level="Full"/>

</system.web>

-1

Ho riscontrato questo problema durante l'esecuzione di un'app in VS. Tutto quello che dovevo fare era eseguire il programma come amministratore una volta, quindi ho potuto eseguire da VS.

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.