이벤트 로그에 쓸 때 System.Security.SecurityException


189

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 번 참조).


NetworkService로 실행되는 .Net 서비스에서 사용자 정의 소스에 쓰려고 할 때 이것을 얻었습니다. 방금 .Net Service Setup 패키지를 통해 설정된 서비스 이름과 일치하도록 이벤트 로그 소스를 변경했으며 레지스트리 권한을 설정하지 않고 작동했습니다. 서비스 이름을 HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application에있는 키로 이미 확인했습니다.
Jon Adams


2
또 다른 가능한 대답 : exe를 마우스 오른쪽 단추로 클릭하고 "관리자 권한으로 실행"을 선택하십시오
MacGyver

답변:


169

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")
            }
    }
}

IIS7에서는 "NETWORK SERVICE"를 응용 프로그램 풀의 ID로 할당하거나 (ApplicationPoolIdentity가 기본값임을 알 수 있음) 대신 응용 프로그램 풀당 새 사용자를 만들고 해당 "사용자 지정 계정"에 대한 권한을 설정할 수 있습니다. 참조 응용 프로그램 풀에 대한 ID를 지정합니다 (7 IIS)
Grokodile

5
변경 사항은 IIS에서 응용 프로그램을 다시 시작한 후에 만 ​​적용됩니다
Zé Carlos

7
IIS_IUSRS에 이벤트 로그 키를 읽고 쓰는 권한을 부여하고 보안 키를 읽을 수 있습니다. 내 제품은 자체 이벤트 소스를 작성하므로 eventlog 키에 대한 쓰기 액세스 권한이 필요했습니다.
duck9

1
duck9 IIS8에 맞습니다. 자세한 내용은 여기를 참조하십시오. stackoverflow.com/questions/712203/…
thedrs

1
이 솔루션에 대한 앱 풀 사용자 및 관련 권한과 관련 하여 serverfault.com/a/81246/219898도 참조하십시오 . 감사합니다 @Michael Freidgeim-큰 도움이되었습니다.
Anthony Horne

59

문제는 관리자 만 액세스 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]

1
이것이 바로 모든 서비스에서하는 일입니다. 나는 이것이 옳은 일이라고 믿는다. 이벤트 로그를 사용하는 모든 서비스에는 위와 같은 .reg 파일이 있습니다. 파일을 유니 코드 -32 (cp 1200)로 저장해야합니다.
Valo

이 답변은 오류의 실제 원인을 설명합니다. 검사가 존재하면 전체 키를 열거하려고 시도합니다. 존재하는 경우 checkExists가 정상적으로 작동합니다.
DanO

EventLog \ Security 이것이 작동하는 열쇠입니다. 이에 대한 권한이 있는지 확인하십시오.
Princa

45

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


1
비슷한 솔루션이 보입니다. 그러나 나는 이것이 왜 이런지 궁금합니다. 많은 서비스가 NetworkService로 로그온되어 있고 이벤트 로그 / 보안을 읽을 수 있어야한다는 것을 알 수 있습니다. 그렇다면 왜 NetworkService에 대한 권한을 추가해야합니까?
h--n

11
일반적으로 레지스트리를 크롤링하지 않는 사용자의 경우이 링크가 도움이 될 수 있습니다. social.msdn.microsoft.com/forums/en-US/…
Allan

좋은 링크 Allan. 받아 들여진 대답으로 3 번 포인트가 중요하며 이미 한 번 물었습니다. 즉, 상위 EventLog 레지스트리 키에 권한을 부여해도 레지스트리의 하위 키인 경우에도 보안 및 가상 서버와 같은 "액세스 할 수없는 로그"로 전파되지 않습니다. 전체 이벤트 로그 액세스를 원하면 상위 이벤트 로그 수준과 하위 보안 수준 모두에서 권한을 부여해야합니다.
벤 Barreth

1
변경 사항은 IIS에서 응용 프로그램을 다시 시작한 후에 만 ​​적용됩니다
Zé Carlos

복사 / 붙여 넣기를 시도한 경우 "네트워크 서비스"라는 단어 사이에 공백이 있는지 확인하십시오.
Chris Fremgen

7

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


권한이 상위 키에서 상속되지 않도록 설정되었으므로 "보안"또는 "가상 서버"와 같은 하위 키에 대한 읽기 액세스 권한을 개별적으로 부여해야하기 때문에 그다지 중요하지 않습니다.
서지

7

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

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

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


7

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

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

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

3
당신은 내 하루를 구했습니다. BTW, 읽기 권한에 충분 eventlog\Application하고 eventlog\Security, eventlog루트에만 모든 권한이 필요 합니다.
Ruud Helderman 10

6

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

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

  • 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


응용 프로그램 풀을 "ApplicationPoolIdentity"에서 "LocalSystem"으로 변경하면 이벤트 로그 생성 / 읽기 문제가 해결되었습니다.
majestzim

