2009-12-22 49 views
3

我已經創建了一個windows服務。我想從這項服務中打開一些基於Windows的應用程序。如何在代碼中配置我的Windows服務以訪問桌面?

但我的Windows服務無法啓動桌面應用程序。爲了使訪問我不得不做以下步驟:

  1. 打開管理工具「服務」

  2. 右鍵點擊我的服務,不得不選擇「屬性」

  3. 然後在在「登錄」選項卡上選中「允許服務與桌面交互」。

之後,我的服務可以打開所需的基於窗口的進程。

我可以在代碼(C#)中配置我的Windows服務來訪問桌面,這樣我就不必在安裝後手動更改訪問權限了嗎?

+0

是的,你可以。什麼語言? – 2009-12-22 10:46:07

+0

我需要在C# – Pankaj 2009-12-22 10:49:21

回答

3

在.NET中,您可以覆蓋服務安裝程序類的OnCommited方法來配置服務以訪問桌面。該代碼如下所示:

[RunInstaller(true)] 
public partial class ProjectInstaller : Installer 
{ 
    private ServiceProcessInstaller serviceProcessInstaller; 
    private ServiceInstaller serviceInstaller; 

    public ProjectInstaller() 
    { 
     InitializeComponent(); 

     // adjust configuration to whatever is needed 
     serviceInstaller = new ServiceInstaller(); 
     serviceInstaller.ServiceName = "My Service"; 
     serviceInstaller.DisplayName = "My Service"; 
     serviceInstaller.StartType = ServiceStartMode.Manual; 
     this.Installers.Add(serviceInstaller); 

     serviceProcessInstaller = new ServiceProcessInstaller(); 
     serviceProcessInstaller.Account = 
      System.ServiceProcess.ServiceAccount.LocalSystem; 
     serviceProcessInstaller.Password = null; 
     serviceProcessInstaller.Username = null; 
     this.Installers.Add(serviceProcessInstaller); 
    } 

    protected override void OnCommitted(IDictionary savedState) 
    { 
     base.OnCommitted(savedState); 

     // The following code sets the flag to allow desktop interaction 
     // for the service 
     // 
     using (RegistryKey ckey = 
      Registry.LocalMachine.OpenSubKey(
       @"SYSTEM\CurrentControlSet\Services\My Service", true)) 
     { 
      if (ckey != null && ckey.GetValue("Type") != null) 
      { 
       ckey.SetValue("Type", (((int)ckey.GetValue("Type")) | 256)); 
      } 
     } 
    } 
} 
+0

謝謝Divo .... – Pankaj 2009-12-22 10:54:19

+1

對/錯;看到「重要」在這裏:http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx – 2009-12-22 13:50:11

+0

謝謝Marc Gravell.Nice文章,也很容易的方式來實現的要求。但現在我的老人不允許我改變結構,這就是爲什麼我要解決這個問題。 – Pankaj 2009-12-23 04:42:04

3

只是...不。這不是一項服務的工作。對於這項工作,您應該使用一個用戶應用程序(可能在他們的啓動時)(如有必要)通過IPC向諮詢服務。我是相信該計劃是使UI在某些時候不可用(Vista以後?我停止服務< =>桌面a 時間前)。

對於考慮:

  • 如果你有多個用戶登錄(快速用戶切換)?
  • 如果您有多個RDP會話,該怎麼辦?

你所提出只有真正擴展到1,可能不是事件,如果你認爲「會話0」保留給管理員使用在某些系統上(這樣的交互式用戶不一定會話0)。

+0

我不同意。當通過服務自動化應用程序時,必須爲某些應用程序設置允許桌面訪問的標誌(例如,當互動的唯一方式是通過剪貼板)。當然,擴展可能是一個問題,但是一個不擴展的解決方案通常比沒有解決方案更好(因爲可擴展性並不總是需求)。 – 2009-12-22 11:20:32

+1

然後:不要通過服務自動化應用程序。在用戶的會話中使用一個應用程序,該應用程序會與服務進行交談。我在上面的答案中說過。這可能是一個稍微複雜的*解決方案,但它是*正確*解決方案。 – 2009-12-22 11:25:44

+0

我不會說一件事是對的,另一件事是錯的。考慮使用現有應用程序執行諸如自動打印/文檔轉換等任務的服務。通常你不能讓應用程序(MS Office,OpenOffice,傳統WordPerfect等)收聽服務。當一切都由您的服務控制時,您甚至可以並行創建多個會話,而不需要交互式用戶,因此它非常適合在服務器上運行。當然,命令行工具更適合這樣的工作,但你根本不總是有選擇。 – 2009-12-22 11:36:15

相關問題