Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
부모글 보이기/감추기
(연관된 글이 1개 있습니다.)
[답변] 클릭원스 - 요청한 작업을 수행하려면 권한 상승이 필요합니다. (Exception from HRESULT: 0x800702E4)

이 글은, 다음 글에서 댓글로 작성한 "정중희" 님의 상황에 대한 해결책입니다.

ClickOnce - 관리자 권한 상승하는 방법
; https://www.sysnet.pe.kr/2/0/950

(요청하신 대로, 정중희 님 댓글의 IP 주소는 "..."로 처리를 했습니다.
그런데, 오히려 ^^ IP 주소를 노출시켜주셔서 문제를 찾을 수 있었군요.)

제가 한번 그 URL로 방문을 해보았는데, 실제로 오류가 나더군요. 클릭원스 모듈을 다운로드한 폴더에 가보니 다음과 같이 모듈이 있는 것을 확인했습니다.

clickonce_elevated_problem_1.png

뭔가... 좀 이상하지 않나요? ^^
위에서 EXE 파일에 '방패' 아이콘이 추가되어 있는데, 즉 권한 상승을 위한 설정이 강제로 되어 있다는 것을 뜻합니다. 재미있는 상황이군요. ^^

배경 설명을 먼저 해보면.

Vista가 나오면서, UAC 문제가 골치아프게 된 곳이 바로 "setup.exe" 파일이었습니다. 대부분의 setup 프로그램들이 관리자 권한을 필요로 하는데 사용자로 하여금 명시적으로 "run as an administrator" 메뉴를 실행하도록 하는 것이 너무 현실성이 없다는 점이었습니다.

그래서, Vista(물론, Windows Server 2008도 포함해서.)에서는 대상 EXE 파일이 다음과 같은 조건을 만족하면 UAC 권한 상승창을 자동으로 띄우도록 했습니다.

  • x86 응용 프로그램이고,
  • 실행 프로그램 이름에 "Setup", "install", "update", "patch"... 등등의 문자열이 포함되고,
  • manifest 파일에 requestedExecutionLevel 요소를 명시적으로 포함하고 있지 않은 경우!

위의 3박자가 맞으면, Vista 운영체제는 해당 프로그램이 실행될 때 UAC 권한 상승창을 사용자에게 보여줍니다. 눈치채셨겠지만, 이러한 조건들이 "정중희" 님의 상황과 일치하고 있습니다.

Visual Studio 2005의 경우, Vista 이전에 나온 개발 도구라서 app.manifest에서 requestedExecutionLevel을 명시적으로 포함시켜 주지 않고 있으며, 하필 "정중희" 님이 택한 실행 파일 이름이 "SetupSecurity"이고, 대상 플랫폼이 x86으로 되어 있기 때문에 그런 문제가 발생하는 것입니다.

위의 조건에 더해서, "클릭원스"는 UAC 권한 상승을 발생하는 exe를 무조건 실행하지 못하도록 설정되어 있기 때문에 "정중희" 님의 상황에서는 Process.Start 코드를 통한 추가 코드 여부에 상관없이 그와 같은 오류가 발생하는 것입니다.

이를 해결하는 방법은 간단합니다. 대상 플랫폼이야 사용자 운영체제에 의존적이니 바꿀 수 없지만, 실행 파일명에서 "Setup" 글자를 빼거나 "manifest" 파일에 명시적으로 다음과 같이 requestedExecutionLevel을 포함해서 배포해주면 됩니다.

==== app.manifest ====
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>

      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
      </requestedPrivileges>      
      
      <applicationRequestMinimum>
        <defaultAssemblyRequest permissionSetReference="Custom" />
        <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
      </applicationRequestMinimum>
    </security>
  </trustInfo>
</asmv1:assembly>

아마도, Visual Studio 2008 이상의 제품을 사용하셨다면,,, 이 정도 시간 낭비는 없으셨을 텐데... ^^

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/28/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2010-11-30 12시26분
[정중희] 친절하게 "정중희" 란 저의 이름을 여러번이나 호명하여 주셔서 영광입니다.
일목요연한 설명이 하나를 배우면 열을 배우고 싶은 열정을 주시네요.
"정성태"님의 도움에 감사의 말씀을 드립니다.
[guest]
2010-12-03 02시31분
[저는 누구일까요?] 햐~~~ 짝짝짝
[guest]

