System.Security.SecurityException ao gravar no log de eventos

189

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

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

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 esse aplicativo a permissão necessária, 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 fonte não foi encontrada, mas alguns ou todos os logs de eventos 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 o local da exceção podem ser identificadas usando o rastreamento da pilha de exceções abaixo.

Rastreio de pilha:

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

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

[recorte]

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

  1. Conceda permissão de acesso total a "Todos" à chave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security. Isso funcionou. Mas, naturalmente, não posso fazer isso na produção. Então, excluí a permissão "Todos" depois de executar o aplicativo por alguns minutos e o erro reapareceu.

  2. Criei a fonte no log do aplicativo e no log de segurança (e verifiquei que ele existe via regedit) durante a instalação com permissões elevadas, mas o erro permaneceu.

  3. Dei ao aplicativo um nível de confiança total no web.configarquivo (e no uso appcmd.exe), mas sem sucesso.

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

PS: Este é um acompanhamento para esta pergunta . Eu segui as respostas dadas, mas sem sucesso (veja o item 2 acima).

encee
fonte
Eu estava recebendo isso ao tentar gravar em uma fonte personalizada em um serviço .Net que estava sendo executado como NetworkService. Acabei de alterar a fonte do log de eventos para corresponder ao nome do serviço que foi configurado por meio do pacote .Net Service Setup e funcionou sem definir permissões de registro. Notei que ao ver o nome do serviço como uma chave já em HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application
John Adams
1
Veja também: stackoverflow.com/questions/286060/…
Chris S
2
Outra resposta possível: Clique com o botão direito do mouse em exe e escolha "Executar como Administrador"
MacGyver

Respostas:

169

Para dar Network Servicepermissão de leitura à EventLog/Securitychave (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 StartentãoRun
    2. Digite regedt32ouregedit
  2. Navegue / expanda para a seguinte chave:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

  3. Clique com o botão direito nessa entrada e selecione Permissões

  4. Adicione o Network Serviceusuário

  5. Conceda permissão de leitura

ATUALIZAÇÃO: As etapas acima estão corretas nas máquinas do 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 as fontes de log de eventos durante a instalação, conforme sugerido nas páginas de SailAvid e Nicole Calinoiu. .

Estou usando a função PowerShell (chamando 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
fonte
No IIS7, você pode atribuir o "SERVIÇO DE REDE" como a identidade de um pool de aplicativos (você pode achar que ApplicationPoolIdentity é o padrão) ou, em vez disso, pode criar um novo usuário por pool de aplicativos e definir permissões nessa "conta personalizada". consulte Especificar uma identidade para um pool de aplicativos (IIS 7)
Grokodile
5
As alterações terão efeito apenas depois de reiniciar o aplicações em IIS
Zé Carlos
7
Eu dei permissão ao IIS_IUSRS para ler / gravar a chave do log de eventos e ler a chave de segurança. Meu produto precisava de acesso de gravação na chave do log de eventos porque cria sua própria fonte de eventos.
precisa saber é
1
duck9 eu corrijo para o IIS8, veja aqui para obter mais detalhes: stackoverflow.com/questions/712203/…
thedrs
1
Observe também serverfault.com/a/81246/219898 sobre usuários do pool de aplicativos e permissões relacionadas - para esta solução. Obrigado @ Michael Freidgeim - foi uma grande ajuda.
Anthony Horne
58

O problema é que as EventLog.SourceExiststentativas de acessar a EventLog\Securitychave, acesso que é permitido apenas para um administrador.

Um exemplo comum para o log de um programa 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);

No entanto, as seguintes linhas falham se o programa não tiver permissões de administrador e a chave não for encontrada em EventLog\Applicationcomo EventLog.SourceExists, em seguida, 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 exemplo HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application \ dotNET

Pode-se então remover essas duas linhas.

Você também pode criar um .regarquivo 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]
Stefan Profanter
fonte
1
É exatamente isso que faço para todos os meus serviços. Eu acredito que esta é a coisa certa a fazer. Em todos os serviços em que uso o log de eventos, tenho um arquivo .reg como o descrito acima. Uma pequena nota: o arquivo deve ser salvo como Unicode-32 (cp 1200.)
Valo 25/06
Esta resposta descreve a verdadeira razão por trás do erro. A verificação existe tenta enumerar a chave inteira. se existir, checkExists funcionará bem.
DanO 29/07
EventLog \ Security, esta é a chave para funcionar, verifique se você tem permissão para isso.
Princa
45

A solução foi conceder permissão de leitura da conta "Serviço de Rede" na chave EventLog / Security.

