web-dev-qa-db-fra.com

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

Je tente de porter une application ASP.NET de Server 2003 (et IIS6) vers Server 2008 (IIS7).

Lorsque j'essaie de visiter la page du navigateur, je reçois 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 l’autorisation requise, veuillez contacter votre administrateur système ou modifier le niveau de confiance de l’application dans le fichier de configuration.

Détails des exceptions: 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é

Erreur de source:

Une exception non gérée a été générée lors de l'exécution de la requête Web en cours. Les informations relatives à l'origine et à l'emplacement de l'exception peuvent être identifiées à l'aide de la trace de pile d'exceptions 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 (Source de chaîne, String nom de la machine, Booléen readOnly) +562 System.Diagnostics.EventLog.SourceExists (Source de la chaîne, String machineName) +251

[couper]

C’est ce que j’ai fait pour essayer de le résoudre:

  1. Donnez à "Tout le monde" l'autorisation d'accès complet à 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 d'application 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 total 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 de cette question . J'ai suivi les réponses mais en vain (voir n ° 2 ci-dessus).

185
encee

La solution consistait à donner au compte "Service réseau" une autorisation de lecture sur la clé EventLog/Security.

46
encee

Pour donner à Network Service l'autorisation de lecture sur la touche EventLog/Security (comme suggéré par Firenzi et royrules22), suivez les instructions de http://geekswithblogs.net/timh/archive/2005/10/05/ 56029.aspx

  1. Ouvrez l'éditeur de registre:
    1. Sélectionnez Start puis Run
    2. Entrez regedt32 ou regedit
  2. Naviguez/développez 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

  4. Ajouter l'utilisateur Network Service

  5. Donnez-lui l'autorisation de lecture

UPDATE: Les étapes ci-dessus sont ok sur les machines de développement, où vous n'utilisez pas le processus de déploiement pour installer l'application.
Toutefois, si vous déployez votre application sur une autre machine, envisagez d’enregistrer les sources du journal des événements pendant l’installation comme indiqué dans la section SailAvid et Nicole Calinoi répond.

J'utilise la fonction PowerShell (j'appelle 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")
            }
    }
}
168
Michael Freidgeim

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

Voici un exemple courant de programme C # qui se connecte à 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);

Toutefois, les lignes suivantes échouent si le programme ne dispose pas des autorisations d'administrateur et que la clé est introuvable sous EventLog\Application, car EventLog.SourceExists tentera ensuite d'accéder à EventLog\Security.

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

Par conséquent, la méthode recommandée consiste à créer un script d'installation, qui crée la clé correspondante, à savoir:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Exemple d'application

On peut alors supprimer ces deux lignes.

Vous pouvez également créer un fichier .reg pour créer la clé de 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\dotNET Sample App]
54
Stefan Profanter

Pour moi, attribuer uniquement les autorisations "en lecture" pour le "service réseau" à la totalité de la branche "EventLog" fonctionnait.

8
evictorov

J'ai eu un problème très similaire avec un programme de console que je développe sous VS2010 (mis à niveau de VS2008 sous XP). Mon prog utilise EnLib pour effectuer certaines opérations de journalisation. L'erreur a été déclenchée car EntLib n'était pas autorisé à enregistrer une nouvelle source d'événements.

J'ai donc commencé une fois mon programme compilé en tant qu'administrateur : il enregistrait la source de l'événement. Ensuite, je suis revenu sans problème développer et déboguer de l’intérieur de VS.

