Как сделать так, чтобы служба Windows запускалась как «Автоматически (отложенный запуск)» - PullRequest
22 голосов
/ 28 января 2010

Сценарий:

Служба WCF, работающая как служба Windows. Аккаунт "Пользователь".


Что сделано:

Я переопределил OnBeforeInstall в установщике проекта, чтобы иметь возможность установить имя пользователя и пароль из файла конфигурации.


Что я мог бы сделать:

Я хотел бы иметь возможность установить тип запуска как автоматический (отложенный запуск)


Что я пробовал:

Я поместил следующий код в переопределенную OnBeforeInstall

serviceInstaller1.StartType = ServiceStartMode.Automatic + 1;

Подумал, я бы обманул перечисление ServiceStartMode для представления Automatic (отложенный запуск), не сработало. Я не пробовал ничего более простого, потому что я не мог найти ничего, чтобы попробовать.


Что я нашел в сети:

Я обнаружил, что автоматический (отложенный запуск) будет доступен в .NET 4, но это мне сейчас не помогает. 1039 * MSDN * Я обнаружил, что DelayedAutoStart может быть добавлен к ключу конфигурации службы, но это похоже на хак, если я должен сделать это из кода. Но, может быть, это единственное решение, доступное для меня на данный момент?

Есть идеи?

Роберт Перссон, Швеция

Ответы [ 4 ]

37 голосов
/ 02 марта 2012

Теперь, когда .NET 4.0 здесь:

serviceInstaller1.StartType = ServiceStartMode.Automatic;
serviceInstaller1.DelayedAutoStart = true;
5 голосов
/ 28 января 2010

Ваш единственный другой вариант - использовать P / invoke для вызова ChangeServiceConfig2 с SERVICE_CONFIG_DELAYED_AUTO_START_INFO. Но так как вы, похоже, не хотите добавлять запись в реестр, я сомневаюсь, что вы захотите использовать P / invoke. Нет другого способа сделать это из .NET Framework (<4.0). </p>

4 голосов
/ 28 августа 2013

Для моего проекта .NET Framework 3.5 я могу установить свою службу как службу «Автоматически (с задержкой)», вручную установив значение DelayedAutostart для своей службы. Например:

public ProjectInstaller()
{
  ...

  AfterInstall += ProjectInstaller_AfterInstall;
}

void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
{
  string serviceName = <YourSpecific>Installer.ServiceName;

  using (RegistryKey serviceKey = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\Services\" + serviceName, true))
  {
      serviceKey.SetValue("DelayedAutostart", 1, RegistryValueKind.DWord);
  }
}

Обратите внимание, что после установки службы она не будет указана как "Автоматически (с задержкой)" до после перезагрузки компьютера .

1 голос
/ 01 июня 2016

Я немного подробнее расскажу о jdknight. У меня были проблемы с разрешением при попытке его решения, так что вот что я сделал:

void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
{
    try
    {
        RegistryKey key = Registry.LocalMachine.OpenSubKey("System", true); //Opens the System hive with writting permissions set to true
        key = key.CreateSubKey("CurrentControlSet"); //CreateSubKey opens if subkey exists, otherwise it will create that subkey
        key = key.CreateSubKey("services");
        key = key.CreateSubKey(serviceInstaller1.ServiceName);
        key.SetValue("DelayedAutostart", 1, RegistryValueKind.DWord);
    }
    catch (Exception exc)
    {
        Console.WriteLine(exc.Message);
    }
}

Я также зарегистрировался в событии AfterInstall, добавив новый экземпляр InstallEventHandler. Я не уверен, действительно ли это необходимо, но это тоже не повредит:

AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall);

Работает как шарм в .NET Framework 2.0. Как было указано ранее, для фреймворков 4 и выше используйте

serviceInstaller1.DelayedAutoStart = true;

согласно ответу Фиат.

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