Запустите службу Windows без повышения прав

У меня есть служба Windows "Service1", настроенная для входа в систему как "Локальная служба".

Я создал консольное приложение, чтобы запустить его программно.

        var service = new ServiceController("Service1");
        service.Start();

Я знаю, что если я запускаю ConsoleApplication1 из командной строки администратора, он запускается без проблем.

И если я запускаю его без возвышения, я получаю:

Произошла системная ошибка 5.

В доступе отказано.

Но мне нужно начать это без возвышения.

Возможно ли это, или я должен изменить способ добиться этого?

5 ответов

Решение

Я перешел по ссылке торак, и я понимаю это ключевое различие в отношении прав на услугу:

  • служба имеет права в отношении пользователя "Запуск от имени"
  • служба имеет другое разрешение для управления службой (т.е. запускать / останавливать ее)

Итак, чтобы запустить сервис, мне нужно изменить разрешение на управление сервисом.

Ну, я сделал службу Windows под названием Service1, и я сделал установщик с WIX. Во время настройки я звоню ServiceInstall

      <ServiceInstall Id="ServiceInstaller" Type="ownProcess" Vital="yes"
       Name="Service1" DisplayName="Service1"
       Description="Service1 description"Start="demand"
       Account="NT AUTHORITY\LocalService"
       ErrorControl="ignore" Interactive="no" >
      </ServiceInstall>

Затем у меня есть клиентская программа TestProgram, где я пытаюсь запустить службу:

var service = new ServiceController("Service1");
service.Start();

И, очевидно, он не запускает службу без повышения уровня TestProgram (который работает под обычной учетной записью пользователя).

Таким образом, решение состоит в том, чтобы дать команду WIX разрешить членам группы пользователей (например) запускать / останавливать службу, используя тег PermissionEx:

<util:PermissionEx User="Users" ServiceStart="yes" ServiceStop="yes">
</util:PermissionEx>

Надеюсь это поможет. Спасибо вам всем.

Вы можете установить ACL для самой службы, чтобы разрешить это. Утилита SetACL.exe делает это (несколько) просто; например:

SetACL.exe -on "MyService" -ot srv -actn ace -ace "n:S-1-5-32-545;p:start_stop"

Это позволяет членам группы пользователей (S-1-5-32-545) запускать и останавливать MyService.

Если я могу добавить свои 2 цента, вот мое решение, которое не потребует какой-либо сложной модификации App.Manifest или службы Windows.

Концепция заключается в том, чтобы просто вызвать "Net Start" через процесс, который повышен:

public string StartServiceViaProcess(string param_strServiceName)
    {
        try
        {
            const int ERROR_CANCELLED = 1223; //The operation was canceled by the user.

            Process process = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            startInfo.FileName = "cmd.exe";
            startInfo.Verb = "runas";
            startInfo.UseShellExecute = true;
            startInfo.Arguments = "/C net start " + param_strServiceName;
            process.StartInfo = startInfo;
            try
            {
                Process.Start(startInfo);
            }
            catch (Win32Exception ex)
            {
                if (ex.NativeErrorCode == ERROR_CANCELLED)
                    return "L'usager a annulé la demande d'exécution avec privilège.";
                else
                    throw;
            }
        }
        catch (Exception ex)
        {
            return ex.SI_ConvertToString();
        }
        return "";
    }

Я не думаю, что вы можете сделать это - я понимаю, что это связано с соображениями безопасности. Разрешение вредоносных программ автоматически повышать свою эффективность было бы проблематично.

Это ссылка, по которой я перешел и решил мою проблему.

Как предоставить не-администраторам права на управление службами

По умолчанию обычные пользователи без прав системного администратора не могут управлять службами Windows. Это означает, что они не могут останавливать, запускать или изменять настройки или разрешения для таких служб. В некоторых случаях необходимо, чтобы у пользователя были разрешения на перезапуск или управление определенными службами. В этой статье мы рассмотрим некоторые способы управления разрешениями для служб Windows. В частности, мы покажем, как предоставить обычному пользователю без прав администратора разрешения на запуск и остановку определенной службы...

Нет простого и удобного интегрированного инструмента для управления разрешениями служб в Windows. Мы рассмотрим несколько способов предоставления пользователю прав на управление сервисом...

Другие вопросы по тегам