2
Chromeには、システム全体のインストールに使用できるインストーラ、または管理者でないユーザーのホームディレクトリがあります。潜在的なユーザーが権限を持っていなくてもインストールできるようにする企業環境に展開する場合に便利です。ローカルデプロイメントとシステムデプロイメントを処理する単一のインストーラをNSISで作成できますか?
このようなインストーラを作成するのにNSISを使用できますか?
Chromeには、システム全体のインストールに使用できるインストーラ、または管理者でないユーザーのホームディレクトリがあります。潜在的なユーザーが権限を持っていなくてもインストールできるようにする企業環境に展開する場合に便利です。ローカルデプロイメントとシステムデプロイメントを処理する単一のインストーラをNSISで作成できますか?
このようなインストーラを作成するのにNSISを使用できますか?
それができます。重要な部分は次のとおりです。
RequestExecutionLevel highest
:これにより、インストーラーはユーザーのアカウントで使用できる最高の特権を得ることができます。つまり、管理者グループに属している場合、インストーラは権限の昇格を要求します。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
これはかなりうまく見えますが、Windowsはユーザーごとのエントリをサポートしているので、SHCTXをアンインストールHKEYとして使用できます。 $ PROGRAMFILES64は、64ビットアプリケーションをインストールする場合にのみ使用してください。ラジオボタンを含むページでインストールタイプを選択する場合は、NSISに付属するマルチユーザーヘッダーファイルを参照することもできます。最後に、Windowsのガイドラインには、スタートメニューにアンインストールショートカットを作成すべきではないと述べています。 – Anders
ああ、私はそれを知らなかった。私は私の答えを試して修正します。 –