Подтвердить что ты не робот

Как заставить службу Windows запускаться как "Автоматический (отложенный запуск)"

Сценарий:

Служба WCF работает как служба Windows. Учетная запись "Пользователь".


Что сделано:

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


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

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


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

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

serviceInstaller1.StartType = ServiceStartMode.Automatic + 1;

Рисунок, который я обманул бы перечислением ServiceStartMode в представлении Automatic (Delayed Start), не работал. Не пробовал ничего проще, потому что я не мог найти ничего, чтобы попробовать.


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

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

Любые идеи?

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

4b9b3361

Ответ 1

Теперь, когда .NET 4.0 находится здесь:

serviceInstaller1.StartType = ServiceStartMode.Automatic;
serviceInstaller1.DelayedAutoStart = true;

Ответ 2

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

Ответ 3

Для моего проекта .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);
  }
}

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

Ответ 4

Я расскажу немного о 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;

согласно ответу fiat.