193 votes

System.Security.SecurityException lors de l'écriture dans le journal des événements

Je travaille sur le portage d'une application ASP.NET de Server 2003 (et IIS6) vers Server 2008 (IIS7).

Lorsque j'essaie de visiter la page dans le navigateur, j'obtiens ceci :

Erreur serveur dans l'application ‘/’.

Exception de sécurité

Description : L'application a tenté d'effectuer une opération non autorisée par la stratégie de sécurité. Pour accorder à cette application les autorisations requises, veuillez contacter votre administrateur système ou modifier le niveau de confiance de l'application dans le fichier de configuration.

Détails de l'exception : System.Security.SecurityException: La source n'a pas été trouvée, mais certains ou tous les journaux d'événements n'ont pas pu être recherchés. Journaux inaccessibles : Sécurité

Source de l'erreur :

Une exception non gérée a été générée lors de l'exécution de la requête web actuelle. Les informations sur l'origine et l'emplacement de l'exception peuvent être identifiées en utilisant la trace de la pile d'exception ci-dessous.

Trace de la pile :

[SecurityException: La source n'a pas été trouvée, mais certains ou tous les journaux d'événements n'ont pas pu être recherchés. Journaux inaccessibles : Sécurité.]

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

[snip]

Voici ce que j'ai fait pour essayer de résoudre le problème :

  1. Donner l'autorisation d'accès complet à "Tout le monde" à la clé HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security. Cela a fonctionné. Mais naturellement, je ne peux pas faire cela en production. J'ai donc supprimé l'autorisation "Tout le monde" après avoir exécuté l'application pendant quelques minutes et l'erreur est réapparue.

  2. J'ai créé la source dans le journal des applications et le journal de sécurité (et j'ai vérifié qu'elle existe via regedit) lors de l'installation avec des autorisations élevées mais l'erreur est restée.

  3. J'ai donné à l'application un niveau de confiance complet dans le fichier web.config (et en utilisant appcmd.exe) mais en vain.

Est-ce que quelqu'un a une idée de ce qui pourrait être fait ici ?

PS : Ceci est un suivi à cette question. J'ai suivi les réponses données mais en vain (voir n°2 ci-dessus).

0 votes

Je recevais ceci en essayant d'écrire vers une source personnalisée dans un service .Net qui s'exécutait en tant que NetworkService. J'ai simplement changé la source du journal d'événements pour correspondre au nom du service qui avait été configuré via le package de configuration du service .Net et cela a fonctionné sans définir les autorisations du registre. Je l'ai remarqué en voyant le nom du service comme une clé déjà dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application

1 votes

2 votes

Une autre réponse possible : Cliquez avec le bouton droit sur le fichier .exe et choisissez "Exécuter en tant qu'administrateur"

172voto

Michael Freidgeim Points 4002

Pour donner la permission de lecture à Network Service sur la clé EventLog/Security (comme suggéré par Firenzi et royrules22), suivez les instructions du lien

  1. Ouvrez l'Éditeur du Registre : Sélectionnez Démarrer puis Exécuter. Entrez regedt32 ou regedit
  2. Naviguez/étendez jusqu'à la clé suivante :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security
3. Faites un clic droit sur cette entrée et sélectionnez Autorisations

  1. Ajoutez l'utilisateur Network Service

  2. Donnez-lui la permission de lecture

MISE À JOUR : Les étapes ci-dessus sont correctes sur les machines de développement, où vous n'utilisez pas de processus de déploiement pour installer l'application.
Cependant, si vous déployez votre application sur d'autres machine(s), envisagez de enregistrer les sources de journal d'événements lors de l'installation comme suggéré dans les réponses de SailAvid et Nicole Calinoiu.

J'utilise la fonction PowerShell (appelée dans 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")
            }
    }
}

Voir aussi Microsoft KB 2028427 Échec de l'écriture dans le journal d'événements Windows à partir d'une application ASP.NET ou ASP

0 votes

Dans IIS7, vous pouvez assigner le "NETWORK SERVICE" comme identité pour un pool d'applications (vous pourriez constater que ApplicationPoolIdentity est la valeur par défaut) ou vous pouvez plutôt créer un nouvel utilisateur par pool d'applications et définir des autorisations sur ce "compte personnalisé". voir Spécifier une identité pour un pool d'applications (IIS 7)

