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]

... 136  137  138  139  140  [141]  142  143  144  145  146  147  148  149  150  ...
NoWriterDateCnt.TitleFile(s)
1526정성태11/3/201323124디버깅 기술: 57. C# - double 값에 대한 windbg 확인
1525정성태11/2/201329485.NET Framework: 391. C# - EXE/DLL로부터 추출한 이미지/아이콘의 배경색 투명 처리 [8]
1524정성태11/2/201330339기타: 37. 프로그램에 보여지는 리소스(예: 아이콘) 추출하는 방법 [1]
1523정성태11/2/201326689VS.NET IDE: 81. Visual Studio 확장 도구 AttachToW3WP - w3wp.exe에 대한 디버거 연결을 자동화하는 도구 [2]
1522정성태11/1/201323290VS.NET IDE: 80. IIS 8.0/8.5 - Global.asax.cs처럼 초기에 실행되는 코드에 Breakpoint를 잡는 방법
1521정성태11/1/201329185VS.NET IDE: 79. IIS 7.5 - Global.asax.cs처럼 초기에 실행되는 코드에 Breakpoint를 잡는 방법
1520정성태10/31/201323653오류 유형: 191. Visual Studio 2010 - 웹 애플리케이션 생성 시 "The project type is not supported by this installation." 오류 발생 해결
1519정성태10/31/201349096기타: 36. SYSTEM 또는 TrustedInstaller 소유로 되어 있는 폴더/파일을 삭제하는 방법 [5]
1518정성태10/30/201326769VS.NET IDE: 78. Visual Studio 확장으로 XmlCodeGenerator 제작하는 방법
1517정성태10/28/201326319디버깅 기술: 56. 덤프 파일에 핸들/스레드 정보를 포함하는 방법 [1]
1516정성태10/28/201331675.NET Framework: 390. FolderBrowserDialog보다 더 쓸만한 대화창이 필요하다면? [1]
1515정성태10/24/201334305VS.NET IDE: 77. Visual Studio 확장(VSIX) 만드는 방법 [5]
1514정성태10/24/201367686개발 환경 구성: 202. Internet Explorer 11을 7, 8, 9, 10 버전으로 인식시키는 방법 [9]파일 다운로드1
1513정성태10/23/201324193개발 환경 구성: 201. Azure Blob Storage의 DNS 경로를 사용자 DNS로 바꾸는 방법 [1]
1512정성태10/18/201327395개발 환경 구성: 200. IIS AppPool의 실행 계정을 변경하는 방법
1511정성태10/12/201325542.NET Framework: 389. The 3n + 1 problem의 C#/Java 버전 풀이 [2]
1510정성태10/8/201326428오류 유형: 190. 윈도우 서버 2012 R2 설치 후 인텔 NIC으로 인한 WMI 오류 발생
1509정성태10/8/201331607오류 유형: 189. Windows Server 8.1/2012 R2 - IME 비정상 종료 현상 [1]
1508정성태10/4/201326730.NET Framework: 388. 일반 닷넷 프로젝트에서 WinRT API를 호출하는 방법 [2]파일 다운로드1
1507정성태9/30/201324538오류 유형: 188. The key 'LocalizedPerfCounter' does not exist in the appSettings configuration section.
1506정성태9/30/201326680오류 유형: 187. Parameter "basePath" cannot be a relative path
1505정성태9/26/201375227기타: 35. Microsoft Office 2007 인증 생략하는 방법 [10]
1504정성태9/24/201330115.NET Framework: 387. UDP 브로드캐스팅을 이용해 서비스 측의 IP 주소를 구하는 방법 [1]파일 다운로드1
1503정성태9/21/201335285개발 환경 구성: 199. Visual Studio - github 연동 [7]
1502정성태9/21/201338892개발 환경 구성: 198. Visual Studio - git을 이용한 로컬 소스 컨트롤
1501정성태9/21/201345978개발 환경 구성: 197. Visual Studio를 위한 Git 환경 설정 [5]
... 136  137  138  139  140  [141]  142  143  144  145  146  147  148  149  150  ...