我创建了一个Windows服务。我想从这项服务中打开一些基于Windows的应用程序。
但我的Windows服务无法启动桌面应用程序。要启用访问权限,我必须执行以下步骤:
打开管理工具“服务”
右键点击我的服务,必须选择“属性”
然后在“登录”标签中选择“允许服务与桌面交互”。
之后,我的服务可以打开所需的基于Windows的进程。
我可以在代码(C#)中配置我的Windows服务来访问桌面,这样我就不必在安装后手动更改访问权限了吗?
答案 0 :(得分: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));
}
}
}
}
答案 1 :(得分:3)
只是......不要。这不是服务的工作。对于这项工作,您应该使用用户应用程序(可能在他们的启动时)(如果需要)通过IPC与服务进行交谈。我相信计划是在某些时候使用户界面无法使用UI(从Vista开始?我停止了服务< =>桌面很久时间之前)。
考虑因素:
你提出的建议只是真正扩展到1,如果你认为“会话0”是在一些系统上保留给管理员使用的话,可能不是这样的事件(所以交互式用户不是必然在会议0)。