System.Security.SecurityException ao gravar no log de events

Estou trabalhando para tentar portar um aplicativo ASP.NET do Server 2003 (e do IIS6) para o Server 2008 (IIS7).

Quando tento visitar a página no navegador, recebo isto:

Erro de Servidor na ‘/’ Aplicação.

Exceção de segurança

Descrição: o aplicativo tentou executar uma operação não permitida pela política de segurança. Para conceder a permissão necessária a essa inscrição, entre em contato com o administrador do sistema ou altere o nível de confiança do aplicativo no arquivo de configuração.

Detalhes da exceção: System.Security.SecurityException: A origem não foi encontrada, mas alguns ou todos os logs de events não puderam ser pesquisados. Logs inacessíveis: segurança

Erro de origem:

Uma exceção não tratada foi gerada durante a execução da solicitação da web atual. Informações sobre a origem e a localização da exceção podem ser identificadas usando o rastreamento de pilha de exceção abaixo.

Rastreamento de pilha:

[SecurityException: a origem não foi encontrada, mas alguns ou todos os logs de events não puderam ser pesquisados. Logs inacessíveis: segurança.]

System.Diagnostics.EventLog.FindSourceRegistration (String fonte, String machineName, Boolean readOnly) +562 System.Diagnostics.EventLog.SourceExists (fonte de cadeia de caracteres, String machineName) +251

[recorte]

Estas são as coisas que fiz para tentar resolvê-lo:

  1. Conceda permissão de access total a todos para a chave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security . Isso funcionou. Mas naturalmente não posso fazer isso em produção. Por isso, excluí a permissão “Todos” depois de executar o aplicativo por alguns minutos e o erro reapareceu.

  2. Eu criei a fonte no log do aplicativo e no log de segurança (e verifiquei que existe via regedit) durante a instalação com permissions elevadas, mas o erro permaneceu.

  3. Eu dei ao aplicativo um nível de confiança total no arquivo web.config (e usando appcmd.exe ), mas sem sucesso.

Alguém tem uma ideia do que poderia ser feito aqui?

