성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>ASP.NET - System.Security.SecurityException: 'Requested registry access is not allowed.'</h1> <p> 예전에도 언급했던 오류인데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > IIS Express에서 COM+ 사용 시 SecurityException - "Requested registry access is not allowed" 발생 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/1726'>https://www.sysnet.pe.kr/2/0/1726</a> ASP.NET 응용 프로그램을 IIS Express에서 디버깅할 때 "Requested registry access is not allowed" 오류 발생 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/1593'>https://www.sysnet.pe.kr/2/0/1593</a> </pre> <br /> 이번엔 소스코드를 들여다보며 정리했기 때문에 기록을 남깁니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> IIS에서 .NET Framework 4.8용의 ASP.NET 웹 프로젝트를 "System.Security.SecurityException" 예외에 대해 "thrown" 옵션을 넣고 실행하면 이런 오류가 발생할 수 있습니다. (개인적으로 가능한 <a target='tab' href='https://www.sysnet.pe.kr/2/0/10811#broken_windows'>모든 오류를 thrown으로 둬서 모르고 지나가는 예외를 최대한 없게 하자는 원칙</a>을 가지고 있습니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > System.Security.SecurityException HResult=0x8013150A Message=Requested registry access is not allowed. Source=mscorlib StackTrace: at System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) in f:\dd\ndp\clr\src\BCL\system\throwhelper.cs:line 107 This exception was originally thrown at this call stack: System.ThrowHelper.ThrowSecurityException(System.ExceptionResource) in throwhelper.cs </pre> <br /> 이때의 호출 스택에 따라,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > > mscorlib.dll!System.ThrowHelper.ThrowSecurityException(System.ExceptionResource resource) Line 70 C# Symbols loaded. mscorlib.dll!Microsoft.Win32.RegistryKey.OpenSubKey(string name, bool writable) Line 827 C# Symbols loaded. <span style='color: blue; font-weight: bold'>System.Web.dll!System.Web.Util.Misc.GetAspNetRegValue(string subKey, string valueName = null, object defaultValue = null) Line 179 C# Symbols loaded. System.Web.dll!System.Web.Compilation.CompilationMutex.CompilationMutex(string name = "CL9dcc5588", string comment = "CompilationLock for /") Line 23 C# Symbols loaded.</span> System.Web.dll!System.Web.Compilation.CompilationLock.CompilationLock() Line 13 C# Symbols loaded. [Native to Managed Transition] Annotated Frame [Managed to Native Transition] Annotated Frame ...[생략]... </pre> <br /> GetAspNetRegValue 메서드를 보면 아래와 같이 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0" 하위 키를 열려고 시도하는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [RegistryPermission(SecurityAction.LinkDemand, Unrestricted = true)] [RegistryPermission(SecurityAction.Assert, Unrestricted = true)] internal static object GetAspNetRegValue(<span style='color: blue; font-weight: bold'>string subKey</span>, string valueName, object defaultValue) { try { using RegistryKey registryKey = <span style='color: blue; font-weight: bold'>OpenAspNetRegKey(subKey)</span>; if (registryKey == null) { return defaultValue; } return registryKey.GetValue(valueName, defaultValue); } catch { return defaultValue; } } internal static RegistryKey OpenAspNetRegKey(<span style='color: blue; font-weight: bold'>string subKey</span>) { string text = VersionInfo.SystemWebVersion; <span style='color: blue; font-weight: bold'>// .NET Framework 4.8의 경우: text == "4.0.30319.0"</span> if (!string.IsNullOrEmpty(text)) { int num = text.LastIndexOf('.'); if (num > -1) { text = text.Substring(0, num + 1) + "0"; } } string text2 = "Software\\Microsoft\\ASP.NET\\" + text; if (subKey != null) { text2 = text2 + "\\" + subKey; <span style='color: blue; font-weight: bold'>// text2 == "SOFTWARE\Microsoft\ASP.NET\4.0.30319.0" + subKey</span> } return Registry.LocalMachine.OpenSubKey(text2); } </pre> <br /> 이때 전달된 subKey 값을 찾아보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > internal CompilationMutex(string name, string comment) { string text = (string)Misc.GetAspNetRegValue(<span style='color: blue; font-weight: bold'>"CompilationMutexName"</span>, null, null); if (text != null) { _name = _name + "Global\\" + name + "-" + text; } else { _name = _name + "Local\\" + name; } _comment = comment; _mutexHandle = new HandleRef(this, UnsafeNativeMethods.InstrumentedMutexCreate(_name)); if (_mutexHandle.Handle == IntPtr.Zero) { throw new InvalidOperationException(SR.GetString("CompilationMutex_Create")); } } </pre> <br /> 결국 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0\CompilationMutexName" 경로임을 알 수 있습니다. 따라서, 이번에도 역시 해당 레지스트리 키에 대해 Read 권한을 주는 것으로 해결할 수 있습니다.<br /> </p><br /> <br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
2807
(왼쪽의 숫자를 입력해야 합니다.)