(vous pouvez également vous référer à http://www.blackwasp.co.uk/EventLog_3.aspx , cela m'a aidé

7
oldbrazil

J'essaie presque tout ici pour résoudre ce problème ... Je partage ici la réponse qui m'aide:

Une autre façon de résoudre le problème:

  • dans la console IIS, accédez au pool d'applications gérant votre site et notez l'identité qui l'exécute (généralement le service réseau)
  • assurez-vous que cette identité peut lire KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog (clic droit, autorisations)
  • changez maintenant l'identité de ce pool d'applications en système local, appliquez-vous et revenez au service réseau

Les informations d'identification seront rechargées et EventLog sera accessible

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

6
Gelásio

Cette exception se produisait pour moi à partir d'une application de console .NET exécutée en tant que tâche planifiée, et j'essayais de faire essentiellement la même chose: créer une nouvelle source d'événements et écrire dans le journal des événements.

En fin de compte, définir des autorisations complètes pour l'utilisateur sous lequel la tâche était exécutée sur les clés suivantes a été décisif:

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

Même problème sous Windows 7 64bits. Exécuter en tant qu'administrateur a résolu le problème.

4
Dom

J'ai rencontré le même problème, mais je devais monter d'un niveau et donner à tout le monde un accès complet à la clé HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog \, au lieu de descendre à la sécurité, ce qui m'a permis de résoudre le problème.

4
nodonoghue

FYI ... mon problème était que accidentellement sélectionné "Service local" comme compte sur les propriétés du ProcessInstaller au lieu de "Système local". Il suffit de mentionner pour toute autre personne qui a suivi le didacticiel MSDN que la sélection du service local est affichée en premier et que je ne faisais pas très attention ...

3
DaleS

Une nouvelle clé avec le nom de source utilisé doit être créée sous HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Eventlog\Application dans le regEdit lorsque vous utilisez System.Diagnostics.EventLog.WriteEntry ("Nom de la source", "ErrorMessage", EventLogEntryType). .Error);

Donc, fondamentalement, votre utilisateur n’a pas l’autorisation de créer la clé. Vous pouvez effectuer les opérations suivantes en fonction de l'utilisateur que vous utilisez à partir de la valeur Identity dans les paramètres avancés du pool d'applications:

  1. Exécutez RegEdit et accédez à HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
  2. Cliquez avec le bouton droit de la souris sur EventLog et sélectionnez l'option de sélection des autorisations 3. Ajoutez votre utilisateur avec un accès de contrôle total.

    -Si vous utilisez "NetworkService" ajoutez un utilisateur NETWORK SERVICE

    -Si vous utilisez usinf "ApplicationPoolIdentity" ajoutez IIS APPPOL {nom de votre pool d'applications} (utilisez l'emplacement de la machine locale lors de la recherche de l'utilisateur).

    -Si vous utilisez "LocalSystem", assurez-vous que l'utilisateur dispose des autorisations d'administrateur. Ce n'est pas recommandé pour les vulnérabilités.

  3. Répétez les étapes 1 à 3 pour HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security

Pour le débogage avec Visual Studio, j'utilise "NetworkService" (il s'agit d'un utilisateur ASP.Net) et lorsque le site est publié, j'ai utilisé "AppicationPoolIdentity".

3
Pablishe

Bonjour, j'ai rencontré le même problème lorsque je développais une application et que je voulais l'installer sur un PC distant. Je l'ai corrigé en procédant comme suit:

1) Accédez à votre registre, recherchez: HKLM\System\CurrentControlSet\Services\EventLog\Application (??? YOUR_SERVICE_OR_APP_NAME ???)

Notez que "(??? YOUR_SERVICE_OR_APP_NAME ???)" est le nom de votre service d'application tel que vous l'avez défini lors de la création de votre déploiement .NET. Par exemple, si vous avez nommé votre nouvelle application "Ma nouvelle application", la clé serait: HKLM\System\CurrentControlSet\Services\EventLog\Application\My New app

Remarque2: Selon l’événement auquel vous écrivez, vous pouvez trouver sur votre boîte de dialogue DEV,\Application\(comme indiqué ci-dessus), ou également (\ Système) ou (\ Sécurité) en fonction de l’événement dans lequel votre application écrit, , (\ Application) devrait être bon tout le temps.

2) être sur la touche ci-dessus, dans le menu; Sélectionnez "FICHIER" -> "Exporter", puis enregistrez le fichier. (Remarque: cela créerait les paramètres de registre nécessaires lorsque l'application aurait besoin d'accéder à cette clé pour écrire dans l'observateur d'événements.), Le nouveau fichier sera un fichier .REG. Pour les besoins de l'argument, appelez-le "My New App.REG "

3) Lors du déploiement en production, consultez l'administrateur du système du serveur (SA), remettez le fichier "My New App.REG" avec l'application, et demandez au SA d'installer ce fichier REG une fois terminé. (en tant qu'administrateur), cela créerait la clé pour votre application.

4) Exécutez votre application, elle ne devrait pas avoir besoin d'accéder à autre chose que cette clé.

Le problème devrait être résolu maintenant.

Cause:

