2012-08-10 22 views
6

Tôi đang tạo một Dịch vụ Windows với Delphi. Những gì dịch vụ của tôi cần làm là cơ bản mở một chương trình. Trong mã của tôi, tôi đang sử dụng WinExec(aux,SW_SHOWNORMAL);. Khi tôi bắt đầu và chạy các dịch vụ không có gì xuất hiện để được thực hiện, nhưng khi tôi nhìn vào TaskManager chương trình dịch vụ của tôi nên mở là trong danh sách và trong cột Tên người dùng xuất hiện SYSTEM.Tạo một Dịch vụ Windows để mở một chương trình- Delphi

Vì vậy, chương trình đang mở nhưng chương trình không hiển thị trên màn hình. Tôi đã thực hiện một nghiên cứu trong Google và tìm thấy một số chức năng như CreateProcess nhưng tôi không biết cách sử dụng nó. Tôi đang làm gì sai?

Xin lỗi về tiếng anh xấu của tôi.

+0

Nếu bạn đang sử dụng Windows Vista o 7, hãy kiểm tra bài viết MSDN này [Khởi chạy một quá trình tương tác từ Windows Service trong Windows Vista trở lên] (http://blogs.msdn.com/b/winsdk/archive/2009/07/14 /launching-an-interactive-process-from-windows-service-in-windows-vista-and-later.aspx) – RRUZ

+1

@Daniel Tiếng Anh của bạn tuyệt vời. –

+0

@Daniel, đừng quên ['accept answer'] (http://meta.stackexchange.com/a/5235/179541) nếu họ giải quyết vấn đề của bạn ;-) – TLama

Trả lời

6

Dịch vụ luôn chạy trong Phiên 0. Quá trình được khởi động bởi dịch vụ chạy trong Phiên dịch vụ theo mặc định, trừ khi dịch vụ sử dụng CreateProcessAsUser() để chạy quy trình trong Phiên khác.

Trong XP và trước đó, người dùng đầu tiên đăng nhập cũng chạy trong Phiên 0 (người dùng tiếp theo để đăng nhập chạy trong Phiên 1+). Do đó, nếu dịch vụ được đánh dấu là Tương tác khi nó được cài đặt và nó chạy một tiến trình có giao diện người dùng, người dùng đang chạy trong Phiên 0 có thể thấy giao diện người dùng.

Trong Vista trở lên, điều này không thể thực hiện được nữa. Người dùng không bao giờ chạy trong Phiên 0 nữa và các dịch vụ không thể được đánh dấu là Tương tác nữa. Điều này được gọi là "Cách ly phiên 0". Dịch vụ phải sử dụng CreateProcessAsUser() ngay bây giờ để chạy quy trình giao diện người dùng trong Phiên tương tác để người dùng có thể xem nó.

Tham khảo MSDN để biết thêm chi tiết:

Session 0 Isolation

Impact of Session 0 Isolation on Services and Drivers in Windows

Calling CreateProcessAsUser() from service

Launching an interactive process from Windows Service in Windows Vista and later

CreateProcessAsUser function

+0

Cảm ơn! 'CreateProcessAsUser()' sẽ trợ giúp. Một điều nữa, bạn có thể minh họa cho 'CreateProcessAsUser()' sử dụng? Tôi đang gặp rắc rối với các thông số. – Daniel

+3

Các bài báo tôi đã liên kết để chỉ cho bạn cách sử dụng 'CreateProcessAsUser()' trong một dịch vụ và có rất nhiều thông tin trực tuyến về nó, vì vậy tôi sẽ không giải thích ở đây. Chỉ cần biết rằng sự khác biệt giữa 'WinExec()' (sử dụng 'CreateProcess()' nội bộ) và 'CreateProcessAsUser()' là 'CreateProcess()' chạy tiến trình mới trong tài khoản người dùng của quá trình gọi, trong khi 'CreateProcessAsUser() 'chạy quá trình mới trong tài khoản người dùng được chỉ định thay thế. Điều này rất quan trọng khi cố gắng truy cập Session của người dùng từ một Session dịch vụ. –

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