我已經創建了一個windows服務。我想從這項服務中打開一些基於Windows的應用程序。如何在代碼中配置我的Windows服務以訪問桌面?
但我的Windows服務無法啓動桌面應用程序。爲了使訪問我不得不做以下步驟:
打開管理工具「服務」
右鍵點擊我的服務,不得不選擇「屬性」
然後在在「登錄」選項卡上選中「允許服務與桌面交互」。
之後,我的服務可以打開所需的基於窗口的進程。
我可以在代碼(C#)中配置我的Windows服務來訪問桌面,這樣我就不必在安裝後手動更改訪問權限了嗎?
我已經創建了一個windows服務。我想從這項服務中打開一些基於Windows的應用程序。如何在代碼中配置我的Windows服務以訪問桌面?
但我的Windows服務無法啓動桌面應用程序。爲了使訪問我不得不做以下步驟:
打開管理工具「服務」
右鍵點擊我的服務,不得不選擇「屬性」
然後在在「登錄」選項卡上選中「允許服務與桌面交互」。
之後,我的服務可以打開所需的基於窗口的進程。
我可以在代碼(C#)中配置我的Windows服務來訪問桌面,這樣我就不必在安裝後手動更改訪問權限了嗎?
在.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));
}
}
}
}
只是...不。這不是一項服務的工作。對於這項工作,您應該使用一個用戶應用程序(可能在他們的啓動時)(如有必要)通過IPC向諮詢服務。我是相信該計劃是使UI在某些時候不可用(Vista以後?我停止服務< =>桌面a 長時間前)。
對於考慮:
你所提出只有真正擴展到1,可能不是事件,如果你認爲「會話0」保留給管理員使用在某些系統上(這樣的交互式用戶不一定會話0)。
我不同意。當通過服務自動化應用程序時,必須爲某些應用程序設置允許桌面訪問的標誌(例如,當互動的唯一方式是通過剪貼板)。當然,擴展可能是一個問題,但是一個不擴展的解決方案通常比沒有解決方案更好(因爲可擴展性並不總是需求)。 – 2009-12-22 11:20:32
然後:不要通過服務自動化應用程序。在用戶的會話中使用一個應用程序,該應用程序會與服務進行交談。我在上面的答案中說過。這可能是一個稍微複雜的*解決方案,但它是*正確*解決方案。 – 2009-12-22 11:25:44
我不會說一件事是對的,另一件事是錯的。考慮使用現有應用程序執行諸如自動打印/文檔轉換等任務的服務。通常你不能讓應用程序(MS Office,OpenOffice,傳統WordPerfect等)收聽服務。當一切都由您的服務控制時,您甚至可以並行創建多個會話,而不需要交互式用戶,因此它非常適合在服務器上運行。當然,命令行工具更適合這樣的工作,但你根本不總是有選擇。 – 2009-12-22 11:36:15
是的,你可以。什麼語言? – 2009-12-22 10:46:07
我需要在C# – Pankaj 2009-12-22 10:49:21