UAC plug-in: Difference between revisions
(simpler example of how UAC works) |
(→More helpful notes: added $=0 $1=3 case) |
||
Line 112: | Line 112: | ||
;!insertmacro UAC_RunElevated | ;!insertmacro UAC_RunElevated | ||
UAC::_ 0 ;this does the same thing as the line above but the line above needs to include uac.nsh | UAC::_ 0 ;this does the same thing as the line above but the line above needs to include uac.nsh | ||
;$0 | ;$0=1223 means user said 'no' so we are at user level | ||
;$0==0 $1 | ;$0=0 $1=3 user chose to run as non-admin in run-as... dialog (similar to 1223) | ||
;$0 | ;$0=0 $1=2 $3=1 we are admin now | ||
;$0=0 $1=1 we are original (outer) non-admin process but the inner admin process completed | |||
MessageBox mb_TopMost|mb_SetForeground "zero has $0 one has $1 three has $3" | MessageBox mb_TopMost|mb_SetForeground "zero has $0 one has $1 three has $3" | ||
quit | quit |
Revision as of 14:21, 30 September 2011
Author: Anders (talk, contrib) |
Plugin Info
- Version: 0.2.3c (20110920)
- Type: Runtime plugin
- Character encoding: Ansi
- Minimum OS: Win95/NT4 (Elevation on Win2000+)
- Minimum NSIS Version: 2.45
- License: Freeware
- 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. This allows you to accomplish things that would otherwise be very difficult. For example, you can have a 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
- 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.
More helpful notes
I'm not good at reading .nsi files so I simplified things even more to understand just part of what this plugin can do. First of all put the UAC.dll into the NSIS/Plugins folder and you are supposed to put UAC.nsh into the NSIS/Include/ folder (but you don't have to for my example).
Function .onInit ;!insertmacro UAC_RunElevated UAC::_ 0 ;this does the same thing as the line above but the line above needs to include uac.nsh ;$0=1223 means user said 'no' so we are at user level ;$0=0 $1=3 user chose to run as non-admin in run-as... dialog (similar to 1223) ;$0=0 $1=2 $3=1 we are admin now ;$0=0 $1=1 we are original (outer) non-admin process but the inner admin process completed MessageBox mb_TopMost|mb_SetForeground "zero has $0 one has $1 three has $3" quit FunctionEnd
If you add only the above code to your installer you can run it many times from different operating systems and as admin, non-admin on vista, on xp and see the different behaviors. It makes things so much clearer.
There are other cool things this plugin can do. If you have tested them out please add more to this wiki page.