PS: Este é um seguimento a esta questão . Eu segui as respostas dadas, mas sem sucesso (ver # 2 acima).

Para dar permissão de leitura ao Network Service na chave EventLog/Security (conforme sugerido por Firenzi e royrules22), siga as instruções em http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx

  1. Abra o Editor do Registro:
    1. Selecione Start depois Run
    2. Digite regedt32 ou regedit
  2. Navegue / expanda para a seguinte chave:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

  3. Clique com o botão direito nesta input e selecione Permissões

  4. Adicione o usuário do Network Service

  5. Dar permissão de leitura

ATUALIZAÇÃO: As etapas acima estão ok em máquinas de desenvolvedor, nas quais você não usa o processo de implantação para instalar o aplicativo.
No entanto, se você implantar seu aplicativo em outra (s) máquina (s), considere registrar origens de log de events durante a instalação, como sugerido nas respostas de SailAvid e Nicole Calinoiu .

Estou usando a function do PowerShell (chamando no 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") } } } 

O problema é que o EventLog.SourceExists tenta acessar a chave EventLog\Security , access que é permitido somente para um administrador.

Um exemplo comum para um programa em C # logando no 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); 

No entanto, as linhas a seguir falharão se o programa não tiver permissions de administrador e a chave não for encontrada em EventLog\Application pois EventLog.SourceExists tentará acessar EventLog\Security .

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

Portanto, a maneira recomendada é criar um script de instalação, que cria a chave correspondente, a saber:

Aplicativo de Amostra HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application \ dotNET

Pode-se então remover essas duas linhas.

Você também pode criar um arquivo .reg para criar a chave do Registro. Simplesmente salve o seguinte texto em um arquivo create.reg :

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

A solução foi fornecer a permissão de leitura da conta “Serviço de Rede” na chave EventLog / Security.

Para mim, apenas conceder permissions ‘Read’ para ‘NetworkService’ a toda a ramificação ‘EventLog’ funcionou.

Eu tive um problema muito semelhante com um programa de console que desenvolvo no VS2010 (atualizado do VS2008 no XP) Meu prog usa o EnLib para fazer alguns registros. O erro foi triggersdo porque o EntLib não tinha permissão para registrar uma nova fonte de events.

Então eu comecei uma vez meu prog compilado como um administrador : ele registrou a fonte do evento. Então voltei a desenvolver e depurar dentro do VS sem problema.

(você também pode se referir a http://www.blackwasp.co.uk/EventLog_3.aspx , isso me ajudou

Eu tento quase tudo aqui para resolver este problema … Eu compartilho aqui a resposta que me ajuda:

Outra maneira de resolver o problema:

  • no console do IIS, vá para o pool de aplicativos que gerencia seu site e observe a identidade que está sendo executada (geralmente, Serviço de Rede)
  • Certifique-se de que essa identidade possa ler KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog (clique direito, autorizações)
  • Agora altere a identidade deste pool de aplicativos para Sistema Local, aplique e retorne ao Serviço de Rede

As credenciais serão recarregadas e o EventLog será acessado

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

Esta exceção estava ocorrendo para mim a partir de um aplicativo de console .NET executado como uma tarefa agendada, e eu estava tentando fazer basicamente a mesma coisa – criar uma nova fonte de events e gravar no log de events.

No final, a configuração de permissions completas para o usuário em que a tarefa estava sendo executada nas seguintes chaves foi útil para mim:

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

Eu corri para o mesmo problema, mas eu tive que subir um nível e dar access total a todos para a chave HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \, em vez de ir para a segurança, que esclareceu o problema para mim.

Mesmo problema no Windows 7 64bits. Executar como administrador resolveu o problema.

FYI … meu problema foi que acidentalmente selecionado “Serviço Local” como a conta em propriedades do ProcessInstaller em vez de “Sistema Local”. Apenas mencionando para qualquer outra pessoa que seguiu o tutorial do MSDN como a seleção de Serviço Local mostra primeiro e eu não estava prestando muita atenção ….

Uma nova chave com o nome de origem usado precisa ser criada em HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Application no regEdit quando você usa System.Diagnostics.EventLog.WriteEntry (“SourceName”, “ErrorMessage”, EventLogEntryType.Error);

Então, basicamente, o usuário não tem permissão para criar a chave. O pode fazer o seguinte dependendo do usuário que você está usando do valor Identity nas configurações avançadas do pool de aplicativos:

  1. Executar RegEdit e vá para HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog
  2. Clique com o botão direito do mouse na chave EventLog e selecione a opção Permissões … 3.Adicione seu usuário com access total ao Controle.

    -Se você estiver usando o “NetworkService”, adicione o usuário NETWORK SERVICE

    -Se você está usinf “ApplicationPoolIdentity” adicionar IIS APPPOL {nome do seu pool de aplicativos} (use a localização da máquina local quando pesquisa o usuário).

    -Se você estiver usando “LocalSystem”, verifique se o usuário tem permissions de administrador. Não é recomendável para vulnerabilidades.

  3. Repita as etapas de 1 a 3 para HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Security

Para debugging com o Visual Studio eu uso “NetworkService” (é usuário do ASP.NET) e quando o site é publicado eu usei “AppicationPoolIdentity”.

Eu não estou trabalhando no IIS, mas eu tenho um aplicativo que lança o mesmo erro em uma checkbox de 2K8. Ele funciona muito bem em uma checkbox de 2K3, vai descobrir.

Minha resolução foi “Executar como administrador” para dar à aplicação direitos elevados e tudo funciona bem. Espero que isso ajude você na direção certa.

Windows 2008 é direitos / permissions / elevação é muito diferente do Windows 2003, gar.

Oi eu corri para o mesmo problema quando eu estava desenvolvendo um aplicativo e queria instalá-lo em um PC remoto, eu corrigi-lo, fazendo o seguinte:

1) Vá para o seu registro, localize: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application (??? YOUR_SERVICE_OR_APP_NAME ???)

Observe que “(??? YOUR_SERVICE_OR_APP_NAME ???)” é o nome do seu serviço de aplicativo como você definiu quando criou sua implantação do .NET, por exemplo, se você nomear seu novo aplicativo “My new App”, a chave seria: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Aplicativo \ Meu novo aplicativo

Nota 2: Dependendo de qual eventLog você está escrevendo, você pode encontrar em sua checkbox DEV, \ Application \ (como mencionado acima), ou também (\ System) ou (\ Security) dependendo do evento em que seu aplicativo está gravando, principalmente , (\ Application) deve estar bem todas as vezes.

2) Estar na chave acima, no menu; Selecione “FILE” -> “Export” e salve o arquivo. (Nota: Isso criaria suas configurações de registro necessárias quando o aplicativo precisaria acessar essa chave para gravar no Visualizador de Eventos), o novo arquivo será um arquivo .REG, para o argumento sake, chame-o de “My New App.REG ”

3) Ao implantar no PRODuction, consulte o administrador do sistema do servidor (SA), entregue o arquivo “My New App.REG” junto com o aplicativo e peça ao SA para instalar esse arquivo REG, uma vez concluído (como admin) isso crie a chave para o seu aplicativo.

