2010-11-21 23 views
9

Trong services.msc> Hành động> Thuộc tính> Đăng nhập> Cho phép dịch vụ tương tác với máy tính để bàn, tôi đã bật dịch vụ của mình để tương tác với máy tính để bàn. điều đó có chính xác? Làm thế nào tôi có thể sử dụng nó để phát âm thanh (MP3, WAV, v.v.) từ dịch vụ của tôi?Cho phép dịch vụ tương tác với máy tính để bàn trong Windows

services.msc > Action > Properties > Log On > Allow service to interact with desktop

Trả lời

5

Bởi vì dịch vụ không chạy trong bối cảnh của một phiên người dùng, bạn tạo một ứng dụng thứ hai để tương tác với dịch vụ.

Ví dụ: máy chủ Microsoft SQL có công cụ giám sát. Ứng dụng này chạy trong phiên người dùng và kết nối với dịch vụ cung cấp cho bạn thông tin về việc liệu dịch vụ có đang chạy hay không và cho phép bạn dừng và khởi động dịch vụ cơ sở dữ liệu.

Vì ứng dụng đó chạy trong phiên người dùng, bạn có thể tương tác với máy tính để bàn thông qua ứng dụng đó.

+0

tôi có hẹn giờ và thông báo trong cửa sổ dịch vụ nơi cảnh báo với thông báo trong taskabar Trình đơn ngữ cảnh không bật – user514989

+1

Tôi có một ví dụ điển hình về lý do tại sao tôi cần bật tính năng này. Dịch vụ của tôi có thể thực thi các kịch bản người dùng tùy chỉnh. Đôi khi các ứng dụng trong các tập lệnh này có giao diện người dùng ứng dụng và không có phiên bản giao diện điều khiển tương ứng. Nếu không có tùy chọn này được kích hoạt, các ứng dụng không thể khởi động và các kịch bản cơ bản không thành công. Không phải là cá nhân tôi đã mã hóa dịch vụ theo cách mà tôi yêu cầu tùy chọn, đây là trường hợp sử dụng chính hãng để bật tính năng này. – BrutalDev

23

Tôi sẽ thực hiện một số quyền tự do ở đây khi cố gắng diễn giải câu hỏi của bạn từ các từ khóa. Trong tương lai, hãy dành nhiều thời gian hơn để viết các câu hỏi của bạn để chúng có ý nghĩa với người khác đang cố đọc và hiểu chúng.

Có hộp kiểm trong tab Đăng nhập trong cửa sổ thuộc tính cho dịch vụ Windows được gọi là "Cho phép dịch vụ tương tác với máy tính để bàn". Nếu bạn đang cố gắng kiểm tra hộp đó theo chương trình, bạn cần chỉ định cờ SERVICE_INTERACTIVE_PROCESS khi bạn tạo dịch vụ của mình bằng API CreateService. (Xem MSDN).

Tuy nhiên, lưu ý rằng như của Windows Vista, dịch vụ Nghiêm cấm tương tác trực tiếp với một người dùng:

Chú ý: Dịch vụ không thể trực tiếp tương tác với người dùng như của Windows Vista. Do đó, các kỹ thuật được đề cập trong phần có tiêu đề Sử dụng Dịch vụ tương tác không nên được sử dụng trong mã mới.

Tính năng "này" bị hỏng và thông thường bạn cho rằng bạn không nên dựa vào nó. Dịch vụ không có nghĩa là cung cấp giao diện người dùng hoặc cho phép bất kỳ loại tương tác trực tiếp nào của người dùng. Microsoft đã cảnh báo rằng tính năng này có thể tránh được kể từ những ngày đầu của Windows NT vì những rủi ro bảo mật có thể xảy ra. Larry Osterman lập luận tại sao nó là always a bad idea. Và anh ta là not the only one.

một số possibleworkarounds, tuy nhiên, nếu bạn hoàn toàn phải có chức năng này. Nhưng tôi khuyên bạn nên xem xét sự cần thiết của nó một cách cẩn thận và khám phá các thiết kế thay thế cho dịch vụ của bạn.

+1

+1 Viết tuyệt vời, đặc biệt là xem xét việc thiếu thông tin từ OP – mandreko

2

Bạn cần thêm serviceinstaller và viết xuống mã bên dưới trong sự kiện cam kết của serviceinstaller.

using System.Management; 

using System.ComponentModel; 

using System.Configuration.Install; 

private void serviceInstaller1_Committed(object sender, InstallEventArgs e) 

     { 
      ConnectionOptions coOptions = new ConnectionOptions(); 
      coOptions.Impersonation = ImpersonationLevel.Impersonate; 
      ManagementScope mgmtScope = new ManagementScope(@"root\CIMV2", coOptions); 
      mgmtScope.Connect(); 
      ManagementObject wmiService; 
      wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'"); 
      ManagementBaseObject InParam = wmiService.GetMethodParameters("Change"); 
      InParam["DesktopInteract"] = true; 
      ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null); 
     } 
+0

Bạn có thể giải thích cách mã này sẽ kích hoạt 'tương tác với dịch vụ' không? – Newbee

-4

wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'");

trên máy tính 64 bit?

+5

Làm cách nào để sử dụng dòng mã bạn đã cung cấp để cho phép dịch vụ tương tác với máy tính để bàn? Bạn có thể dành nhiều thời gian hơn để viết ra câu trả lời của bạn để mọi người có thể hiểu chúng. – mandreko

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