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

189

Je travaille à essayer de porter une application ASP.NET du serveur 2003 (et IIS6) au serveur 2008 (IIS7).

Lorsque j'essaye de visiter la page du 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 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 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é

Erreur source:

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 concernant 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 (String source, String machineName, Boolean readOnly) +562 System.Diagnostics.EventLog.SourceExists (String source, String machineName) +251

[couper]

Voici 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 ça 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'il 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 web.configfichier (et en utilisant appcmd.exe) mais en vain.

Quelqu'un a-t-il une idée de ce qui pourrait être fait ici?

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

enceinte
la source
J'obtenais cela en essayant d'écrire sur une source personnalisée dans un service .Net qui fonctionnait en tant que NetworkService. Je viens de modifier la source du journal des événements pour qu'elle corresponde au nom du service configuré via le package .Net Service Setup et cela a fonctionné sans définir les autorisations de 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
Jon Adams
2
Une autre réponse possible: Faites un clic droit sur exe et choisissez "Exécuter en tant qu'administrateur"
MacGyver

Réponses:

169

Pour donner l' Network Serviceautorisation de lecture sur la EventLog/Securityclé (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 StartalorsRun
    2. Entrez regedt32ouregedit
  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' Network Serviceutilisateur

  5. Donnez-lui l'autorisation de lecture

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

J'utilise la fonction PowerShell (appelant 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")
            }
    }
}
Michael Freidgeim
la source
Dans IIS7, vous pouvez attribuer le «SERVICE RÉSEAU» comme identité pour un pool d'applications (vous pouvez trouver que ApplicationPoolIdentity est la valeur par défaut) ou à la place, vous pouvez 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)
Grokodile
5
Les modifications ne prennent effet qu'après le redémarrage de votre application sur IIS
Zé Carlos
7
J'ai autorisé IIS_IUSRS à lire / écrire la clé du journal des événements et à lire la clé de sécurité. Mon produit avait besoin d'un accès en écriture sur la clé Eventlog car il crée sa propre source d'événements.
duck9
1
duck9 je corrige pour IIS8, voir ici pour plus de détails: stackoverflow.com/questions/712203
...
1
Consultez également serverfault.com/a/81246/219898 concernant les utilisateurs du pool d'applications et les autorisations associées - pour cette solution. Merci @Michael Freidgeim - a été d'une grande aide.
Anthony Horne
59

Le problème est que l ' EventLog.SourceExistsessaie d'accéder auEventLog\Security clé, accès qui n'est autorisé que pour un administrateur.

Un exemple courant de connexion à un programme C # EventLogest:

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

Cependant, les lignes suivantes échouent si le programme ne dispose pas des autorisations d'administrateur et que la clé ne se trouve pas sous EventLog\Applicationcar EventLog.SourceExistselle essaiera alors d'accéder EventLog\Security.

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

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

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

On peut alors supprimer ces deux lignes.

Vous pouvez également créer un .regfichier 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]
Stefan Profanter
la source
1
C'est exactement ce que je fais pour tous mes services. Je pense 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 note le fichier doit être enregistré sous Unicode-32 (cp 1200.)
Valo
Cette réponse décrit la vraie raison de l'erreur. Le contrôle existe tente d'énumérer la clé entière. s'il existe, checkExists fonctionne correctement.
DanO
EventLog \ Security c'est la clé pour fonctionner, assurez-vous que vous avez l'autorisation à ce sujet.
Princa
45

La solution consistait à donner au compte «Service réseau» l'autorisation de lecture sur la clé EventLog / Security.

