[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
[한조각]
시도하고 해결하기 위해 수행 한 작업은 다음과 같습니다.
-
“모든 사람”에게 키에 대한 모든 액세스 권한을 부여하십시오
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security
. 이것은 효과가 있었다. 그러나 자연스럽게 나는 이것을 생산에서 할 수 없습니다. 몇 분 동안 앱을 실행 한 후 “Everyone”권한을 삭제하고 오류가 다시 나타납니다. -
높은 권한으로 설치하는 동안 응용 프로그램 로그 및 보안 로그에 소스를 생성하고 (regedit를 통해 존재하는지 확인했지만) 오류가 남아있었습니다.
-
web.config
파일에 (및 사용하여appcmd.exe
) 앱에 전체 신뢰 수준을 부여 했지만 아무 소용이 없습니다.
여기에서 무엇을 할 수 있는지에 대한 통찰력이 있습니까?
추신 : 이것은이 질문에 대한 후속 조치 입니다. 나는 주어진 답변을 따랐지만 아무 소용이 없습니다 (위의 2 번 참조).
답변
Firenzi 및 royrules22에서 제안한대로 키 Network Service
에 대한 읽기 권한 을 부여하려면 http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx의EventLog/Security
지침을 따르십시오.
- 레지스트리 편집기를 엽니 다.
Start
그런 다음 선택Run
- 입력
regedt32
또는regedit
-
다음 키를 탐색 / 확장하십시오.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security
-
이 항목을 마우스 오른쪽 버튼으로 클릭하고 권한을 선택하십시오.
-
Network Service
사용자 추가 -
읽기 권한 부여
업데이트 : 배포 프로세스를 사용하여 응용 프로그램을 설치하지 않는 개발자 컴퓨터에서는 위의 단계가 정상입니다.
그러나 응용 프로그램을 다른 컴퓨터에 배포하는 경우 SailAvid 및 Nicole 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\Application
로 EventLog.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