Изменение настройки службы - PullRequest
0 голосов
/ 05 мая 2011

При установке службы существует полезный класс .NET, который называется ServiceProcessInstaller. Этот класс имеет свойство Account, которое является перечислением ServiceAccount с возможными значениями LocalService, LocalSystem, NetworkService и User.

Это нормально во время установки, но кто-нибудь знает, как я могу изменить это значение для существующего сервиса?

Я предполагал, что мне нужно отойти от фактических классов типа установки, и изучал возможность подключения к методу advapi32 ChangeServiceConfig, WMI и ManagementObjects и т. Д.

Действительно, я нашел код, который фактически изменит учетную запись, под которой работает служба,

ManagementObject mo = new ManagementObject("Win32_Service.Name='" + myService + "'");
object[] configParams = new object[11];

configParams[6] = userName;
configParams[7] = password;

object result = mo.InvokeMethod("Change", configParams);

(что само по себе выглядит немного как черная магия, но имеет смысл при просмотре с подписью ChangeServiceConfig)

Однако, когда я применяю этот код к сервису, который, как оказалось, устанавливается как LocalSystem, он не действует (хотя, когда я интерпретирую result, вызов сообщает об успехе). Меня это не удивляет, поскольку я задаю только имя пользователя и пароль, я не говорю, что «вместо того, чтобы работать как локальный сервис, этот сервис должен работать под определенной учетной записью пользователя».

Теперь, мое внутреннее чувство - я иду по правильному пути. Проблема в том, что ни один из параметров в ChangeServiceConfig не предоставляет возможности сделать это.

Есть идеи? ТИА, Пит

Ответы [ 3 ]

1 голос
/ 06 мая 2011

Вам необходимо олицетворять поток для запуска в контексте пользователя.
Попробуйте этот класс:
Небольшой класс C # для олицетворения пользователя
или этот:
Олицетворение пользователя

1 голос
/ 06 мая 2011

Код ошибки 16 означает « Служба помечена для удаления ».Иногда при изменении параметра службы, в частности при удалении / повторном создании службы, необходимо перезагрузить компьютер для завершения операции.Пока он еще не завершен, вы не можете манипулировать службой и получаете код ошибки 16.

Кроме того, это может быть не тот случай, когда проблема связана с тем, что вызов находится внутри библиотеки DLL,Если вы поместите свой код в dll тестового буфера и вызовите его из exe тестового буфера (так же, как вы тестировали его в exe тестового буфера) и не создадите / не удалите службу между ними, я думаю, что это все равно будет работать.

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

0 голосов
/ 29 февраля 2016

Код возврата: 21: «Неверный параметр».

Я столкнулся с той же проблемой: проблема возникает при попытке применить нового пользователя / пароль к службе, которая в настоящее время имеет «LocalSystem» с «Разрешить службу»взаимодействовать с рабочим столом "включен.

Для разрешения установите флаг «DesktopInteract» в запросе «Изменить»

var query = new ManagementPath(string.Format("Win32_Service.Name='{0}'", serviceName));      // string.Format("SELECT * FROM Win32_Service where Name='{0}'", serviceName);

using (ManagementObject service = new ManagementObject(query))
{
    object[] wmiParams = new object[10];

    //WMI update doesn't work if the service's user is currently set to LocalSystem
    //  with Interact with desktop on
    wmiParams[5] = false;
    wmiParams[6] = serviceUserName;
    wmiParams[7] = password;
    //update credentials for the service
    var rtn = service.InvokeMethod("Change", wmiParams);

}

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