При установке службы существует полезный класс .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 не предоставляет возможности сделать это.
Есть идеи? ТИА, Пит