首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在代码中配置windows服务以访问桌面?

如何在代码中配置windows服务以访问桌面?
EN

Stack Overflow用户
提问于 2009-12-22 10:39:49
回答 2查看 3.4K关注 0票数 3

我创建了一个windows服务。我想从这个服务中打开一些基于windows的应用程序。

但是我的windows服务无法启动桌面应用程序。为了启用访问,我必须执行以下步骤:

"Services"

  • Right

  • 打开了管理工具
  1. ,在“登录”选项卡中选择"properties"
  2. Then,并选择“允许服务与桌面交互”。

在此之后,我的服务可以打开所需的基于windows的进程。

我是否可以在代码(C#)中配置我的windows服务以访问桌面,以便在安装后不必手动更改访问权限?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-22 10:50:09

在.NET中,您可以重写服务安装程序类的OnCommited方法,以配置服务以访问桌面。守则如下:

代码语言:javascript
复制
[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));
            }
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2009-12-22 11:09:03

只是..。别。那不是服务的工作。对于这项工作,您应该使用一个用户应用程序(可能在他们的启动阶段),这个应用程序(如果需要的话)可以通过IPC与服务对话。我相信我们的计划是让用户界面在某一时刻无法从服务中获得(Vista?我很久以前就停止做service<=>desktop了。

出于考虑:

如果有多个用户登录(如果有多个RDP会话,则为快速用户switching)?

  • what ),那么
  • 怎么办?

如果您认为“会话0”是为某些系统上的管理人员保留的(因此交互式用户不一定在会话0上),那么您所建议的内容实际上只会扩展到1,而可能不会发生这样的情况。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1945529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档