4) Execute seu aplicativo, ele não deve precisar acessar qualquer outra coisa que não seja essa chave.

O problema deve ser resolvido agora.

Causa:

Ao desenvolver um aplicativo que grava qualquer coisa no EventLog, ele exigiria uma KEY para ele no registro Eventlog, se essa chave não for encontrada, ele tentará criá-la, o que falhará por não ter permissions para isso. O processo acima, é semelhante a implantar um aplicativo (manualmente), enquanto estamos criando isso, e não há necessidade de ter dor de cabeça, pois você não está ajustando o registro adicionando permissions a TODOS, o que é um risco seguro em servidores de produção.

Espero que isso ajude a resolvê-lo.

Tive um problema semelhante com todos os nossos servidores de 2008. O log de segurança parou completamente de funcionar devido a um GPO que utilizou o grupo Usuários autenticados e permissão de leitura fora da chave HKLM\System\CurrentControlSet\Services\EventLog\security

Colocar isso de volta por recomendação da Microsoft corrigiu o problema. Eu suspeito que dar a todos os usuários autenticados a leitura em um nível mais alto também corrigirá seu problema.

Eu bati problema semelhante – no meu caso Fonte continha < , > caracteres. Máquinas de 64 bits estão usando novo mesmo log-xml base, eu diria e esses caracteres (conjunto de string) criam xml inválido que causa exceção. Provavelmente isso deve ser considerado problema da Microsoft - não lidar com a fonte (nome / string) corretamente.

Embora a resposta do instalador seja uma boa resposta, nem sempre é prático quando se lida com software que você não escreveu. Uma resposta simples é criar o log e a fonte de evento usando o comando do PowerShell New-EventLog ( http://technet.microsoft.com/pt-br/library/hh849768.aspx )

Execute o PowerShell como administrador e execute o seguinte comando, alterando o nome do log e a origem de que você precisa.

Novo-EventLog -LogName Application -Source TFSAggregator

Eu usei para resolver a exceção do log de events quando o Aggregator executa o problema do codeplex.

Parece haver uma solução obviamente óbvia para isso, que ainda não vi uma grande desvantagem, pelo menos onde não é prático obter direitos administrativos para criar sua própria fonte de events: use uma que já esteja lá.

Os dois que eu comecei a usar são “.Net Runtime” e “Application Error”, os quais parecem estar presentes na maioria das máquinas.

As principais desvantagens são a incapacidade de agrupar por esse evento e que você provavelmente não possui um Event ID associado, o que significa que a input de log pode muito bem ser prefixada com algo com o efeito de “A descrição para Event ID 0 da fonte .Net O tempo de execução não pode ser encontrado …. “se você omiti-lo, mas o log entra, e a saída parece amplamente sensível.

O código resultante acaba parecendo:

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

Naturalmente, como há sempre uma chance de você estar em uma máquina que não tem essas fonts de events por qualquer razão, você provavelmente vai querer try {} catch{} encapsulá-la caso ela falhe e torne as coisas piores, mas os events são agora economizável.

Meu aplicativo é instalado em servidores da web do cliente. Em vez de mexer nas permissions do serviço de rede e no registro, optei por verificar o SourceExists e executar o CreateEventSource no meu instalador.

Eu também adicionei um try / catch em torno de log.source = "xx" no aplicativo para configurá-lo para uma fonte conhecida se a minha fonte de evento não fosse criada (Isso só apareceria se eu trocasse um .dll em vez de instalação).

A solução é muito simples – Execute o Visual Studio Application no modo Admin!

tente abaixo em web.config

     

Eu tive esse problema ao executar um aplicativo no VS. Tudo o que eu tinha que fazer era rodar o programa como Administrador uma vez, então eu poderia rodar de dentro do VS.

Para executar como administrador, basta navegar para a sua pasta de debugging no Windows Explorer. Clique com o botão direito do mouse no programa e escolha Executar como administrador.

Reconstruir a solução funcionou para mim