4

같은 문제가 발생했지만 한 단계 위로 올라가 보안으로 이동하는 대신 HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ 키에 모든 사람에게 완전히 액세스해야하므로 문제가 해결되었습니다.


1
또한 응용 프로그램을 LocalSystem으로 실행하도록 설정하여 레지스트리 키를 만든 다음 나중에 NetworkService로 다시 변경할 수 있습니다.
demoncodemonkey 2016 년

4

Windows 7 64 비트에서 동일한 문제가 발생합니다. 관리자가 문제를 해결 한 상태에서 실행하십시오.


4

System.Diagnostics.EventLog.WriteEntry ( "SourceName", "ErrorMessage", EventLogEntryType.Error) 를 사용할 때 regEdit의 HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Application에서 소스 이름이 사용 된 새 키를 작성해야합니다 .

따라서 기본적으로 사용자에게는 키를 만들 권한이 없습니다. 응용 프로그램 풀 고급 설정의 아이디 값에서 사용중인 사용자에 따라 다음을 수행 할 수 있습니다.

  1. RegEdit을 실행하고 HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog로 이동하십시오.
  2. EventLog 키를 마우스 오른쪽 버튼으로 클릭하고 사용 권한 ... 옵션을 선택하십시오. 3. 모든 권한을 가진 사용자를 추가하십시오.

    "NetworkService"를 사용하는 경우 NETWORK SERVICE 사용자 추가

    - "ApplicationPoolIdentity"를 사용 하는 경우 IIS APPPOL {앱 풀 이름}을 추가하십시오 (사용자를 검색 할 때 로컬 컴퓨터 위치 사용).

    당신이 사용하는 - 만약 "로컬 시스템"을 확인 사용자가 관리자 권한이 있는지 확인하십시오. 취약점에 권장되지 않습니다.

  3. HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Security에 대해 1 ~ 3 단계를 반복하십시오.

Visual Studio로 디버깅하려면 "NetworkService"(ASP.NET 사용자)를 사용하고 사이트를 게시 할 때 "AppicationPoolIdentity"를 사용했습니다.


3

참고로 ... 제 문제는 실수로 "로컬 시스템"대신 ProcessInstaller의 등록 정보 계정으로 "로컬 서비스"를 선택했다는 것입니다. 로컬 서비스 선택이 먼저 표시되므로 MSDN 자습서를 따르는 다른 사람을 언급하면주의를 기울이지 않았습니다.


3

적어도 아직 자신의 이벤트 소스를 생성하기 위해 관리 권한을 얻는 것이 실용적이지 않은 경우 큰 단점을 보지 못했을 정도로 눈에 띄게 명확한 해결책이있는 것 같습니다.

내가 사용하기 시작한 두 가지는 ".Net Runtime"과 "Application Error"입니다. 둘 다 대부분의 컴퓨터에있는 것처럼 보입니다.

주요 단점은 해당 이벤트별로 그룹화 할 수없고 연관된 이벤트 ID가 없을 수 있다는 것입니다. 즉, 로그 항목에 "source .Net의 이벤트 ID 0에 대한 설명"의 영향에 대한 접두사가있을 수 있습니다. 생략하면 런타임을 찾을 수 없습니다 .... ", 그러나 로그가 들어가고 출력이 넓게 보입니다.

결과 코드는 다음과 같습니다.

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

물론, 어떤 이유로 든 이러한 이벤트 소스가없는 시스템에 항상있을 가능성이 있으므로 try {} catch{}실패하고 상황을 악화시킬 수 있도록 랩핑하고 싶을 수 있지만 이제는 이벤트를 저장할 수 있습니다.


2

IIS에서 작업하고 있지 않지만 2K8 상자에서 동일한 오류가 발생하는 응용 프로그램이 있습니다. 2K3 상자에서 잘 작동합니다.

내 해결책은 응용 프로그램에 높은 권한을 부여하고 모든 것이 행복하게 작동하도록 "관리자 권한으로 실행"이었습니다. 이것이 올바른 방향으로 당신을 이끌 수 있기를 바랍니다.

Windows 2008은 권한 / 권한 / 고도가 Windows 2003과 실제로 다릅니다.


2

안녕하세요, 응용 프로그램을 개발할 때 동일한 문제가 발생하여 원격 PC에 설치하려고했는데 다음을 수행하여 수정했습니다.

1) 레지스트리로 이동하여 다음을 찾으십시오. HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application (??? YOUR_SERVICE_OR_APP_NAME ???)

"(??? YOUR_SERVICE_OR_APP_NAME ???)"은 .NET 배포를 만들 때 정의한 응용 프로그램 서비스 이름입니다. 예를 들어 새 응용 프로그램의 이름을 "My new App"으로 지정한 경우 키는 다음과 같습니다. HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Application \ My New app