enceinte
la source
1
Je vois des solutions similaires autour. Mais je me demande simplement pourquoi c'est comme ça. Parce que je peux voir que de nombreux services sont connectés en tant que NetworkService et qu'ils doivent pouvoir lire le journal des événements / la sécurité. Alors, pourquoi est-il nécessaire d'ajouter l'autorisation pour NetworkService?
h - n
11
Pour ceux d'entre nous qui ne parcourent pas normalement le registre, ce lien peut être utile: social.msdn.microsoft.com/forums/en-US/…
Allan
Joli lien Allan. Le point n ° 3 de la réponse acceptée est important et m'a déjà mordu une fois. c'est-à-dire que l'octroi de l'autorisation sur la clé de registre EventLog parente ne se propage PAS aux «journaux inaccessibles» tels que Security et Virtual Server, même s'il s'agit de clés enfants dans le registre. Si vous souhaitez un accès complet au journal des événements, vous devez accorder une autorisation au niveau du journal des événements parent et aux niveaux de sécurité enfants.
Ben Barreth
1
Les modifications ne prennent effet qu'après le redémarrage de votre application sur IIS
Zé Carlos
Pour ceux qui ont essayé de copier / coller, assurez-vous qu'il y a un espace entre les mots «Service réseau».
Chris Fremgen
7

Pour moi, seule l'octroi d'autorisations "Lecture" pour "NetworkService" à toute la branche "EventLog" fonctionnait.

evictorov
la source
ce n'est pas très pertinent, car 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é parent.
Serge
7

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

J'ai donc commencé une fois mon prog compilé en tant qu'administrateur : il a enregistré la source de l'événement. Ensuite, je suis retourné développer et déboguer depuis VS sans problème.

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

oldbrazil
la source
7

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

En fin de compte, la définition d'autorisations complètes pour l'utilisateur sous lequel la tâche s'exécutait sur les clés suivantes a fait l'affaire pour moi:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
Tswann
la source
3
Tu as sauvé ma journée. BTW, l'autorisation de lecture était suffisante sur eventlog\Applicationet eventlog\Security; contrôle total requis eventloguniquement sur la racine.
Ruud Helderman
6

J'essaye 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)
  • modifiez maintenant l'identité de ce pool d'applications en système local, appliquez et revenez au service réseau

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

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

Gelásio
la source
Changer le pool d'applications de "ApplicationPoolIdentity" à "LocalSystem" a résolu le problème de création / lecture des journaux d'événements pour moi.
majestzim
4

J'ai rencontré le même problème, mais j'ai dû monter d'un niveau et donner un accès complet à tout le monde à la clé HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \, au lieu de passer à la sécurité, qui a résolu le problème pour moi.

nodonoghue
la source
1
Essayez également de configurer l'application pour qu'elle s'exécute en tant que système local, afin que la clé de registre soit créée, puis vous pouvez revenir à NetworkService par la suite.
demoncodemonkey
4

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

Dom
la source
4

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

Donc, fondamentalement, votre utilisateur n'a pas l'autorisation de créer la clé. Le peut effectuer les opérations suivantes en fonction de l'utilisateur que vous utilisez à partir de la valeur Identité 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 sur la clé EventLog et sélectionnez l'option Autorisations ... 3. Ajoutez votre utilisateur avec un accès Contrôle total.

    -Si vous utilisez "NetworkService", ajoutez un utilisateur de SERVICE RÉSEAU

    -Si vous utilisez "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 droits d'administrateur. Il n'est pas recommandé pour les vulnérabilités.

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

Pour le débogage avec Visual Studio, j'utilise "NetworkService" (c'est un utilisateur ASP.NET) et lorsque le site est publié, j'utilise "AppicationPoolIdentity".

Pablishe
la source
3

FYI ... mon problème était que accidentellement sélectionné "Local Service" comme compte sur les propriétés de ProcessInstaller au lieu de "Local System". Je mentionne simplement pour quiconque a suivi le didacticiel MSDN, car la sélection du service local le montre en premier et je ne faisais pas attention ....

DaleS
la source
3

Il semble y avoir une solution évidente à cela que je n'ai pas encore vu un énorme inconvénient, du moins lorsqu'il n'est pas pratique d'obtenir des droits administratifs afin de créer votre propre source d'événements: utilisez-en une qui existe déjà.

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

Les principaux inconvénients sont l'impossibilité de regrouper par cet événement et le fait que vous n'avez probablement pas d'ID d'événement associé, ce qui signifie que l'entrée de journal peut très bien être précédée de quelque chose comme "La description de l'ID d'événement 0 de la source .Net Runtime ne peut pas être trouvé .... "si vous l'omettez, mais le journal entre et la sortie semble globalement raisonnable.

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 ne dispose pas de ces sources d'événements pour une raison quelconque, vous voudrez probablement l' try {} catch{}envelopper au cas où cela échouerait et aggraverait les choses, mais les événements sont désormais sauvegardables.

