2016-03-23 11 views
2

Chrome, sistem yöneticisi veya yönetici değilse bir kullanıcının giriş dizinini yüklemek için kullanılabilecek bir yükleyiciye sahiptir. Bu, potansiyel kullanıcılarınızın, izne sahip olmaları gerekmediklerinde bile yüklemeleri için hala izin vermek istediğiniz bir şirket ortamında dağıtım yaparken kullanışlıdır.NSIS, yerel dağıtım ve sistem dağıtımını gerçekleştiren tek bir yükleyici oluşturabilir mi?

NSIS böyle bir yükleyici oluşturmak için kullanılabilir mi?

cevap

1

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 
+0

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

+0

Aha, Bunu bilmiyordum. Cevabımı test edip değiştireceğim. –

İlgili konular