2008-09-10 15 views
28

Tôi có một ứng dụng GUI hiện có cần được triển khai như một dịch vụ. Về cơ bản, tôi cần phải có khả năng đăng nhập và tắt máy chủ Windows 2003 từ xa và vẫn tiếp tục chạy chương trình này.Làm cách nào để chạy ứng dụng Windows GUI trên dịch vụ?

Điều này có thể thực hiện được không?

EDIT: tinh chỉnh thêm ở đây ... Tôi không có nguồn, nó không phải là ứng dụng của tôi.

+0

Tinh chỉnh thêm tại đây ... Tôi không có nguồn, nó không phải là đơn của tôi. – JeffV

+2

Đây là loại probem mà quản trị viên hệ thống phải giải quyết mỗi ngày, vì vậy hãy yêu cầu quản trị viên hệ thống. Vì bạn không có nguồn, đây không phải là một câu hỏi lập trình. –

Trả lời

4

Bạn có thể quấn nó lên thành srvany, mặc dù bạn có thể cần phải gán cho nó một tài khoản người dùng thực tế (như trái ngược với LocalService hay một số ví dụ)

0

Bạn có nguồn? Trong nhiều trường hợp, sự khác biệt giữa một ứng dụng độc lập và một dịch vụ là tối thiểu.

Hầu hết các thay đổi có liên quan đến việc gắn mã vào trình quản lý dịch vụ đúng cách. Sau khi hoàn tất, bạn sẽ biết rằng mọi sự cố xảy ra là kết quả của chương trình của bạn và không phải bất kỳ chương trình nào khác.

15

Dịch vụ Windows không thể có GUI, vì vậy bạn cần loại bỏ GUI hoặc tách ứng dụng thành hai phần - một dịch vụ không có giao diện người dùng và ứng dụng "điều khiển". Nếu bạn có mã nguồn, việc chuyển đổi mã không phải GUI thành một dịch vụ là dễ dàng - Visual Studio có kiểu dự án 'Windows Service' để quản lý gói cho bạn và có một hướng dẫn đơn giản cho bạn thấy cách tạo một dự án triển khai sẽ quản lý cài đặt.

Nếu bạn chọn tuyến thứ hai và cần đặt một số mã GUI gốc vào bộ điều khiển, bộ điều khiển và dịch vụ có thể giao tiếp qua WCF, .NET Remoting hoặc kết nối ổ cắm đơn giản với giao thức bạn tự xác định. Nếu bạn sử dụng Remoting, hãy đảm bảo sử dụng giao diện "chunky" để truyền dữ liệu với ít lời gọi phương thức nhất có thể - mỗi cuộc gọi có một số tiền khá lớn.

Nếu giao diện người dùng khá đơn giản, bạn có thể thoát khỏi bằng cách sử dụng tệp cấu hình cho tệp nhật ký và đầu vào hoặc Nhật ký sự kiện Windows cho đầu ra.

+0

Đó là lý do tại sao nó là một vấn đề khó khăn. Tôi có một ứng dụng GUI hiện có (nguồn sans) mà tôi cần để chạy như một dịch vụ. – JeffV

+1

Điều này là sai. Các dịch vụ Windows có thể có GUI. Đây là trường hợp của dịch vụ máy in có thể hiển thị cửa sổ. – labilbe

+2

@labilbe - nó chắc chắn có thể cho các dịch vụ Windows để sinh ra các quy trình có GUI. Đây có thể là những gì dịch vụ máy in đang làm. Đây không phải là điều tương tự như quá trình dịch vụ chính nó có một GUI. Nó cũng đúng là các phần của hệ điều hành Windows đôi khi có thể làm những việc không được phép. – McKenzieG1

0

Trước tiên, tôi sẽ phải hỏi tại sao dịch vụ của bạn cần giao diện người dùng. Nhiều khả năng nó không nhưng bạn có thể cần một khách hàng nhận dữ liệu từ dịch vụ này. Các dịch vụ lý do thường không có GUI là chúng có thể không có môi trường cửa sổ để chạy. Các dịch vụ có thể bắt đầu và chạy mà không cần người dùng đăng nhập vào máy. Trong trường hợp này, sẽ không có máy tính để bàn cho GUI dịch vụ chạy.

Có thể thiết lập các thuộc tính trên dịch vụ để chạy với tư cách người dùng theo đề xuất của Mark. Bạn cũng có thể chỉ định trong thuộc tính của dịch vụ để "Cho phép dịch vụ tương tác với máy tính để bàn". Chỉ thực hiện việc này nếu bạn biết người dùng sẽ đăng nhập.

0

Dịch vụ không nên có GUI, vì nó sẽ chạy mà không cần bất kỳ sự can thiệp nào từ người dùng và có tất cả các vấn đề liên quan đến tìm kiếm và giao tiếp với người dùng chính xác trên máy tính để bàn.