Lorsque vous développez une application qui écrit quoi que ce soit dans EventLog, une clé est requise dans le registre Eventlog. Si cette clé n'est pas trouvée, elle essaiera de la créer, ce qui échouera faute d'autorisations de le faire. Le processus ci-dessus est similaire au déploiement d'une application (manuellement) alors que nous le créons nous-mêmes, et il n'est pas nécessaire d'avoir mal à la tête puisque vous ne modifiez pas le registre en ajoutant des autorisations à EVERYONE, ce qui représente un risque de sécurité pour les serveurs de production.

J'espère que cela aide à le résoudre.

2
Heider Sati

Je ne travaille pas sur IIS, mais j'ai une application qui renvoie la même erreur sur une boîte 2K8. Cela fonctionne très bien sur une boîte 2K3, allez comprendre.

Ma résolution était de "Exécuter en tant qu'administrateur" pour donner à l'application des droits élevés et tout se passera bien. J'espère que cela vous aidera à aller dans la bonne direction.

Windows 2008 est Droits/autorisations/élévation est vraiment différent de Windows 2003, gar.

2
thomasnguyencom

Il semble y avoir une solution évidente à ce problème, à savoir que je n’ai pas encore constaté d’énormes inconvénients, du moins là où il n’est pas pratique d’obtenir des droits d’administrateur pour créer votre propre source d’événement: utilisez une source déjà existante.

Les deux que j'ai commencé à utiliser sont ".Net Runtime" et "Erreur d'application", qui semblent tous deux être présents sur la plupart des machines.

Les principaux désavantages sont l’incapacité à grouper en fonction de cet événement et le fait que vous n’avez probablement pas d’ID événement associé, ce qui signifie que l’entrée du journal peut très bien être précédée de "La description de l’ID événement 0 de la source .Net Le runtime ne peut pas être trouvé .... "si vous l'omettez, mais le journal entre et la sortie semble globalement judicieuse.

Le code résultant finit par ressembler à:

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

Bien sûr, comme il y a toujours une chance que vous soyez sur une machine qui n'a pas ces sources d'événements pour une raison quelconque, vous voudrez probablement try {} catch{} l'envelopper au cas où il échouerait et aggraverait les choses, mais les événements sont maintenant sauvable.

2
tobriand

Je rencontre un problème similaire - dans mon cas, la source contenait des caractères _<_, _>_. Les machines 64 bits utilisent une nouvelle base même log-xml je dirais et ces caractères (définis à partir d'une chaîne) créent un xml non valide qui provoque une exception. On peut soutenir que cela devrait être considéré comme un problème Microsoft - ne pas gérer correctement la source (nom/chaîne).

1
alflesio

Avait un problème similaire avec tous nos serveurs 2008. Le journal de sécurité a complètement cessé de fonctionner à cause d'un GPO qui a enlevé le groupe Utilisateurs authentifiés et obtenu l'autorisation de lire la clé HKLM\System\CurrentControlSet\Services\EventLog\security

Le fait de remettre cela selon la recommandation de Microsoft a corrigé le problème. Je pense que donner à tous les utilisateurs authentifiés une lecture à un niveau supérieur corrigera également votre problème.

1
Steve M

Bien que la réponse de l'installateur soit une bonne réponse, elle n'est pas toujours pratique lorsqu'il s'agit de logiciels que vous n'avez pas écrits. Une solution simple consiste à créer le journal et la source d'événements à l'aide de la commande PowerShell New-EventLog ( http://technet.Microsoft. com/fr-us/library/hh849768.aspx )

Exécutez PowerShell en tant qu'administrateur et exécutez la commande suivante en modifiant le nom du journal et la source dont vous avez besoin.

New-EventLog -LogName Application -Source TFSAggregator

Je l'ai utilisé pour résoudre le problème Exception du journal des événements lorsque Aggregator s'exécute à partir de codeplex.

1
John Brown

Mon application est installée sur les serveurs Web clients. Plutôt que de jouer avec les autorisations du service réseau et le registre, j'ai choisi de vérifier SourceExists et d'exécuter CreateEventSource dans mon programme d'installation.

J'ai également ajouté un try/catch around log.source = "xx" dans l'application pour le définir sur une source connue si ma source d'événement n'était pas créée (cela ne se produirait que si je remplaçais à chaud un fichier .dll au lieu de le réinstaller) .

0
basher

essayez ci-dessous dans web.config

 <system.web>

<trust level="Full"/>

</system.web>
0
Anjan Kant

La solution est très simple - Exécutez Visual Studio Application en mode Admin!

0
frigate