참고 2 : 작성중인 eventLog에 따라 DEV 상자, \ Application \ (위에서 언급 한 것처럼) 또는 응용 프로그램이 작성하는 이벤트에 따라 (\ System) 또는 (\ Security)에서 찾을 수 있습니다. , (\ Application)은 항상 괜찮습니다.

2) 메뉴에서 위의 키에 있음; "FILE"-> "Export"를 선택한 다음 파일을 저장하십시오. (참고 : 이벤트 뷰어에 쓰기 위해 응용 프로그램에서이 키에 액세스해야 할 경우 필요한 레지스트리 설정이 생성됩니다.) 새 파일은 .REG 파일이되므로 인수를 위해 "My New App.REG "

3) PRODuction에 배포 할 때는 서버의 시스템 관리자 (SA)에게 문의하여 "My New App.REG"파일을 응용 프로그램과 함께 넘기고 SA에게이 REG 파일을 설치하도록 요청합니다 (관리자 권한으로). 응용 프로그램의 키를 만드십시오.

4) 응용 프로그램을 실행하면이 키 이외의 다른 것에 액세스 할 필요가 없습니다.

지금까지 문제를 해결해야합니다.

원인:

EventLog에 무엇이든 쓰는 응용 프로그램을 개발할 때이 키를 찾을 수 없으면 Eventlog 레지스트리 아래에 KEY가 필요합니다. 위의 프로세스는 응용 프로그램을 수동으로 배포하는 것과 비슷하지만 우리가 직접 만드는 것이므로 프로덕션 서버의 보안 위험 인 EVERYONE에 권한을 추가하여 레지스트리를 조정할 필요가 없으므로 두통이 필요 없습니다.

이것이 해결하는 데 도움이되기를 바랍니다.


2

설치 프로그램의 대답이 좋은 대답이지만 작성하지 않은 소프트웨어를 다룰 때 항상 실용적이지는 않습니다. 간단한 대답은 PowerShell 명령 New-EventLog ( http://technet.microsoft.com/en-us/library/hh849768.aspx )를 사용하여 로그와 이벤트 소스를 만드는 것입니다. )

PowerShell을 관리자 권한으로 실행하고 필요한 로그 이름과 원본을 변경하여 다음 명령을 실행하십시오.

New-EventLog -LogName 어플리케이션- 소스 TFSAggregator

Aggregator가 codeplex에서 문제를 실행할 때 이벤트 로그 예외 를 해결하는 데 사용했습니다 .


1

모든 2008 서버와 비슷한 문제가있었습니다. Authenticated Users 그룹을 가져 와서 키에서 읽기 권한을 가져 오는 GPO로 인해 보안 로그가 완전히 작동하지 않습니다.HKLM\System\CurrentControlSet\Services\EventLog\security

Microsoft 권장 사항에 따라이 문제를 해결하면 문제가 해결되었습니다. 인증 된 모든 사용자에게 높은 수준의 읽기 권한을 부여하면 문제가 해결 될 것으로 생각됩니다.


1

나는 유사한 문제에 충돌 - 소스가 포함 된 내 경우에는 <, >문자. 64 비트 시스템은 새로운 짝수 로그-xml 기본을 사용하고 있으며이 문자 (문자열에서 설정)는 잘못된 xml을 생성하여 예외를 발생시킵니다. 아마도 이것은 소스 (이름 / 문자열)를 올바르게 처리하지 않는 Microsoft 문제를 고려해야합니다.


1

해결 방법은 매우 간단합니다. 관리 모드에서 Visual Studio 응용 프로그램을 실행하십시오!


VS에서 문제를 해결하고이 오류가 발생하면 문제가 해결되었습니다.
wruckie

이 호출을 호출하는 것은 VS가 아니기 때문에 오류가 발생합니다. 다른 보안 컨텍스트에서 실행중인 응용 프로그램입니다.
CodeMonkey1313

0

내 앱이 클라이언트 웹 서버에 설치됩니다. 네트워크 서비스 권한과 레지스트리를 사용하지 않고 설치 프로그램 을 확인 SourceExists하고 실행 하기로 선택했습니다 CreateEventSource.

또한 log.source = "xx"이벤트 소스가 생성되지 않은 경우 알려진 소스로 설정하기 위해 응용 프로그램에 try / catch를 추가했습니다 (재설치 대신 .dll을 핫 스왑 한 경우에만 나타납니다).


0

web.config에서 아래를 시도하십시오

 <system.web>

<trust level="Full"/>

</system.web>

-1

VS 내에서 앱을 실행할 때이 문제가 발생했습니다. 프로그램을 관리자로 한 번 실행하면 VS 내에서 실행할 수 있습니다.

관리자 권한으로 실행하려면 Windows 탐색기에서 디버그 폴더로 이동하십시오. 프로그램을 마우스 오른쪽 버튼으로 클릭하고 관리자 권한으로 실행을 선택하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.