본문 바로가기
프로그램 (PHP,Python)

[NSIS] 초기 설치 폴더를 유연하게 결정

by 날으는물고기 2014. 5. 13.

[NSIS] 초기 설치 폴더를 유연하게 결정

깁뿔님께서도 선호하시고 사용자도 원하는 UAC 권한 상승 불필요 설치(installer) 프로그램과 관련하여
최근 제가 사용하게 된 내용을 공유합니다.

낮은(Guest) 권한의 사용자는 기본적으로 다음 항목들에 기록할 수가 없죠.
C:\Program Files
C:\Windows
HKEY_CLASSES_ROOT
HKEY_LOCAL_MACHINE

이에 반해 각 계정 사용자 폴더와 HKEY_CURRENT_USER 레지스트리는 읽기/쓰기가 가능합니다.

NSIS 스크립트에서 RequestExecutionLevel 옵션을 별도로 주지 않으면
Windows(Vista/7)에서 NSIS installer를 인식하여
권한 상승이 필요하다고 간주합니다.

만약 낮은(Guest) 권한의 사용자가 Administrator 등 관리자의 암호를 모른다면
해당 NSIS installer를 실행할 수도 없습니다.

이에 다음과 같이 installer가 동작하게 하는 것이 유연하다고 생각하게 되었습니다.

Quote:
1. $LOCALAPPDATA(사용자 별 어플리케이션 폴더)의 사용이 가능하면 이 곳을 초기 설치 폴더로 결정
2. 1번이 불가능할 경우 $PROGRAMFILES를 초기 설치 폴더로 결정



.onInit callback 함수에서 $LOCALAPPDATA의 사용 가능함을 판단하게 하였고
결국 다음과 같이 구성하게 되었습니다.

Code:
...(기타 내용)...
!define APP_NAME "Imagine"
RequestExecutionLevel   user
InstallDir   "$PROGRAMFILES64\${APP_NAME}" ; 32비트의 경우 $PROGRAMFILES와 동일하게 동작함

...(기타 내용)...

Function   .onInit
   StrCpy   $0   "$LOCALAPPDATA"
   StrLen   $1 $0
   IntCmp   $1 0 lbl_done

   StrCpy   $INSTDIR "$LOCALAPPDATA\${APP_NAME}"
lbl_done:
FunctionEnd
...(기타 내용)...


테스트 해본 결과 $LOCALAPPDATA의 사용이 가능하지 않은 OS(Windows 9x)에서는
$PROGRAMFILES(C:\Program Files)가 초기 설치 폴더로 나오고
가능한 OS(Windows 2000 이후의 모든 OS)에서는 $LOCALAPPDATA(C:\Users\[사용자명]\AppData\Local)이 초기 설치 폴더로 표시되는 것을 확인하였습니다.

제가 아직 NSIS 스크립트에 능숙하지 못해서 오류가 있을 수도 있습니다.
문제가 있다면 말씀해주시면 감사하겠습니다.



출처 : 독립 개발자 네트워크

728x90

댓글