[asp.net] 이벤트 로그에 쓸 때 System.Security.SecurityException

ASP.NET 앱을 Server 2003 (및 IIS6)에서 Server 2008 (IIS7)로 이식하려고합니다.

브라우저의 페이지를 방문하려고하면 다음과 같은 결과가 나타납니다.

‘/’응용 프로그램에 서버 오류가 있습니다.

보안 예외

설명 : 응용 프로그램이 보안 정책에서 허용하지 않는 작업을 수행하려고했습니다. 이 응용 프로그램에 필요한 권한을 부여하려면 시스템 관리자에게 문의하거나 구성 파일에서 응용 프로그램의 신뢰 수준을 변경하십시오.

예외 정보 : System.Security.SecurityException : 원본을 찾을 수 없지만 일부 또는 모든 이벤트 로그를 검색 할 수 없습니다. 액세스 할 수없는 로그 : 보안

소스 오류 :

현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 예외의 출처와 위치에 관한 정보는 아래 예외 스택 추적을 사용하여 식별 할 수 있습니다.

스택 추적 :

[SecurityException : 소스를 찾을 수 없지만 일부 또는 모든 이벤트 로그를 검색 할 수 없습니다. 액세스 할 수없는 로그 : 보안.]

System.Diagnostics.EventLog.FindSourceRegistration (문자열 소스, 문자열 machineName, 부울 readOnly) +562 System.Diagnostics.EventLog.SourceExists (문자열 소스, 문자열 machineName) +251

[한조각]

시도하고 해결하기 위해 수행 한 작업은 다음과 같습니다.

  1. “모든 사람”에게 키에 대한 모든 액세스 권한을 부여하십시오 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security. 이것은 효과가 있었다. 그러나 자연스럽게 나는 이것을 생산에서 할 수 없습니다. 몇 분 동안 앱을 실행 한 후 “Everyone”권한을 삭제하고 오류가 다시 나타납니다.

  2. 높은 권한으로 설치하는 동안 응용 프로그램 로그 및 보안 로그에 소스를 생성하고 (regedit를 통해 존재하는지 확인했지만) 오류가 남아있었습니다.

  3. web.config파일에 (및 사용하여 appcmd.exe) 앱에 전체 신뢰 수준을 부여 했지만 아무 소용이 없습니다.

여기에서 무엇을 할 수 있는지에 대한 통찰력이 있습니까?

추신 : 이것은이 질문에 대한 후속 조치 입니다. 나는 주어진 답변을 따랐지만 아무 소용이 없습니다 (위의 2 번 참조).



답변

Firenzi 및 royrules22에서 제안한대로 키 Network Service에 대한 읽기 권한 을 부여하려면 http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx의EventLog/Security 지침을 따르십시오.

  1. 레지스트리 편집기를 엽니 다.
    1. Start그런 다음 선택Run
    2. 입력 regedt32또는regedit
  2. 다음 키를 탐색 / 확장하십시오.

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

  3. 이 항목을 마우스 오른쪽 버튼으로 클릭하고 권한을 선택하십시오.

  4. Network Service사용자 추가

  5. 읽기 권한 부여

업데이트 : 배포 프로세스를 사용하여 응용 프로그램을 설치하지 않는 개발자 컴퓨터에서는 위의 단계가 정상입니다.
그러나 응용 프로그램을 다른 컴퓨터에 배포하는 경우 SailAvidNicole Calinoiu의 답변 에서 제안한대로 설치 중에 이벤트 로그 소스등록 하는 것이 좋습니다 .

PowerShell 기능을 사용하고 있습니다 (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")
            }
    }
}


답변

문제는 관리자 만 액세스 EventLog.SourceExists할 수있는 EventLog\Security키 액세스를 시도 한다는 것 입니다.

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

프로그램이 관리자 권한을하지 않았으며 키에서 발견되지 않는 경우, 다음 줄은 실패 EventLog\ApplicationEventLog.SourceExists다음 액세스하려고합니다 EventLog\Security.

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

따라서 권장되는 방법은 설치 스크립트를 작성하여 해당 키를 작성하는 것입니다.

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application \ dotNET 샘플 앱

그런 다음 두 줄을 제거 할 수 있습니다.

.reg파일을 만들어 레지스트리 키를 만들 수도 있습니다 . 다음 텍스트를 파일로 저장하십시오 create.reg.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App]


답변

해결 방법은 “네트워크 서비스”계정에 EventLog / Security 키에 대한 읽기 권한을 부여하는 것입니다.


답변

나를 위해 전체 ‘EventLog’ 분기 에 ‘NetworkService’에 대한 ‘읽기’권한을 부여 하는 것이 효과가있었습니다.


답변

VS2010에서 개발 한 콘솔 프로그램과 매우 비슷한 문제가 발생했습니다 (XP의 VS2008에서 업그레이드 됨) 내 프로그램은 EnLib을 사용하여 로깅을 수행합니다. EntLib에 새 이벤트 소스를 등록 할 권한이 없기 때문에 오류가 발생했습니다.

그래서 컴파일 된 프로그램 을 관리자로 시작하면 이벤트 소스가 등록되었습니다. 그런 다음 VS 내부에서 문제없이 개발하고 디버깅했습니다.

( http://www.blackwasp.co.uk/EventLog_3.aspx 참조 하면 도움이되었습니다.


답변

이 예외는 예약 된 작업으로 실행되는 .NET 콘솔 응용 프로그램에서 발생했으며 기본적으로 동일한 작업을 수행하려고했습니다. 새 이벤트 소스를 만들고 이벤트 로그에 작성하십시오.

결국, 다음 키에서 작업을 실행중인 사용자에 대한 전체 권한을 설정하면 나에게 속임수가되었습니다.

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


답변

나는이 문제를 해결하기 위해 거의 모든 것을 시도합니다 … 나는 여기에 도움이되는 답변을 공유합니다.

문제를 해결하는 다른 방법 :

  • IIS 콘솔에서 사이트를 관리하는 응용 프로그램 풀로 이동하여 사이트를 실행하는 ID (일반적으로 네트워크 서비스)를 기록하십시오.
  • 이 ID가 KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog (rigth-click, 권한 부여)를 읽을 수 있는지 확인하십시오.
  • 이제이 응용 프로그램 풀의 ID를 로컬 시스템으로 변경하고 적용한 다음 네트워크 서비스로 다시 전환하십시오.

자격 증명이 다시로드되고 EventLog에 도달 할 수 있습니다.

에서 http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx , 감사 마이클 Freidgeim