2013-05-15 20 views
9

jestem uruchomienie mój aplikacji Windows w ten sposób po zakończeniu instalacji:Jak poprawnie uruchomić plik wykonywalny na końcu instalacji?

!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchApplication" 

... 

Function LaunchApplication 
    ExecShell "" "$INSTDIR\Application.exe" 
FunctionEnd 

Ale to ma dziwny i niepożądany efekt uboczny. Najwyraźniej moja aplikacja została uruchomiona z uprawnieniami administratora.

Nie mogę przeciągnąć żadnych danych między przeglądarką internetową (przetestowaną przy użyciu przeglądarki Firefox i IE) a moją aplikacją.

Po zamknięciu aplikacji (sesja uruchomiona z NSIS) i ponownym uruchomieniu z poziomu ikony menu startowego wszystko działa! - Mogę przeciągnąć & upuścić do przeglądarek bez problemów.

Podejrzewam, że od początku instalacji istnieje żądanie UAC, w jakiś sposób prawa UAC są przenoszone do procesu, który uruchamiam po instalacji. Ponieważ przeglądarki działają w systemie o niskim poziomie bezpieczeństwa, Windows odmawia wymiany danych z nimi (w instancji procesu uruchomionej z NSIS).

Jak uruchomić serwer exe z NSIS, aby ten problem Kontrola bezpieczeństwa/konta nie wystąpił?

+0

Masz rację, że wzniesione procesy automatycznie uruchomią inne procesy podniesione. Takie zachowanie istniało (i irytowało użytkowników) od czasu wprowadzenia UAC w systemie Vista. System blokuje przesyłanie danych między aplikacjami nieuniesionymi i podniesionymi, o ile nie określono niektórych kluczy rejestru. – EricLaw

Odpowiedz

3

Zastosowanie Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"'

Zrobione z http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html

+0

dzięki. wygląda na krok we właściwym kierunku. niestety muszę przekazać do mojej aplikacji parametr wiersza poleceń, co nie jest możliwe, jeśli używam triku explorer.exe, chyba że wcześniej utworzę plik wsadowy. – Casady

+0

Odpowiedź od lnordeide pokazuje sposób przekazywania argumentów do procesu, który chcesz wykonać. – Daniel

0

Spróbuj to:

!define MUI_FINISHPAGE_RUN "$INSTDIR\Application.exe" 
!insertmacro MUI_PAGE_FINISH 

LUB

Function .oninstsuccess 
Exec "$INSTDIR\Application.exe" 
FunctionEnd 
+1

Czy nawet przeczytałeś pytanie? – Anders

3

The UAC plugin można wykorzystać, aby ominąć ten problem, ale jest to nieco trudne w użyciu. Możesz także spróbować ShellExecAsUser, ale polecam, żebyś po prostu nie używał pola wyboru Uruchom ...

+0

Wygląda na to, że wtyczka UAC nie jest już dostępna! Używam go w moim skrypcie, aby wykonać elewację w pierwszej kolejności. Moim pomysłem jest próba un-podnoszenia w .oninstsuccess, ale nie mam pojęcia, jak to zrobić, a ponieważ strona z wtyczką zniknęła (najwyraźniej highjacked), nie wiem jak un-elevate. – Casady

+1

Ktoś pogadał z wiki, naprawiony teraz. I zawsze możesz uzyskać dostęp do starszych wersji strony wiki, jeśli zdarzy się to w przyszłości ... – Anders

+0

dzięki za przywrócenie! Pobrałem najnowszą wersję (moja ma ponad 2 lata), ale brakuje wersji Unicode !? (z którego korzystam).Ponadto, na moje drugie pytanie - czy jest tam, aby un-elevate (wróć do poziomu użytkownika) w .oninstsuccess przy użyciu wtyczki UAC? – Casady

6

Polecam użycie wtyczki ShellExecAsUser, o czym wspomniał Anders. Używam go do tego samego celu dokładnego tak:

!define MUI_FINISHPAGE_RUN_FUNCTION LaunchApplication 

... 

Function LaunchApplication 
    SetOutPath $INSTDIR 
    ShellExecAsUser::ShellExecAsUser "" "$INSTDIR\Application.exe" "" 
FunctionEnd 

Uwaga wykorzystanie SetOutPath aby Application.exe rozpoczyna się w folderze instalacyjnym jak to katalog bieżący. ShellExecAsUser nie ustawia tego.