UAC plug-in: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
(→‎Info: Added link)
 
(27 intermediate revisions by 10 users not shown)
Line 1: Line 1:
{{PageAuthor|Anders}}
{{PageAuthor|Anders}}
[[Category:Plugins]]
[[Category:Plugins]]
Télécharger == == & Info
[[Category:Deprecated]]
Ce plug-in tentatives de contourner les problèmes d'installation sur Vista UAC / 7. Ce plug-in permet à votre installateur pour fonctionner avec un processus de niveau utilisateur et un processus de niveau administrateur. Cela vous permet d'accomplir des choses qui seraient autrement très difficile. Par exemple, vous pouvez avoir un niveau installateur admin lancer un autre processus au niveau utilisateur. Ou vous pouvez avoir un niveau installateur admin créer des raccourcis au niveau utilisateur.


Tout a commencé en [http://forums.winamp.com/showthread.php?s=&threadid=265780 ce fil]. Il a été testé sur le terrain avec de bons résultats. Il est encore nettement au stade bêta (c.-à-utiliser à vos risques et périls).
<div style="border: 1px solid #404000; background-color:#FFFF80; color:#000; padding:0.5em;"><b>Note:</b>This plug-in is deprecated. It started out as a proof of concept in the early Vista days and should now be considered abandoned.</div>


branche courante: [% http://stashbox.org/988128/UAC% 20v0.2.2c 20 - 2020100828.zip% v0.2.2c]


branche vieillesse: [20v0.0.11d.zip% http://stashbox.org/560965/UAC v0.0.11d]
==Plugin Info==
* '''Version:''' 0.2.4c (20150526)
* '''Type:''' Runtime plugin
* '''Character encoding:''' Ansi
* '''Minimum OS:''' Win95/NT4 (Elevation on Win2000+)
* '''Minimum NSIS Version:''' 2.45
* '''License:''' zlib
* '''Download:''' <attach>UAC.zip</attach>


<font color=red NOTE red;display:block;"> style="border:2px solides: Tout le code sur cette page s'applique à l'ancienne version, la syntaxe a changé légèrement de 0,2 et vous devez utiliser les macros dans uac.nsh </ font>


=== === L'installation de base
==Info==
Pour installer le plugin UAC dans votre configuration NSIS, il vous suffit de copier deux fichiers ZIP de ce qui précède:
This plug-in attempts to work around UAC installation problems on Win2000+.  This plug-in allows your installer to operate with a user level process and an admin level process ([https://docs.microsoft.com/en-us/windows/win32/secauthz/administrator-broker-model administrator broker model]).  This allows you to accomplish things that would otherwise be very difficult.  For example, you can have an elevated installer instance launch another process as the user.


* Pour les installateurs ANSI,'''UAC.nsh''copier dans votre répertoire d'inclusion (par exemple C: \ Program Files \ NSIS \ Include) et'''''UAC.dll chez sortie / A dans votre répertoire de plugins ( par exemple C: \ Program Files \ NSIS \ Plugins).
It all started in [http://forums.winamp.com/showthread.php?s=&threadid=265780 this thread].  It has been field tested with good results.  It is still definitely in the beta stage (i.e. use at your own risk).


* Pour les installateurs Unicode,'''UAC.nsh''copier dans votre répertoire d'inclusion (par exemple C: \ Program Files \ NSIS \ Unicode \ Include) et'''''UAC.dll chez sortie / U dans votre Plugins répertoire (par exemple C: \ Program Files \ NSIS \ Unicode \ Plugins).
==Basic Example==
 
<highlight-nsis>
=== === Comment ça marche?
/*
Basic script for a all users/shared installer.
It runs the installed application as the correct user...
*/


==== Fournir le code nécessaire ====
!define S_NAME "UAC_Basic example"
* Tout d'abord, le script NSIS doit préciser qu'il devrait fonctionner avec des privilèges d'utilisateur, et non pas des privilèges d'administrateur.
Name "${S_NAME}"
OutFile "${S_NAME}.exe"
RequestExecutionLevel user ; << Required, you cannot use admin!
InstallDir "$ProgramFiles\${S_NAME}"


<highlight-nsis>
!include MUI2.nsh
utilisateur RequestExecutionLevel / * RequestExecutionLevel OBLIGATOIRE! * /
!include UAC.nsh
</ Highlight-nsis>
* Ensuite, l'approche la plus commune est de laisser l'UAC plugin initialiser dans le code onInit.:
<highlight-nsis>
; Tenter de donner l'UAC plug-in d'un processus utilisateur et un processus d'admin.
Fonction. OnInit


UAC_Elevate:
!macro Init thing
    UAC:: RunElevated
uac_tryagain:
    StrCmp 1223 0 $ UAC_ElevationAborted; de dialogue UAC interrompu par l'utilisateur?
!insertmacro UAC_RunElevated
    StrCmp 0 0 $ 0 UAC_Err; erreur?
${Switch} $0
    StrCmp 1 1 $ 0 UAC_Success; Sommes-nous la vraie affaire ou tout simplement l'enveloppe?
${Case} 0
    Quitter
${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done
    
${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on
UAC_Err:
${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user
    MB_ICONSTOP MessageBox "Impossible d'élever, d'erreur $ 0"
MessageBox mb_YesNo|mb_IconExclamation|mb_TopMost|mb_SetForeground "This ${thing} requires admin privileges, try again" /SD IDNO IDYES uac_tryagain IDNO 0
    Avorter
${EndIf}
;fall-through and die
${Case} 1223
MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "This ${thing} requires admin privileges, aborting!"
Quit
${Case} 1062
MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Logon service not running, aborting!"
Quit
${Default}
MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Unable to elevate, error $0"
Quit
${EndSwitch}


UAC_ElevationAborted:
SetShellVarContext all
    # élévation a été abandonnée, fonctionner normalement?
!macroend
    MessageBox MB_ICONSTOP «Ce programme d'installation requiert un accès admin, abandon!"
    Avorter


UAC_Success:
Function .onInit
    StrCmp 1 3 $ 4; Admin?
!insertmacro Init "installer"
    StrCmp 3 1 $ 0 UAC_ElevationAborted; Essayez à nouveau?
    MessageBox MB_ICONSTOP «Ce programme d'installation requiert un accès admin, essayer à nouveau"
    goto UAC_Elevate
    
FunctionEnd
</ Highlight-nsis>
* Avant la sortie d'installation, vous devrez nettoyer le plugin. Si vous n'avez pas, il laissera derrière lui une UAC.dll en% de l'utilisateur dossier% TEMP. Un moyen facile de nettoyer les dégâts est en fournissant le texte suivant:
<highlight-nsis>
Fonction. OnInstFailed
    UAC:: Décharger; doit appeler décharger!
FunctionEnd
FunctionEnd


Fonction. OnInstSuccess
Function un.onInit
    UAC:: Décharger; doit appeler décharger!
!insertmacro Init "uninstaller"
FunctionEnd
FunctionEnd
</ Highlight-nsis>
Rappelez-vous que si votre installation se ferme avant que ces événements peuvent être déclenchés, vous devez fournir une UAC:: décharger avant le programme d'installation se ferme.


==== Comment l'UAC plug-in fonctionne avec des privilèges d'utilisateur et admin ====
!insertmacro MUI_PAGE_WELCOME
* Lorsque le programme d'installation lance NSIS, il a des privilèges d'utilisateur (tel que spécifié par l'utilisateur RequestExecutionLevel). Immédiatement, l'installateur NSIS appelle son code onInit.. (Note, aucune fenêtre n'est encore visible à ce stade). L'UAC plugin permet un processus de''deuxième''installateur et tente de l'élever avec des privilèges admin. Si nécessaire, un UAC ou Exécuter en tant que boîte de dialogue s'affiche pour aider à élever ce deuxième processus avec des privilèges admin. À ce stade, si vous ouvrez le Gestionnaire des tâches, vous verrez deux processus en cours d'installation. Le processus utilisateur peut être considéré comme le processus externe, et le processus de admin le processus interne.
!insertmacro MUI_PAGE_DIRECTORY
* Une fois élevés, l'admin / processus interne s'affiche. C'est la fenêtre d'installation que les utilisateurs verront.
!insertmacro MUI_PAGE_INSTFILES
* Maintenant que vous avez un processus admin, vous pouvez continuer à laisser votre script faire sa chose. Si jamais vous avez besoin de faire quelque chose au niveau utilisateur, vous le faites par l'UAC plugin, et l'UAC plugin fonctionnera whats nécessaire par l'utilisateur invisible / processus externe. Par exemple, l'UAC:: Exec peut exécuter quelque chose avec des privilèges d'utilisateur et non pas des privilèges d'administrateur. Ou UAC:: ExecCodeSegment peut exécuter une fonction entière avec les privilèges utilisateur.
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
!insertmacro MUI_PAGE_FINISH


Exemples === ===
!insertmacro MUI_UNPAGE_CONFIRM
NOTE''<font color="red">: syntaxe a changé dans 0,2 alphas, tout sur cette page utilise la> vieille syntaxe'''</ police
!insertmacro MUI_UNPAGE_INSTFILES


De nombreux exemples se trouvent dans le fichier. zip ci-dessus. Si vous voulez une meilleure idée de ce que ce plugin peut faire, étudier ces exemples. Un bref aperçu de deux exemples simples sont donnés ici:
!insertmacro MUI_LANGUAGE "English"
==== Création d'un raccourci utilisateur ====


UAC_RealWorldExample.nsi ne:


<highlight-nsis>
Function PageFinishRun
CreateShortcuts Fonction
; You would run "$InstDir\MyApp.exe" here but this example has no application to execute...
  CreateShortcut "lnk $ Desktop \ $ {APPNAME}." "$ Windir \ Notepad.exe"
!insertmacro UAC_AsUser_ExecShell "" "$WinDir\notepad.exe" "" "" ""
FunctionEnd
FunctionEnd


«Raccourci bureau» Section
Section
  GetFunctionAddress $ 0 CreateShortcuts
SetOutPath $InstDir
  UAC:: ExecCodeSegment 0 $
# TODO: File "MyApp.exe"
WriteUninstaller "$InstDir\Uninstall.exe"
SectionEnd
SectionEnd
</ Highlight-INS>


Dans cet exemple, nous voulons exécuter la fonction CreateShortcuts avec les privilèges utilisateur, il peut donc créer un raccourci au niveau utilisateur. Donc, premièrement, définir la fonction. Ensuite, utilisez GetFunctionAddress pour obtenir l'adresse de cette fonction. Ensuite, appelez UAC:: ExecCodeSegment de demander au processus utilisateur externe / pour exécuter cette fonction. Comme la fonction sera exécuté au niveau utilisateur, il va créer un raccourci pour l'utilisateur plutôt que pour l'administrateur.
Section Uninstall
 
SetOutPath $Temp ; Make sure $InstDir is not the current directory so we can remove it
==== Lancement d'une application avec des privilèges utilisateur ====
# TODO: Delete "$InstDir\MyApp.exe"
<highlight-nsis>
Delete "$InstDir\Uninstall.exe"
;! Insertmacro UAC_AsUser_ExecShell <Command> <Fichier> <Paramètres> <WorkingDir> <ShowWindow>
RMDir "$InstDir"
! Insertmacro UAC_AsUser_ExecShell 'ouverte' $ INSTDIR \ $ {} APPFILE '-FirstRun' $ INSTDIR'''
SectionEnd
</ Highlight-nsis>
</highlight-nsis>
 
Lorsque $ INSTDIR \ $ {} APPFILE est le chemin vers le fichier que vous souhaitez lancer.
 
Si vous utilisez la peau MUI et le lancement d'installation de l'application pour vous, vous aurez besoin pour faire un peu plus de travail.
 
<highlight-nsis>
! Définir MUI_FINISHPAGE_RUN
! Définir MUI_FINISHPAGE_RUN_FUNCTION ExecAppFile
 
Fonction ExecAppFile
    ! Insertmacro UAC_AsUser_ExecShell 'ouverte' $ INSTDIR \ $ {} APPFILE '-FirstRun' $ INSTDIR'''
FunctionEnd
</ Highlight-nsis>
 
Gardez à l'esprit que vous avez encore à définir MUI_FINISHPAGE_RUN (comme vide) sinon MUI ne fournira pas l'option à tous.
 
=== === Notes importantes
 
# Si vous avez besoin d'utiliser l'UAC plugin pour le programme de désinstallation, ainsi, vous aurez besoin d'initialiser l'UAC plugin pour le programme de désinstallation, comme par un.onInit. N'oubliez pas d'exécuter le nettoyer avec l'UAC:: décharger avant votre sortie de désinstallation. Bonnes adresses pour le nettoyer sont un.OnUnInstFailed et un.OnUnInstSuccess
# Le processus utilisateur externe / n'affiche pas de sortie de ce qui s'est passé. Par exemple, si vous avez le processus utilisateur externe / créer un raccourci, et il échoue, l'intérieur / admin processus actuellement visible n'affichera rien pour indiquer qu'un problème est survenu. C'est parce que le processus utilisateur externe / ne pas encore communiquer de retour à l'intérieur / admin processus.
# Quand un utilisateur standard ou de l'information limitée administrateur d'approvisionnements dans la boîte de dialogue Exécuter en tant que, vous pouvez éprouver l'ennui avec les permissions du fichier extrait. Par exemple, si un Windows 2000 standard info administrateur utilisateur fournit dans la boîte de dialogue Exécuter en tant que, et l'installateur NSIS extrait un fichier. Exe, puis essayez d'appeler cela. Exe par un Exec peut échouer. S'il s'agit d'un problème, vous souhaitez utiliser le [[AccessControl_plug-en | AccessControl plug-in]].
 
=== === Environnements testés
 
Ce plugin a été testé dans les environnements suivants:
 
* Windows 7 - UAC Le - Administrateur
* Windows Vista - UAC Le - Administrateur
* Windows Vista - UAC Off - Administrateur
* Windows Vista - UAC Le - Standard User - info utilisateur de l'administrateur des approvisionnements dans la boîte de dialogue UAC
* Windows Vista - UAC Le - Standard utilisateur - ne fournit pas d'informations d'administrateur dans la boîte de dialogue UAC
* Windows Vista - UAC Off - Standard User - info utilisateur de l'administrateur d'approvisionnements dans la boîte de dialogue Exécuter en tant que
* Windows Vista - UAC Off - Standard utilisateur - ne fournit pas d'informations d'administrateur dans la boîte de dialogue Exécuter en tant que
* Windows XP - Administrateur
* Windows XP - Limited utilisateur - info utilisateur de l'administrateur d'approvisionnements dans la boîte de dialogue Exécuter en tant que
* Windows XP - Limited utilisateur - ne fournit pas d'informations d'administrateur dans la boîte de dialogue Exécuter en tant que
Windows * 2000 - Administrateur
* Windows 2000 - User Standard - info utilisateur de l'administrateur d'approvisionnements dans la boîte de dialogue Exécuter en tant que
* Windows 2000 - Standard utilisateur - ne fournit pas d'informations d'administrateur dans la boîte de dialogue Exécuter en tant que
* Windows 95 & 98 ont été testés au début de fabrique et nous espérons encore du travail (n ° d'élévation ici pour des raisons évidentes)


Windows ME et NT4 n'ont pas été testées, mais devrait fonctionner. (Si vous avez testé sur un de ces OS'es, s'il vous plaît rendre compte des résultats ici ou sur le forum)
==Important Notes==
# If you need to use the UAC plugin for the uninstaller as well, you will need to initalize the UAC plugin for the uninstaller, such as through un.onInit.
# The outer/user process does not display any output as to what occurred.  For example, if you have the outer/user process create a shortcut, and it fails, the inner/admin process currently visible will not display anything to indicate that a problem occurred.  This is because the outer/user process does not yet communicate back to the inner/admin process.
# When a standard or limited user supplies administrator information into the Run As dialog, you may experience permissions trouble with any extracted file.  For example, if a Windows 2000 standard user supplies administrator info into the Run As dialog, and the NSIS installer extracts an .exe file, then trying to call that .exe through an Exec can fail.  If this is a problem, you will want to use the [[AccessControl_plug-in|AccessControl plug-in]].

Latest revision as of 14:32, 21 January 2022

Author: Anders (talk, contrib)


Note:This plug-in is deprecated. It started out as a proof of concept in the early Vista days and should now be considered abandoned.


Plugin Info

  • Version: 0.2.4c (20150526)
  • Type: Runtime plugin
  • Character encoding: Ansi
  • Minimum OS: Win95/NT4 (Elevation on Win2000+)
  • Minimum NSIS Version: 2.45
  • License: zlib
  • Download: UAC.zip (50 KB)


Info

This plug-in attempts to work around UAC installation problems on Win2000+. This plug-in allows your installer to operate with a user level process and an admin level process (administrator broker model). This allows you to accomplish things that would otherwise be very difficult. For example, you can have an elevated installer instance launch another process as the user.

It all started in this thread. It has been field tested with good results. It is still definitely in the beta stage (i.e. use at your own risk).

Basic Example

/*
Basic script for a all users/shared installer.
It runs the installed application as the correct user...
*/
 
!define S_NAME "UAC_Basic example"
Name "${S_NAME}"
OutFile "${S_NAME}.exe"
RequestExecutionLevel user ; << Required, you cannot use admin!
InstallDir "$ProgramFiles\${S_NAME}"
 
!include MUI2.nsh
!include UAC.nsh
 
!macro Init thing
uac_tryagain:
!insertmacro UAC_RunElevated
${Switch} $0
${Case} 0
	${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done
	${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on
	${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user
		MessageBox mb_YesNo|mb_IconExclamation|mb_TopMost|mb_SetForeground "This ${thing} requires admin privileges, try again" /SD IDNO IDYES uac_tryagain IDNO 0
	${EndIf}
	;fall-through and die
${Case} 1223
	MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "This ${thing} requires admin privileges, aborting!"
	Quit
${Case} 1062
	MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Logon service not running, aborting!"
	Quit
${Default}
	MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Unable to elevate, error $0"
	Quit
${EndSwitch}
 
SetShellVarContext all
!macroend
 
Function .onInit
!insertmacro Init "installer"
FunctionEnd
 
Function un.onInit
!insertmacro Init "uninstaller"
FunctionEnd
 
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
!insertmacro MUI_PAGE_FINISH
 
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
 
!insertmacro MUI_LANGUAGE "English"
 
 
Function PageFinishRun
; You would run "$InstDir\MyApp.exe" here but this example has no application to execute...
!insertmacro UAC_AsUser_ExecShell "" "$WinDir\notepad.exe" "" "" ""
FunctionEnd
 
Section
SetOutPath $InstDir
# TODO: File "MyApp.exe"
WriteUninstaller "$InstDir\Uninstall.exe"
SectionEnd
 
Section Uninstall
SetOutPath $Temp ; Make sure $InstDir is not the current directory so we can remove it
# TODO: Delete "$InstDir\MyApp.exe"
Delete "$InstDir\Uninstall.exe"
RMDir "$InstDir"
SectionEnd

Important Notes

  1. If you need to use the UAC plugin for the uninstaller as well, you will need to initalize the UAC plugin for the uninstaller, such as through un.onInit.
  2. The outer/user process does not display any output as to what occurred. For example, if you have the outer/user process create a shortcut, and it fails, the inner/admin process currently visible will not display anything to indicate that a problem occurred. This is because the outer/user process does not yet communicate back to the inner/admin process.
  3. When a standard or limited user supplies administrator information into the Run As dialog, you may experience permissions trouble with any extracted file. For example, if a Windows 2000 standard user supplies administrator info into the Run As dialog, and the NSIS installer extracts an .exe file, then trying to call that .exe through an Exec can fail. If this is a problem, you will want to use the AccessControl plug-in.