6 votes

Les modifications ne prendront effet qu'après le redémarrage de votre application sur IIS.

7 votes

J'ai donné la permission à IIS_IUSRS de lire/écrire la clé de journal des événements, et de lire la clé de sécurité. Mon produit avait besoin d'un accès en écriture sur la clé de journal des événements car il crée sa propre source d'événements.

61voto

SailAvid Points 840

Le problème est que EventLog.SourceExists essaie d'accéder à la clé EventLog\Security, un accès qui n'est autorisé que pour un administrateur.

Un exemple courant pour un programme C# se connectant à EventLog est :

string sSource;
string sLog;
string sEvent;

sSource = "Application d'exemple dotNET";
sLog = "Application";
sEvent = "Événement d'exemple";

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

EventLog.WriteEntry(sSource, sEvent);
EventLog.WriteEntry(sSource, sEvent, EventLogEntryType.Warning, 234);

Cependant, les lignes suivantes échouent si le programme n'a pas les autorisations d'administrateur et si la clé n'est pas trouvée sous EventLog\Application car EventLog.SourceExists essaiera alors d'accéder à EventLog\Security.

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

Par conséquent, il est recommandé de créer un script d'installation, qui crée la clé correspondante, à savoir :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\Application d'exemple dotNET

Vous pouvez alors supprimer ces deux lignes.

Vous pouvez également créer un fichier .reg pour créer la clé du registre. Enregistrez simplement le texte suivant dans un fichier create.reg :

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\Application d'exemple dotNET]

1 votes

C'est exactement ce que je fais pour tous mes services. Je crois que c'est la bonne chose à faire. Dans chaque service où j'utilise le journal des événements, j'ai un fichier .reg comme celui ci-dessus. Une petite remarque, le fichier doit être enregistré en Unicode-32 (cp 1200).

0 votes

Cette réponse décrit la vraie raison derrière l'erreur. La vérification existe essaie d'énumérer la clé entière. Si elle existe, checkExists fonctionne correctement.

0 votes

Ceci est la clé de la fonction, assurez-vous d'avoir la permission pour cela.

46voto

royrules22 Points 1335

La solution était de donner à l'utilisateur "Network Service" l'autorisation de lecture sur la clé EventLog/Security.

1 votes

Je vois des solutions similaires autour. Mais je me demande juste pourquoi c'est comme ça. Parce que je vois que beaucoup de services sont connectés en tant que NetworkService et ils doivent pouvoir lire le journal des événements / sécurité. Alors pourquoi est-il nécessaire d'ajouter l'autorisation pour NetworkService ?

12 votes

Pour ceux d'entre nous qui ne consultent pas habituellement le registre, ce lien peut être utile: social.msdn.microsoft.com/forums/en-US/…

0 votes

Joli lien Allan. Le point #3 de la réponse acceptée est important et m'a déjà causé des problèmes. à savoir, accorder des autorisations au niveau de la clé de registre parent EventLog ne se propage PAS aux "logs inaccessibles" tels que Security et Virtual Server, même s'ils sont des clés enfants dans le registre. Si vous voulez un accès complet aux journaux d'événements, vous devez accorder des autorisations à la FOIS au niveau du journal d'événements parent et aux niveaux enfants de Security.

7voto

oldbrazil Points 147

J'ai eu un problème très similaire avec un programme console que je développe sous VS2010 (mis à niveau depuis VS2008 sous XP) Mon programme utilise EnLib pour effectuer certains enregistrements. L'erreur a été déclenchée parce qu'EntLib n'avait pas la permission d'enregistrer un nouveau source d'événement.

Alors j'ai démarré une fois mon programme compilé en tant qu'administrateur : il a enregistré le source d'événement. Ensuite, je suis retourné à développer et déboguer à l'intérieur de VS sans problème.

(vous pouvez également consulter http://www.blackwasp.co.uk/EventLog_3.aspx, cela m'a aidé)

7voto

evictorov Points 91

Pour moi, accorder uniquement les autorisations de lecture à 'NetworkService' pour la branche entière 'EventLog' a fonctionné.

0 votes

Cela n'est pas très pertinent, car les permissions pour les sous-clés telles que "Sécurité" ou "Serveur Virtuel" doivent accorder un accès en lecture individuellement, car les autorisations ont été définies pour ne pas hériter de la clé parente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X