Stellt sich heraus es kann. Die wichtigen Teile sind:
RequestExecutionLevel highest
: Dies stellt sicher, dass das Installationsprogramm die höchsten Berechtigungen für das Benutzerkonto erhält. Wenn sie sich in der Administratorgruppe befinden, wird das Installationsprogramm nach einer Eskalation der Rechte fragen.
Bestimmen, ob der Benutzer ein Administrator ist oder nicht. Dies wird mit dem UserInfo-Plugin erreicht. Es ist einfach genug.
SetShellVarContext all|current
: Dies bestimmt den Wert der speziellen Registrierung Root-Schlüssel SHCTX
. Mit all
bedeutet es dasselbe wie HKLM
(systemweit), für current
ergibt es HKCU
. SetShellVarContext
beeinflusst auch, ob der Wert $SMPROGRAMS
sich auf das systemweite Startmenü oder auf die Hierarchie des Benutzers bezieht.
Hier ist ein Skelett für ein Installationsprogramm, das abhängig von den Berechtigungen des Benutzerkontos systemweit oder lokal bereitgestellt werden kann. Es verwendet C: \ Windows \ write.exe als seine Nutzlast und installiert optional Startmenüelemente und eine Desktopverknüpfung. Außerdem wird ein Verweis auf das Deinstallationsprogramm in der Registrierung hinzugefügt, sodass es im Dialogfeld "Software" angezeigt wird. Ich habe NSIS 3.0 (Beta) verwendet, um dies zu erstellen, aber ich sehe keinen offensichtlichen Grund, warum es nicht mit einem aktuellen 2.x funktionieren würde.
!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
Das sieht ziemlich gut aus, aber Sie können SHCTX als Deinstallations-HKEY verwenden, da Windows pro Benutzer Einträge unterstützt. $ PROGRAMFILES64 sollte nur verwendet werden, wenn Sie eine 64-Bit-Anwendung installieren. Sie können auch die Multiuser-Header-Datei anzeigen, die mit NSIS ausgeliefert wird, wenn Sie eine Seite mit Optionsfeldern auswählen möchten, um den Installationstyp auszuwählen. Die Windows-Richtlinien geben schließlich an, dass Sie keine Startverknüpfungen im Startmenü erstellen sollten. – Anders
Aha, das wusste ich nicht. Ich werde meine Antwort testen und ändern. –