encee
fonte
1
Eu vejo soluções semelhantes por aí. Mas eu só estou me perguntando por que é assim. Porque vejo que muitos serviços estão conectados como NetworkService e eles devem poder ler o log / segurança de eventos. Então, por que é necessário adicionar a permissão para o NetworkService?
h - n
11
Para aqueles de nós que normalmente não rastreiam o registro, esse link pode ser útil: social.msdn.microsoft.com/forums/en-US/…
Allan
Belo link Allan. O ponto 3 da resposta aceita é importante e já me mordeu uma vez. ou seja, conceder permissão na chave de registro EventLog pai NÃO se propaga para "logs inacessíveis", como Security e Virtual Server, mesmo que sejam chaves filho no registro. Se você deseja acesso completo ao log de eventos, precisa conceder permissão em AMBOS o nível do log de eventos pai e os níveis de segurança filho.
Ben Barreth 13/03/12
1
As alterações terão efeito apenas depois de reiniciar o aplicações em IIS
Zé Carlos
Para aqueles que tentaram copiar / colar, verifique se há um espaço entre as palavras "Serviço de rede".
Chris Fremgen
7

Para mim, apenas conceder permissões de 'Leitura' para 'NetworkService' a toda a ramificação 'EventLog' funcionou.

evictorov
fonte
isso não é muito relevante, porque as subchaves como "Security" ou "Virtual Server" precisam conceder acesso de leitura individualmente, pois as permissões foram definidas para não serem herdadas da chave pai.
Serge
7

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 disparado porque o EntLib não tinha permissão para registrar uma nova fonte de eventos.

Então, comecei uma vez que meu programa compilado como administrador : registrou a fonte do evento. Então voltei a desenvolver e depurar de dentro do VS sem problemas.

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

oldbrazil
fonte
7

Essa exceção estava ocorrendo para mim em um aplicativo de console .NET em execução como uma tarefa agendada e eu estava tentando fazer basicamente a mesma coisa: criar uma nova fonte de eventos e gravar no log de eventos.

No final, definir permissões completas para o usuário sob o qual a tarefa estava sendo executada nas seguintes chaves fez o truque 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
tswann
fonte
3
Você salvou o meu dia. BTW, a permissão de leitura foi suficiente em eventlog\Applicatione eventlog\Security; controle total necessário apenas na eventlograiz.
Ruud Helderman
6

Eu tento quase tudo aqui para resolver este problema ... 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 o está executando (geralmente Serviço de Rede)
  • verifique se essa identidade pode ler KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog (clique direito, autorizações)
  • agora altere a identidade desse pool de aplicativos para Sistema local, aplique e retorne ao Serviço de rede

As credenciais serão recarregadas e o EventLog alcançável

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

Gelásio
fonte
Alterar o pool de aplicativos de "ApplicationPoolIdentity" para "LocalSystem" resolveu o problema de criar / ler logs de eventos para mim.
majestzim
4

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

nodonoghue
fonte
1
Tente também configurar o aplicativo para ser executado como LocalSystem, para que a chave do registro seja criada, e você poderá voltar para o NetworkService posteriormente.
demoncodemonkey
4

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

Dom
fonte
4

Uma nova chave com o nome da fonte usada precisa ser criada em HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Aplicativo no regEdit quando você usa System.Diagnostics.EventLog.WriteEntry ("SourceName", "ErrorMessage", EventLogEntryType.Error);

Então, basicamente, seu usuário não tem permissão para criar a chave. Você pode fazer o seguinte, dependendo do usuário que você está usando no valor Identity nas configurações Advanced Pool de Aplicativos:

  1. Execute 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 acesso total ao Controle.

    -Se você estiver usando "NetworkService" adicione o usuário NETWORK SERVICE

    -Se você estiver usando "ApplicationPoolIdentity" adicione IIS APPPOL {nome do seu pool de aplicativos} (use o local da máquina local ao pesquisar o usuário).

    -Se você estiver usando o "LocalSystem", verifique se o usuário tem permissões de administrador. Não é recomendado para vulnerabilidades.

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

Para depuração com o Visual Studio, uso "NetworkService" (é usuário do ASP.NET) e, quando o site é publicado, usei "AppicationPoolIdentity".

Pablishe
fonte
3

Para sua informação ... meu problema foi que acidentalmente selecionou "Serviço local" como a conta nas propriedades do ProcessInstaller em vez de "Sistema local". Apenas mencionando para quem mais seguiu o tutorial do MSDN, como mostra a seleção do Serviço local primeiro e eu não estava prestando muita atenção ...

DaleS
fonte
3

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

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

As principais desvantagens são a incapacidade de agrupar por esse evento e você provavelmente não possui uma identificação de evento associada, o que significa que a entrada do log pode muito bem ser prefixada com algo semelhante ao efeito "A descrição da identificação de evento 0 da origem .Net O tempo de execução não pode ser encontrado ... "se você o omitir, mas o log entra e a saída parece amplamente sensata.

O código resultante acaba tendo a seguinte aparência:

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

