C# 如何以域用户身份使用';本地系统&x27;服务

C# 如何以域用户身份使用';本地系统&x27;服务,c#,process,windows-services,impersonation,localsystem,C#,Process,Windows Services,Impersonation,Localsystem,我有以下简单的服务计划: using System.Diagnostics; using System.ServiceProcess; namespace BasicService { public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } protected ov

我有以下简单的服务计划:

using System.Diagnostics;
using System.ServiceProcess;

namespace BasicService
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            ProcessStartInfo processStartInfo = new ProcessStartInfo
                                                    {
                                                        Verb = "runas",
                                                        UserName = "jdoe",
                                                        Password = "XXXXXXX".ConvertToSecureString(),
                                                        Domain = "abc.com",
                                                        UseShellExecute =false,
                                                        FileName = "notepad.exe"
                                                    };
            Process.Start(processStartInfo);
        }

        protected override void OnStop()
        {
        }
    }
}
我将此用作我的服务安装程序:

using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace BasicService
{
    [RunInstaller(true)]
    public class ProjectInstaller : Installer
    {
        private readonly ServiceProcessInstaller _process;
        private readonly ServiceInstaller _service;

        public ProjectInstaller()
        {
            _process = new ServiceProcessInstaller {Account = ServiceAccount.LocalSystem};
            _service = new ServiceInstaller
                           {
                               ServiceName = "BasicService",
                               Description = "Just a testing service.",
                               StartType = ServiceStartMode.Automatic,
                           };

            Installers.Add(_process);
            Installers.Add(_service);
        }
    }
}
如果我在没有指定动词、用户名、密码、域和useshellexecute的情况下运行此服务,那么一切都会正常运行。如上文所示,一旦我指定这些值,就会得到以下结果:

服务无法启动。System.ComponentModel.Win32异常 (0x80004005):访问被拒绝 系统.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo 在System.Diagnostics.Process.Start()处启动 系统.诊断.流程.启动(ProcessStartInfo-startInfo) 中的BasicService.Service1.OnStart(字符串[]args) C:\BasicService\BasicService\Service1.cs:24行 System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(对象 (州)


有什么想法吗?

自从Windows Vista以来,服务无法简单地显示ui或与用户交互。

因此,要从您的服务运行GUI应用程序,您需要使用CreateProcessAsUser,它在.NET中不直接可用。所以你必须依赖Pinvoke,就像这里描述的一样


你确定吗?服务无法再通过服务帐户与用户交互,但我不知道Windows如何知道
notepad.exe
是交互的,除非它实际运行它。在这种情况下,必须启动该过程。@ta.speot.is-是的,我坚信CreateProcessAsUser是从该服务创建用户可见GUI应用程序的正确方法。究竟是什么原因导致上面的“访问被拒绝”,我不确定,但从调用堆栈中可以看到Windows实际上运行它。Windows如何知道。。。可能是通过检查“/SUBSYSTEM”VS switch.AFAIK设置的入口点符号,这是我能够做到的唯一方法。我必须将CreateProcessAsUser和LogonUser结合起来才能使其正常工作。@user1234883,Process.Execute将具有用户名和密码的ProcessStartInfo作为属性。为什么它不起作用?