2016-03-23 6 views
2

Chromeには、システム全体のインストールに使用できるインストーラ、または管理者でないユーザーのホームディレクトリがあります。潜在的なユーザーが権限を持っていなくてもインストールできるようにする企業環境に展開する場合に便利です。ローカルデプロイメントとシステムデプロイメントを処理する単一のインストーラをNSISで作成できますか?

このようなインストーラを作成するのにNSISを使用できますか?

答えて

1

それができます。重要な部分は次のとおりです。

  • RequestExecutionLevel highest:これにより、インストーラーはユーザーのアカウントで使用できる最高の特権を得ることができます。つまり、管理者グループに属している場合、インストーラは権限の昇格を要求します。
  • ユーザーが管理者であるかどうかを判断します。これは、UserInfoプラグインを使用して実現されます。十分に簡単です。
  • SetShellVarContext all|current:これにより、特別なレジストリルートキーSHCTXの値が決まります。 allの場合はHKLM(システムワイド)と同じ意味で、currentの場合はHKCUとなります。 SetShellVarContextは、$SMPROGRAMSの値がシステム全体のスタートメニューまたは正当なユーザーの階層を参照するかどうかにも影響します。

ユーザアカウントの権限に応じて、システム全体またはローカルに展開できるインストーラのスケルトンです。ペイロードとしてC:\ Windows \ write.exeを使用し、オプションでスタートメニュー項目とデスクトップショートカットをインストールします。レジストリ内のアンインストーラへの参照も、[プログラムの追加と削除]ダイアログに表示されます。 NSIS 3.0(ベータ版)を使用してこれを構築しましたが、最近の2.xではうまくいかない理由はありません。

!include "MUI2.nsh" 

!define PRODUCT_NAME "DummyProduct" 
!define VERSION "0.0.1" 

Var INSTDIR_BASE 

Name "${PRODUCT_NAME}" 
OutFile "${PRODUCT_NAME} Installer.exe" 

InstallDir "" 

; Take the highest execution level available 
; This means that if it's possible to, we become an administrator 
RequestExecutionLevel highest 

!macro ONINIT un 
    Function ${un}.onInit 
     ; The value of SetShellVarContext detetmines whether SHCTX is HKLM or HKCU 
     ; and whether SMPROGRAMS refers to all users or just the current user 
     UserInfo::GetAccountType 
     Pop $0 
     ${If} $0 == "Admin" 
      ; If we're an admin, default to installing to C:\Program Files 
      SetShellVarContext all 
      StrCpy $INSTDIR_BASE "$PROGRAMFILES64" 
     ${Else} 
      ; If we're just a user, default to installing to ~\AppData\Local 
      SetShellVarContext current 
      StrCpy $INSTDIR_BASE "$LOCALAPPDATA" 
     ${EndIf} 

     ${If} $INSTDIR == "" 
      ; This only happens in the installer, because the uninstaller already knows INSTDIR 
      ReadRegStr $0 SHCTX "Software\${PRODUCT_NAME}" "" 

      ${If} $0 != "" 
       ; If we're already installed, use the existing directory 
       StrCpy $INSTDIR "$0" 
      ${Else} 
       StrCpy $INSTDIR "$INSTDIR_BASE\${PRODUCT_NAME}" 
      ${Endif} 
     ${Endif} 
    FunctionEnd 
!macroend 

; Define the function twice, once for the installer and again for the uninstaller 
!insertmacro ONINIT "" 
!insertmacro ONINIT "un" 

!define MUI_ABORTWARNING 

!define MUI_COMPONENTSPAGE_NODESC 
!insertmacro MUI_PAGE_COMPONENTS 

!insertmacro MUI_PAGE_DIRECTORY 

Var STARTMENU_FOLDER 
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" 
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${PRODUCT_NAME}" 
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" 
!insertmacro MUI_PAGE_STARTMENU ${PRODUCT_NAME} $STARTMENU_FOLDER 

!insertmacro MUI_PAGE_INSTFILES 
!insertmacro MUI_UNPAGE_CONFIRM 
!insertmacro MUI_UNPAGE_INSTFILES 

!insertmacro MUI_LANGUAGE "English" 

Section "-Main Component" 
    SetOutPath "$INSTDIR" 

    File "C:\Windows\write.exe" 

    WriteRegStr SHCTX "Software\${PRODUCT_NAME}" "" $INSTDIR 

    ; These registry entries are necessary for the program to show up in the Add/Remove programs dialog 
    WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayName" "${PRODUCT_NAME}" 
    WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "UninstallString" '"$INSTDIR\Uninstall.exe"' 
    WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "NoModify" 1 
    WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "NoRepair" 1 

    WriteUninstaller "$INSTDIR\Uninstall.exe" 

    !insertmacro MUI_STARTMENU_WRITE_BEGIN ${PRODUCT_NAME} 
     CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER\" 
     CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\${PRODUCT_NAME}.lnk" "$INSTDIR\write.exe" 
    !insertmacro MUI_STARTMENU_WRITE_END 
SectionEnd 

Section "Desktop shortcut" 
    CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\write.exe" 
SectionEnd 

Section "Uninstall" 
    Delete "$INSTDIR\write.exe" 

    Delete "$INSTDIR\Uninstall.exe" 

    RMDir /r "$INSTDIR" 

    !insertmacro MUI_STARTMENU_GETFOLDER ${PRODUCT_NAME} $STARTMENU_FOLDER 
    Delete "$SMPROGRAMS\$STARTMENU_FOLDER\${PRODUCT_NAME}.lnk" 
    RMDir /r "$SMPROGRAMS\$STARTMENU_FOLDER" 

    Delete "$DESKTOP\${PRODUCT_NAME}.lnk" 

    DeleteRegKey /ifempty SHCTX "Software\${PRODUCT_NAME}" 

    DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" 
SectionEnd 
+0

これはかなりうまく見えますが、Windowsはユーザーごとのエントリをサポートしているので、SHCTXをアンインストールHKEYとして使用できます。 $ PROGRAMFILES64は、64ビットアプリケーションをインストールする場合にのみ使用してください。ラジオボタンを含むページでインストールタイプを選択する場合は、NSISに付属するマルチユーザーヘッダーファイルを参照することもできます。最後に、Windowsのガイドラインには、スタートメニューにアンインストールショートカットを作成すべきではないと述べています。 – Anders

+0

ああ、私はそれを知らなかった。私は私の答えを試して修正します。 –

関連する問題