... 31  [32]  33  34  35  36  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
13137정성태10/8/202214185.NET Framework: 2055. 리눅스 환경의 .NET Core 3/5+ 메모리 덤프로부터 닷넷 모듈을 추출하는 방법
13136정성태10/7/202214533.NET Framework: 2054. .NET Core/5+ SDK 설치 없이 dotnet-dump 사용하는 방법
13135정성태10/5/202215050.NET Framework: 2053. 리눅스 환경의 .NET Core 3/5+ 메모리 덤프를 분석하는 방법 - 두 번째 이야기 [1]
13134정성태10/4/202212244오류 유형: 820. There is a problem with AMD Radeon RX 5600 XT device. For more information, search for 'graphics device driver error code 31'
13133정성태10/4/202213388Windows: 211. Windows - (commit이 아닌) reserved 메모리 사용량 확인 방법 [1]
13132정성태10/3/202213427스크립트: 42. 파이썬 - latexify-py 패키지 소개 - 함수를 mathjax 식으로 표현
13131정성태10/3/202217228.NET Framework: 2052. C# - Windows Forms의 데이터 바인딩 지원(DataBinding, DataSource) [2]파일 다운로드1
13130정성태9/28/202213043.NET Framework: 2051. .NET Core/5+ - 에러 로깅을 위한 Middleware가 동작하지 않는 경우파일 다운로드1
13129정성태9/27/202213654.NET Framework: 2050. .NET Core를 IIS에서 호스팅하는 경우 .NET Framework CLR이 함께 로드되는 환경
13128정성태9/23/202216590C/C++: 158. Visual C++ - IDL 구문 중 "unsigned long"을 인식하지 못하는 #import [1]파일 다운로드1
13127정성태9/22/202214850Windows: 210. WSL에 systemd 도입
13126정성태9/15/202215371.NET Framework: 2049. C# 11 - 정적 메서드에 대한 delegate 처리 시 cache 적용
13125정성태9/14/202215793.NET Framework: 2048. C# 11 - 구조체 필드의 자동 초기화(auto-default structs)
13124정성태9/13/202215578.NET Framework: 2047. Golang, Python, C#에서의 CRC32 사용
13123정성태9/8/202215620.NET Framework: 2046. C# 11 - 멤버(속성/필드)에 지정할 수 있는 required 예약어 추가
13122정성태8/26/202216033.NET Framework: 2045. C# 11 - 메서드 매개 변수에 대한 nameof 지원
13121정성태8/23/202212439C/C++: 157. Golang - 구조체의 slice 필드를 Reflection을 이용해 변경하는 방법
13120정성태8/19/202216035Windows: 209. Windows NT Service에서 UI를 다루는 방법 [3]
13119정성태8/18/202215175.NET Framework: 2044. .NET Core/5+ 프로젝트에서 참조 DLL이 보관된 공통 디렉터리를 지정하는 방법
13118정성태8/18/202212702.NET Framework: 2043. WPF Color의 기본 색 영역은 (sRGB가 아닌) scRGB [2]
13117정성태8/17/202216378.NET Framework: 2042. C# 11 - 파일 범위 내에서 유효한 타입 정의 (File-local types)파일 다운로드1
13116정성태8/4/202216832.NET Framework: 2041. C# - Socket.Close 시 Socket.Receive 메서드에서 예외가 발생하는 문제파일 다운로드1
13115정성태8/3/202217398.NET Framework: 2040. C# - ValueTask와 Task의 성능 비교 [1]파일 다운로드1
13114정성태8/2/202217284.NET Framework: 2039. C# - Task와 비교해 본 ValueTask 사용법파일 다운로드1
13113정성태7/31/202216774.NET Framework: 2038. C# 11 - Span 타입에 대한 패턴 매칭 (Pattern matching on ReadOnlySpan<char>)
13112정성태7/30/202217638.NET Framework: 2037. C# 11 - 목록 패턴(List patterns) [1]파일 다운로드1
... 31  [32]  33  34  35  36  37  38  39  40  41  42  43  44  45  ...