Как запустить отдельный процесс как пользователь домена с сервисом «локальной системы»? - PullRequest
5 голосов
/ 03 февраля 2012

У меня есть следующая простая служебная программа:

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);
        }
    }
}

Если я запускаю эту службу без глагола, имя пользователя, пароль, домен и использует hellexecute указано, все работает просто денди.Как только я укажу эти значения, как показано выше, я получу следующее:

Служба не может быть запущена.System.ComponentModel.Win32Exception (0x80004005): доступ запрещен в System.Diagnostics.Process.StartWithCreateProcess (ProcessStartInfo startInfo) в System.Diagnostics.Process.Start () в System.Diagnostics.Process.Start.ServiceService.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.Service.ServiceService)..OnStart (String [] args) в C: \ BasicService \ BasicService \ Service1.cs: строка 24 в System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback (состояние объекта)

Есть идеи?

1 Ответ

2 голосов
/ 27 февраля 2012

Начиная с Windows Vista, службы не могут просто отображать пользовательский интерфейс или взаимодействовать с пользователем.
http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx

Таким образом, для запуска приложения с графическим интерфейсом из вашей службы вам необходимо использовать CreateProcessAsUser, который не доступен напрямую в .NET. Так что вам придется положиться на Pinvoke, что-то похожее, как описано здесь

http://blogs.msdn.com/b/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...