Olabilir. önemli parçaları şunlardır:
RequestExecutionLevel highest
: Bu yükleyici kullanıcının hesabına mevcut en yüksek ayrıcalığı alır sağlar. yani, Yönetici grubunda ise, yükleyici ayrıcalık yükseltme isteyecektir.
- Kullanıcının Yönetici olup olmadığını belirleme veya yapma. Bu UserInfo eklentisi kullanılarak elde edilir. Bu yeterince basit.
SetShellVarContext all|current
: Bu, özel kayıt defteri kök anahtarı SHCTX
değerini belirler. all
ile, current
için HKLM
(sistem genişliği) ile aynı demektir, HKCU
sonuçlanır. SetShellVarContext
, $SMPROGRAMS
'un değerinin, sistem genelinde başlangıç menüsü veya yalnızca kullanıcının hiyerarşisi olup olmadığını da etkiler.
Kullanıcı hesabının izinlerine bağlı olarak, sistemi geniş veya yerel olarak dağıtabilen bir yükleyici için bir iskelet. C: \ Windows \ write.exe'yi yük olarak kullanır ve isteğe bağlı olarak başlangıç menü öğelerini ve bir masaüstü kısayolunu yükler. Ayrıca, Program Ekle/Kaldır iletişim kutusunda görünecek şekilde, kayıt defterindeki kaldırıcıya bir başvuru koyar. Bunu yapmak için NSIS 3.0 (beta) kullandım, ancak son 2.x ile çalışmamasının açık bir nedeni yok.
!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
Bu oldukça iyi görünüyor, ancak Windows kullanıcı başına girişleri desteklediği için SHCTX'i Kaldır HKEY olarak kullanabilirsiniz. $ PROGRAMFILES64 sadece 64 bitlik bir uygulama yüklüyorsanız kullanılmalıdır. Kurulum tipini seçmek için radyo düğmeli bir sayfa istiyorsanız, NSIS ile birlikte gelen çok kullanıcılı başlık dosyasına da bakabilirsiniz. Son olarak, Windows yönergeleri, başlangıç menüsünde kaldırma kısayolları oluşturmamanız gerektiğini belirtir. – Anders
Aha, Bunu bilmiyordum. Cevabımı test edip değiştireceğim. –