Tobriand
la source
2

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 fonctionne bien. J'espère que cela vous guidera dans la bonne direction.

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

omgtitb
la source
2

Salut, 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 résolu 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

Note 2: Selon le eventLog dans lequel vous écrivez, vous pouvez trouver sur votre boîte DEV, \ Application \ (comme indiqué ci-dessus), ou aussi (\ System) ou (\ Security) en fonction de l'événement dans lequel votre application écrit, principalement , (\ Application) devrait être correct tout le temps.

2) Être sur la touche ci-dessus, dans le menu; Sélectionnez "FILE" -> "Export", puis enregistrez le fichier. (Remarque: Cela créerait vos 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 le bien de l'argument, appelez-le «Ma nouvelle application.REG "

3) Lors du déploiement sur PRODuction, consultez l'administrateur 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éez la clé de 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:

Lors du développement d'une application qui écrit quoi que ce soit dans le EventLog, il faudrait une CLÉ pour elle sous le registre Eventlog si cette clé n'est pas trouvée, il essaierait de la créer, ce qui échoue alors pour n'avoir aucune autorisation pour le faire. Le processus ci-dessus est similaire au déploiement d'une application (manuellement) alors que nous la créons nous-mêmes, et pas besoin d'avoir un mal de tête puisque vous ne modifiez pas le registre en ajoutant des autorisations à TOUT LE MONDE, ce qui constitue un risque de sécurité sur les serveurs de production.

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

Heider Sati
la source
2

Bien que la réponse de l'installateur soit une bonne réponse, elle n'est pas toujours pratique lorsqu'il s'agit d'un logiciel que vous n'avez pas écrit. Une réponse simple consiste à créer le journal et la source d'événements à l'aide de la commande PowerShell New-EventLog ( http://technet.microsoft.com/en-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 l' exception du journal des événements lorsque l'agrégateur exécute un problème à partir du codeplex.

John Brown
la source
1

Eu un problème similaire avec tous nos serveurs 2008. Le journal de sécurité a complètement cessé de fonctionner en raison d'un objet de stratégie de groupe qui a retiré le groupe Utilisateurs authentifiés et l'autorisation de lecture de la cléHKLM\System\CurrentControlSet\Services\EventLog\security

Remettre cela en fonction de 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.

Steve M
la source
1

J'ai frappé problème similaire - dans mon cas Source contenu <, >caractères. Les machines 64 bits utilisent un nouveau journal pair - une base XML, je dirais, et ces caractères (définis à partir d'une chaîne) créent un XML invalide qui provoque une exception. Cela devrait sans doute être considéré comme un problème avec Microsoft - ne pas gérer correctement la source (nom / chaîne).

Alflesio
la source
1

La solution est très simple - Exécutez l'application Visual Studio en mode administrateur!

frégate
la source
Lors du dépannage dans VS et de cette erreur, cela l'a
résolu
Cela entraînerait une erreur car ce n'est pas VS qui appelle cet appel, c'est l'application qui s'exécute probablement dans un contexte de sécurité différent.
CodeMonkey1313
0

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 SourceExistset d'exécuterCreateEventSource mon programme d'installation.

J'ai également ajouté un essai / capture log.source = "xx"dans l'application pour le définir sur une source connue si ma source d'événement n'a pas été créée (cela ne se produirait que si j'échangeais à chaud un .dll au lieu de la réinstaller).

basher
la source
0

essayez ci-dessous dans web.config

 <system.web>

<trust level="Full"/>

</system.web>
Anjan Kant
la source
-1

J'ai eu ce problème lors de l'exécution d'une application dans VS. Tout ce que j'avais à faire était d'exécuter le programme en tant qu'administrateur une fois, puis je pourrais exécuter à partir de VS.

Pour exécuter en tant qu'administrateur, accédez simplement à votre dossier de débogage dans l'explorateur Windows. Cliquez avec le bouton droit sur le programme et choisissez Exécuter en tant qu'administrateur.

Bob Horn
la source
-3

Reconstruire la solution a fonctionné pour moi

stephen ebichondo
la source