[C#] UIPI 제약 해제

UIPI (User Interface Privilege Isolation)

낮은 권한의(관리자 권한이 없는) 프로그램에서

높은 권한의(관리자 권한으로 승격된) 프로그램 UI를 제어할 수 없게 만드는 역할을 합니다.

권한이 낮은 프로그램이 마음대로 시스템에 영향을 끼치면 안되겠죠.

보안상 필요한 부분입니다.

보통은 관리자 권한을 부여하게 되는데 바람직한 방법은 아니기도 하고 이것 만으로 충분하지 않은 경우가 발생합니다.

윈도우 보안 정책에 위배되기 때문입니다.

어쨌든 내가 만든 프로그램이 내 명령을 수행하는데 제약이 생긴다면 불편한 일입니다.

해서 인증서를 생성하여 보안 정책에 위배되지 않고 권한을 부여하는 방법 입니다.

  • 1. 인증서 생성

Visual Studio 개발자 CMD 실행.

//인증서 생성
makecert -r -pe -n "CN=KimKitty.NET" -ss PrivateCertStore kimkitty.cer

//로컬 루트에 추가
certmgr.exe -add kimkitty.cer -s -r localMachine root

//신뢰할 수 있는 사용자로 등록
certmgr.exe /add kimkitty.cer /s /r localMachine trustedpublisher
  • 2. 프로젝트에 Application Manifest File 추가

Manifest File을 추가하는 방법은 별도로 기재하지 않겠습니다. 핵심은

uiAccess="true"

입니다.
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
       
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="true" />

      </requestedPrivileges>
    </security>
  </trustInfo>
  • 3. 프로그램 빌드 후 실행파일에 인증서 부여

Visual Studio 개발자 CMD 실행.

SignTool sign /v /s PrivateCertStore /n "KimKitty.NET" /t http://timestamp.sectigo.com /fd sha256 "{파일경로 ex)*.exe, *.msi 등등}"

[참고] 타임스템프

http://timestamp.sectigo.com

http://timestamp.digicert.com

http://timestamp.globalsign.com/tsa/r6advanced1

정상적인 인증서 등록은 공인된 인증 기관의 인증서를 구매한 뒤 보안 서명을 하는 것 입니다.

최근(2024.04.18 기준)에는 인증서 방식이 변경되어 PFX 파일 형태의 OV 인증서는 사용할 수 없고

USB Token OV / EV 인증서로 변경되었습니다.

이것 때문에 인증서를 매번 빌드 해야할 PC로 가져가야하는 번거로움이 생겨서 골치가 아픕니다.