![]() |
#1 |
Junior Member
Join Date: May 2009
Posts: 8
|
ShellExecAsUser plugin
I've created a new ShellExecAsUser plugin:
http://nsis.sourceforge.net/ShellExecAsUser_plug-in It allows to execute the specified program in non-admin context, i.e. it is intended for installers that run with admin rights but need to execute something in non-admin context. It uses desktop COM interface to execute process, so that process is launched by explorer (http://brandonlive.com/2008/04/27/ge...ou-part-2-how/). Any comments are welcome. |
![]() |
![]() |
![]() |
#2 |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
Sound like something that can pretty useful
![]() Two questions: * What operating systems does it work with? Any "fall back" mode for WinXP and Win2k? * Can you please compile a Unicode version of that plug-in? (Sorry, did not have time to examine your code yet) Regards, MuldeR. My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI |
![]() |
![]() |
![]() |
#3 | ||
Junior Member
Join Date: May 2009
Posts: 8
|
Quote:
Quote:
|
||
![]() |
![]() |
![]() |
#4 |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
Thank you!
My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI |
![]() |
![]() |
![]() |
#5 |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
I have adopted your ExecShellAsUser method into my StdUtils plug-in:
http://pastie.org/private/b9cymlmclyuo6b1f4kcmfg (ANSI and Unicode builds attached) My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI |
![]() |
![]() |
![]() |
#6 |
Major Dude
Join Date: Oct 2006
Posts: 1,892
|
So, what, does this do what the UAC plugin was also designed to do, but without two installer instances?
|
![]() |
![]() |
![]() |
#7 | |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
Quote:
Seems to work for me on Windows 7 (x64). I don't have any other UAC-enabled test platforms. On Windows XP and earlier it simply falls back to the normal ShellExecute()... My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI |
|
![]() |
![]() |
![]() |
#8 | |
Junior Member
Join Date: May 2009
Posts: 8
|
Quote:
|
|
![]() |
![]() |
![]() |
#9 | |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
Quote:
(I already noticed that CoInitializeEx() fails, because, I think, COM already is initialized with other parameters for the calling thread. So I switched back to CoInitialize() again. But I will implement your suggestion now) [UPDATE] Done. New version is attached. [/UPDATE] My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI Last edited by LoRd_MuldeR; 1st October 2011 at 18:49. |
|
![]() |
![]() |
![]() |
#10 |
Major Dude
Join Date: Oct 2006
Posts: 1,892
|
Very cool! I use the UAC plugin for double install mode all-through, for which case I guess it is more convenient to have two instances. But this is a very cool alternative, and a lot simpler to use!
|
![]() |
![]() |
![]() |
#11 |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
Small update:
http://nsis.sourceforge.net/StdUtils...xecShellAsUser My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI Last edited by LoRd_MuldeR; 2nd October 2011 at 13:31. |
![]() |
![]() |
![]() |
#12 |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
Sorry, here are some more fixes:
My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI |
![]() |
![]() |
![]() |
#13 |
Moderator
Join Date: Jun 2002
Location: ${NSISDIR}
Posts: 5,452
|
This COM hack is problematic and/or broken when:
A) Explorer is not running B) Explorer is elevated (Rare, but some people do it) C) Desktop user is not the correct parent: User A is logged on, runs setup as non-admin user B with runas.exe, setup is elevated with user C; The correct user is B, not A. IntOp $PostCount $PostCount + 1 |
![]() |
![]() |
![]() |
#14 |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
In case (A) it will fall back to the normal ShellExecute(). Not ideal, but well...
I'm not sure what will happen in case (B) or how to reproduce this, but I guess in that case we will either fail to get the COM interface and thus fall back to the normal ShellExecute(), or we will simply create an elevated instance. Again not ideal, but if you run your Explorer in an elevated way, then problems are preprogrammed anyway ![]() (And in case (C) it may depend on the situation/purpose whether user A or B is the "correct" one) My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI |
![]() |
![]() |
![]() |
#15 |
Junior Member
Join Date: May 2009
Posts: 8
|
Anders
You are right and I'll add your remarks to plugin description, though I think it's quite uncommon and as such these limitations are acceptable to many people. |
![]() |
![]() |
![]() |
#16 |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
I have updated my StdUtils plug-in to use the "new" plug-in API, i.e. get rid of explicit unload.
Furthermore I added a version of ExecShell with wait capability as well as some more convenience functions. New version here: http://nsis.sourceforge.net/StdUtils_plug-in (BTW: Could some mod please delete the obsolete versions attached to my previous posts?) My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI |
![]() |
![]() |
![]() |
#17 |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
In case somebody is interested, I just uploaded a new version of my StdUtils plug-in:
http://nsis.sourceforge.net/StdUtils_plug-in My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI |
![]() |
![]() |
![]() |
#18 | |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
Quote:
As this might be relevant for all NSIS plug-in's that deal with COM interfaces (and the Shell), you might want to have a look here: http://stackoverflow.com/questions/1...itialize-crash My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI |
|
![]() |
![]() |
![]() |
#19 |
Member
Join Date: Jun 2006
Posts: 50
|
(As requested in the NSIS WIKI, I'm using this topic for feedback on StdUtils.)
LoRd_MuldeR, any plans to add a x86/x64 check to StdUtils? I am currently using... code: ...but maybe there is a cleaner way to do this? |
![]() |
![]() |
![]() |
#20 |
Major Dude
Join Date: Sep 2005
Location: Somewhere over the Slaughterhouse
Posts: 797
|
NSIS has that built-in already
![]() code: My Plugins: StdUtils | NSISList | CPUFeatures | ExecTimeout | KillProc My source of inspiration: http://youtu.be/lCwY4_0W1YI |
![]() |
![]() |
![]() |
#21 |
Member
Join Date: Jun 2006
Posts: 50
|
LOL Nice, thanks. Back in the day that didn't exist...
![]() |
![]() |
![]() |
![]() |
#22 | |
Moderator
Join Date: Jun 2002
Location: ${NSISDIR}
Posts: 5,452
|
Quote:
![]() IntOp $PostCount $PostCount + 1 |
|
![]() |
![]() |
![]() |
#23 |
Senior Member
Join Date: Nov 2013
Location: Iran
Posts: 343
|
![]()
hi
i use from ShellExecAsUser plugin for open the exe files run as user Plugin: http://nsis.sourceforge.net/ShellExecAsUser_plug-in when i use the nsis ansi then ShellExecAsUser plugin works correctly and exe file opened. HTML Code:
Section ShellExecAsUser::ShellExecAsUser "open" "C:\1.exe" SectionEnd HTML Code:
[B]Unicode true [/B] Section ShellExecAsUser::ShellExecAsUser "open" "C:\1.exe" SectionEnd plugin unable to open file and show message: |
![]() |
![]() |
![]() |
#24 |
Moderator
Join Date: Jun 2002
Location: ${NSISDIR}
Posts: 5,452
|
Edit: A Unicode version has now been added to the wiki by the author. IntOp $PostCount $PostCount + 1 |
![]() |
![]() |
![]() |
#25 |
Junior Member
Join Date: Feb 2019
Posts: 4
|
Hi
Does anybody know a method that I can force the main NSIS Process to wait for the ShellExecAsUser process to end before it is possible to do anything else? Regards Bernd |
![]() |
![]() |
![]() |
#26 | |
Moderator
Join Date: Jun 2002
Location: ${NSISDIR}
Posts: 5,452
|
Quote:
Why do you need to wait for a "as user" process? IntOp $PostCount $PostCount + 1 |
|
![]() |
![]() |
![]() |
#27 |
Junior Member
Join Date: Feb 2019
Posts: 4
|
Hi
It is not essential to wait for the user process but it would feel better ;-) I start a user process that does some downloads and configuration stuff when the main part of the installer is done. As I can click the "next" buttons in the NSIS part I can end the installer but the "user" part is not finished and is working ... this just does not look very nice. Regards Bernd |
![]() |
![]() |
![]() |
#28 |
Moderator
Join Date: Jun 2002
Location: ${NSISDIR}
Posts: 5,452
|
Assuming this is a "RequestExecutionLevel Admin + HKLM + $ProgramFiles" installer. These are multi-user installers and any per-user initialization should happen the first time a user runs the applications from the start menu. In a extreme case; someone could use fast user switching and start the application as a 3rd user (not the administrator and not the "user") before your call to ShellExecAsUser has completed.
IntOp $PostCount $PostCount + 1 |
![]() |
![]() |
![]() |
|
Thread Tools | Search this Thread |
Display Modes | |
|
|