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]

... 46  47  48  49  50  51  52  [53]  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12615정성태4/26/202114086오류 유형: 712. Microsoft Live 로그인 - 계정을 선택하는(Pick an account) 화면에서 진행이 안 되는 문제
12614정성태4/24/202118441개발 환경 구성: 570. C# - Azure AD 인증을 지원하는 ASP.NET Core/5+ 웹 애플리케이션 예제 구성 [4]파일 다운로드1
12613정성태4/23/202116785.NET Framework: 1048. C# - ETW 이벤트의 Keywords에 속한 EventId 구하는 방법 (2) 관리 코드파일 다운로드1
12612정성태4/23/202116645.NET Framework: 1047. C# - ETW 이벤트의 Keywords에 속한 EventId 구하는 방법 (1) PInvoke파일 다운로드1
12611정성태4/22/202115478오류 유형: 711. 닷넷 EXE 실행 오류 - Mixed mode assembly is build against version 'v2.0.50727' of the runtime
12610정성태4/22/202115394.NET Framework: 1046. C# - 컴파일 시점에 참조할 수 없는 타입을 포함한 이벤트 핸들러를 Reflection을 이용해 구독하는 방법파일 다운로드1
12609정성태4/22/202117958.NET Framework: 1045. C# - 런타임 시점에 이벤트 핸들러를 만들어 Reflection을 이용해 구독하는 방법파일 다운로드1
12608정성태4/21/202118528.NET Framework: 1044. C# - Generic Host를 이용해 .NET 5로 리눅스 daemon 프로그램 만드는 방법 [9]파일 다운로드1
12607정성태4/21/202115711.NET Framework: 1043. C# - 실행 시점에 동적으로 Delegate 타입을 만드는 방법파일 다운로드1
12606정성태4/21/202121600.NET Framework: 1042. C# - enum 값을 int로 암시적(implicit) 형변환하는 방법? [2]파일 다운로드1
12605정성태4/18/202116934.NET Framework: 1041. C# - AssemblyID, ModuleID를 관리 코드에서 구하는 방법파일 다운로드1
12604정성태4/18/202114829VS.NET IDE: 163. 비주얼 스튜디오 속성 창의 "Build(빌드)" / "Configuration(구성)"에서의 "활성" 의미
12603정성태4/16/202116492VS.NET IDE: 162. 비주얼 스튜디오 - 상속받은 컨트롤이 디자인 창에서 지원되지 않는 문제
12602정성태4/16/202117551VS.NET IDE: 161. x64 DLL 프로젝트의 컨트롤이 Visual Studio의 Designer에서 보이지 않는 문제 [1]
12601정성태4/15/202116584.NET Framework: 1040. C# - REST API 대신 github 클라이언트 라이브러리를 통해 프로그래밍으로 접근
12600정성태4/15/202116847.NET Framework: 1039. C# - Kubeconfig의 token 설정 및 인증서 구성을 자동화하는 프로그램
12599정성태4/14/202117623.NET Framework: 1038. C# - 인증서 및 키 파일로부터 pfx/p12 파일을 생성하는 방법파일 다운로드1
12598정성태4/14/202118234.NET Framework: 1037. openssl의 PEM 개인키 파일을 .NET RSACryptoServiceProvider에서 사용하는 방법 (2)파일 다운로드1
12597정성태4/13/202117771개발 환경 구성: 569. csproj의 내용을 공통 설정할 수 있는 Directory.Build.targets / Directory.Build.props 파일
12596정성태4/12/202117159개발 환경 구성: 568. Windows의 80 포트 점유를 해제하는 방법
12595정성태4/12/202116902.NET Framework: 1036. SQL 서버 - varbinary 타입에 대한 문자열의 CAST, CONVERT 변환을 C# 코드로 구현
12594정성태4/11/202116323.NET Framework: 1035. C# - kubectl 명령어 또는 REST API 대신 Kubernetes 클라이언트 라이브러리를 통해 프로그래밍으로 접근 [1]파일 다운로드1
12593정성태4/10/202117363개발 환경 구성: 567. Docker Desktop for Windows - kubectl proxy 없이 k8s 대시보드 접근 방법
12592정성태4/10/202116867개발 환경 구성: 566. Docker Desktop for Windows - k8s dashboard의 Kubeconfig 로그인 및 Skip 방법
12591정성태4/9/202120787.NET Framework: 1034. C# - byte 배열을 Hex(16진수) 문자열로 고속 변환하는 방법 [2]파일 다운로드1
12590정성태4/9/202116926.NET Framework: 1033. C# - .NET 4.0 이하에서 Console.IsInputRedirected 구현 [1]
... 46  47  48  49  50  51  52  [53]  54  55  56  57  58  59  60  ...