Obviamente, como sempre há uma chance de você estar em uma máquina que não possui essas fontes de eventos por qualquer motivo, provavelmente desejará try {} catch{}envolvê-la caso ela falhe e torne as coisas piores, mas agora os eventos são salváveis.

tobriand
fonte
2

Não estou trabalhando no IIS, mas tenho um aplicativo que lança o mesmo erro em uma caixa 2K8. Funciona muito bem em uma caixa 2K3, vai entender.

Minha resolução foi "Executar como administrador" para conceder direitos elevados ao aplicativo e tudo funciona bem. Espero que isso ajude a levá-lo na direção certa.

Windows 2008 é direitos / permissões / elevação é realmente diferente do Windows 2003, gar.

omgtitb
fonte
2

Olá, encontrei o mesmo problema quando estava desenvolvendo um aplicativo e queria instalá-lo em um PC remoto. Corrigi-o 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ê o definiu quando criou sua implantação do .NET, por exemplo, se você nomeasse seu novo aplicativo como "Meu novo aplicativo", a chave seria: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application \ Meu Novo Aplicativo

Nota2: Dependendo do eventLog em que você está gravando, você pode encontrar na sua caixa DEV, \ Application \ (como observado acima), ou também (\ System) ou (\ Security), dependendo do evento em que o aplicativo está gravando, principalmente , (\ Application) deve ficar bem o tempo todo.

2) Estar na tecla acima, no menu; Selecione "ARQUIVO" -> "Exportar" e salve o arquivo. (Nota: Isso criaria as 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, pelo argumento, chame-o de "Meu Novo Aplicativo.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 à SA para instalar esse arquivo REG, uma vez feito (como administrador), crie a chave para sua aplicação.

4) Execute seu aplicativo, ele não precisará acessar nada além dessa chave.

O problema deve estar resolvido agora.

Causa:

Ao desenvolver um aplicativo que grava qualquer coisa no EventLog, ele exigiria uma CHAVE no registro do log de eventos, se essa chave não for encontrada, tentaria criá-la, o que falharia por não ter permissões para isso. O processo acima é semelhante à implantação de um aplicativo (manualmente), enquanto estamos criando isso por conta própria e não precisamos ter dor de cabeça, pois você não está aprimorando o registro adicionando permissões a TODOS, o que é um risco de segurança nos servidores de produção.

Espero que isso ajude a resolvê-lo.

Heider Sati
fonte
2

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

Execute o PowerShell como administrador e execute o seguinte comando alterando o nome e a origem do log necessários.

Aplicativo New-EventLog -LogName -Source TFSAggregator

Usei-o para resolver a exceção do log de eventos quando o agregador executa um problema no codeplex.

John Brown
fonte
1

Teve um problema semelhante com todos os nossos servidores de 2008. O log de segurança parou de funcionar por causa de um GPO que levou o grupo Usuários Autenticados e a permissão de leitura para longe da chaveHKLM\System\CurrentControlSet\Services\EventLog\security

Colocar isso de volta por recomendação da Microsoft corrigiu o problema. Suspeito que a leitura de todos os usuários autenticados em um nível superior também corrija o seu problema.

Steve M
fonte
1

Eu bati problema semelhante - no meu caso Fonte contido <, >caracteres. Máquinas de 64 bits estão usando a nova base uniforme de log-xml, eu diria, e esses caracteres (definidos a partir da string) criam xml inválido, o que causa exceção. Indiscutivelmente, isso deve ser considerado um problema da Microsoft - não manipulando a Origem (nome / string) corretamente.

alflesio
fonte
1

A solução é muito simples - execute o aplicativo Visual Studio no modo Admin!

fragata
fonte
Ao solucionar problemas no VS e tenho esse erro, isso fez Corrigir para mim
wruckie
Isso causaria erro porque não é o VS que está chamando essa chamada, é o aplicativo que provavelmente está sendo executado em um contexto de segurança diferente.
CodeMonkey1313
0

Meu aplicativo é instalado em servidores Web clientes. Em vez de mexer nas permissões do Serviço de Rede e no registro, optei por verificar SourceExistse executarCreateEventSource no meu instalador.

Também adicionei um try / catch ao redor log.source = "xx"do aplicativo para defini-lo como uma fonte conhecida se minha fonte de eventos não fosse criada (isso só seria possível se eu trocasse hot. Dll em vez de reinstalar).

banher
fonte
0

tente abaixo em web.config

 <system.web>

<trust level="Full"/>

</system.web>
Anjan Kant
fonte
-1

Eu tive esse problema ao executar um aplicativo no VS. Tudo o que eu precisava fazer era executar o programa como Administrador uma vez, para poder executar no VS.

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

Bob Horn
fonte
-3

A reconstrução da solução funcionou para mim

stephen ebichondo
fonte