Vì, có lẽ lý do để yêu cầu điều này là để có thể theo dõi ứng dụng từ xa, cách thực hiện nó sẽ là có hai ứng dụng. Phía dịch vụ (được viết cơ bản như một ứng dụng giao diện điều khiển) và phía máy khách/giám sát GUI. Dịch vụ sẽ sử dụng một số kết nối từ xa (khi tôi thực hiện điều này, tôi đã sử dụng Ống có tên) để liên lạc với ứng dụng khách/giám sát. Hoặc là có thể chạy mà không có khác, và chắc chắn dịch vụ sẽ có thể chạy với khách hàng.

6

Có ai đã sử dụng sản phẩm của bên thứ ba như: Always Up không?

Dường như làm những gì tôi cần. Đó là khả năng tiếp tục chạy qua các chu kỳ đăng nhập/đăng xuất mà tôi cần. Và khả năng bỏ qua đó là một ứng dụng GUI và vẫn chạy nó.

Họ phải liên kết vào exe theo cách thủ công và gọi WinMain hoặc một cái gì đó.

+0

Tôi đã dùng thử AlwaysUp nhưng nó đã không ' t làm việc quá tốt, ít nhất là cho các ứng dụng dòng lệnh - Tôi đã tiếp tục nhận được thông báo về "Một chương trình đang chạy trên máy tính này đang cố gắng hiển thị một thông báo". Tôi đang sử dụng winsw thay vì bây giờ. – VitalyB

0

Điều gì xảy ra nếu bạn tạo dịch vụ. Dịch vụ đó được cấu hình để tương tác với máy tính để bàn. Cấu hình nó để chạy một số người dùng và bắt đầu tự động. Từ dịch vụ CreateProcess trên ứng dụng khác này. Tôi đoán điều này là nhanh chóng để thử bằng cách sử dụng C# (C/C + + là rất nhiều mã để thậm chí là một dịch vụ nếu tôi nhớ lại). Liệu điều đó có hiệu quả??

NHƯNG!

Suy nghĩ đầu tiên của tôi là tạo một máy tính ảo trong máy chủ ảo cấp máy chủ (như Virtual Server, HyperV, VMWare). Những máy ảo này sẽ chạy như dịch vụ (hoặc bất kỳ Hyper V nào). Máy ảo sẽ luôn chạy - bất kể đăng nhập và đăng xuất.

Làm cho máy tính ảo này tự động đăng nhập vào cửa sổ (TweakUI có thể thiết lập điều này) và sau đó chỉ cần khởi chạy ứng dụng GUI bằng cách sử dụng lối tắt đến thư mục Khởi động. Bạn thậm chí có thể từ xa máy tính để bàn vào nó sử dụng GUI của chương trình (tôi đặt cược Always Up không thể làm điều đó).

2

Bạn có thực sự cần nó để chạy như một dịch vụ hoặc bạn chỉ cần nó để chạy khi bạn không được kết nối? Nếu sau này, bạn có thể ngắt kết nối thay vì đăng xuất và ứng dụng sẽ tiếp tục chạy. Tùy chọn sẽ nằm trong danh sách thả xuống sau khi chọn Shut Down hoặc bạn có thể gọi tsdiscon.exe.

0

Bạn có thể sử dụng ServiceMill để đạt được thao tác này. Về cơ bản bạn cài đặt ServiceMill Server trên máy chủ của mình. Sau đó, nhấp vào nút bên phải trên tệp thi hành của bạn và "Cài đặt dưới dạng Dịch vụMọi dịch vụ". Tiếp theo bạn định cấu hình một số thứ (người dùng/mật khẩu, nếu bạn muốn tương tác với máy tính để bàn hoặc nếu bạn muốn ẩn ui ... và đặt chế độ bắt đầu thành tự động). Một công cụ khác từ Active + Software có thể là giải pháp, ServiceMill Exe Builder cho phép bạn tạo dịch vụ từ Command Line và điều này là tuyệt vời nếu bạn đang sử dụng Máy chủ tích hợp liên tục hoặc nếu bạn định phân phối thành phần của mình dưới dạng dịch vụ mà không phải suy nghĩ về tích hợp dịch vụ (cộng với tiền bản quyền miễn phí).

0

Tôi đã có trải nghiệm tốt với winsw. Tôi đã có thể chuyển đổi khá dễ dàng các tập tin batch của tôi sang các dịch vụ sử dụng nó.

Tôi đã sử dụng nó cho nginx, theo số this answer.

0

FireDaemonPro biến hầu hết các ứng dụng GUI thành dịch vụ; nó không phải là miễn phí, nhưng nó có thể là giá trị nhận được nó.