2013-05-15 26 views
9

Tôi đang khởi chạy ứng dụng Windows của tôi theo cách này sau khi cài đặt hoàn tất:Làm cách nào để khởi chạy một tệp thực thi khi kết thúc cài đặt chính xác?

!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchApplication" 

... 

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

Nhưng điều này có tác dụng phụ kỳ lạ và không mong muốn. Rõ ràng là ứng dụng của tôi được khởi chạy với quyền quản trị.

Tôi không thể kéo & thả bất kỳ dữ liệu nào giữa trình duyệt web (được thử nghiệm với Firefox và IE) và ứng dụng của tôi.

Nếu tôi thoát khỏi đơn đăng ký của mình (phiên bắt đầu từ NSIS) và khởi động lại từ biểu tượng trình đơn bắt đầu, mọi thứ hoạt động! - Tôi có thể kéo & thả xuống trình duyệt mà không gặp sự cố nào.

Vì vậy, tôi nghi ngờ kể từ khi bắt đầu cài đặt có một yêu cầu UAC, bằng cách nào đó quyền UAC được chuyển cho quá trình tôi khởi chạy sau khi cài đặt. Kể từ khi các trình duyệt chạy trong một quá trình bảo mật thấp Windows từ chối exhange bất kỳ dữ liệu với họ (trong trường hợp quá trình được đưa ra với NSIS).

Làm thế nào để khởi động một exe từ NSIS, do đó vấn đề UAC/bảo mật này không xảy ra?

+0

Bạn cần lưu ý rằng các quy trình nâng cao sẽ tự động khởi chạy các quy trình khác được nâng lên. Hành vi này đã tồn tại (và người dùng khó chịu) vì UAC đã được giới thiệu trong Vista. Hệ thống chặn chuyển dữ liệu giữa các ứng dụng không nâng cao và nâng cao trừ khi các khóa đăng ký nhất định được đặt. – EricLaw

Trả lời

3

Sử dụng Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"'

Taken từ http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html

+0

cảm ơn. nó trông giống như một bước đi đúng hướng. Thật không may tôi phải vượt qua một tham số dòng lệnh để ứng dụng của tôi, và điều này dường như không thể nếu tôi sử dụng thủ thuật explorer.exe, trừ khi tôi tạo một tập tin thực thi trước. – Casady

+0

Câu trả lời từ lnordeide cho thấy một cách để chuyển đối số cho quá trình bạn muốn thực hiện. – Daniel

0

Hãy thử này:

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

HOẶC

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

Bạn đã đọc câu hỏi chưa? – Anders

3

Các UAC plugin thể được sử dụng để có được xung quanh vấn đề này, nhưng nó là một chút khó sử dụng. Bạn cũng có thể thử ShellExecAsUser nhưng tôi khuyên bạn không nên sử dụng hộp kiểm chạy ở tất cả ...

+0

có vẻ như plugin UAC không khả dụng nữa! Tôi sử dụng nó trong kịch bản của tôi để làm độ cao ở nơi đầu tiên. Một ý tưởng của tôi là cố gắng để un-elevate trong .oninstsuccess, nhưng tôi không có ý tưởng làm thế nào để làm điều đó, và kể từ khi trang web của plugin đã biến mất (rõ ràng là highjacked) Tôi không biết làm thế nào để un-nâng cao. – Casady

+1

Ai đó đã nhầm lẫn với wiki, đã được khắc phục ngay bây giờ. Và bạn luôn có thể truy cập các phiên bản cũ hơn của trang wiki nếu nó xảy ra trong tương lai ... – Anders

+0

cảm ơn sự phục hồi! Tôi đã tải xuống phiên bản mới nhất (bản cũ hơn 2 năm), nhưng phiên bản Unicode bị thiếu? (mà tôi đang sử dụng).Ngoài ra, để câu hỏi khác của tôi - là có đi để un-nâng cao (quay trở lại mức người dùng) trong .oninstsuccess bằng cách sử dụng plugin UAC của bạn? – Casady

6

Tôi khuyên bạn nên sử dụng plugin ShellExecAsUser như đã đề cập bởi Anders. Tôi sử dụng nó cho mục đích chính xác như thế này:

!define MUI_FINISHPAGE_RUN_FUNCTION LaunchApplication 

... 

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

Lưu ý việc sử dụng SetOutPath để đảm bảo Application.exe bắt đầu với thư mục cài đặt làm thư mục hiện tại. ShellExecAsUser không thiết lập điều này.

Các vấn đề liên quan