Обновление описания службы при сбое удаленной машины

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

Вот код, который я использую:

    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool ChangeServiceConfig2(ServiceControlHandle hService, SERVICE_INFO_LEVEL dwInfoLevel, object lpInfo=null);


    public enum SERVICE_INFO_LEVEL
    {
        SERVICE_CONFIG_DESCRIPTION = 1,
        SERVICE_CONFIG_FAILURE_ACTIONS = 2,
        SERVICE_CONFIG_DELAYED_AUTO_START_INFO = 3,
        SERVICE_CONFIG_FAILURE_ACTIONS_FLAG = 4,
        SERVICE_CONFIG_SERVICE_SID_INFO = 5,
        SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO = 6,
        SERVICE_CONFIG_PRESHUTDOWN_INFO = 7,
        SERVICE_CONFIG_TRIGGER_INFO = 8,
        SERVICE_CONFIG_PREFERRED_NODE = 9,
        SERVICE_CONFIG_LAUNCH_PROTECTED = 12
    }

Это код, используемый после создания службы, но перед запуском sHandle получен из creatservice:

    ChangeServiceConfig2(sHandle, 
    NativeMethods.SERVICE_INFO_LEVEL.SERVICE_CONFIG_DESCRIPTION, 
    ServiceDescription.ToString());

Я использую это, чтобы следовать: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681988(v=vs.85).aspx

Ошибка, которую я получаю:

System.AccessViolationException: 'Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Отредактировано: больше не получаю ошибку, но теперь я получаю только первую букву описания, не знаю почему. Вот изменения, которые я сделал:

    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool ChangeServiceConfig2(ServiceControlHandle hService, int dwInfoLevel, [MarshalAs(UnmanagedType.Struct)] ref SERVICE_DESCRIPTION lpInfo);


    public enum SERVICE_INFO_LEVEL:int
    {
        SERVICE_CONFIG_DESCRIPTION = 0X01,
        SERVICE_CONFIG_FAILURE_ACTIONS = 0X02,
        SERVICE_CONFIG_DELAYED_AUTO_START_INFO = 0X03,
        SERVICE_CONFIG_FAILURE_ACTIONS_FLAG = 0X04,
        SERVICE_CONFIG_SERVICE_SID_INFO = 0X05,
        SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO = 0X06,
        SERVICE_CONFIG_PRESHUTDOWN_INFO = 0X07,
        SERVICE_CONFIG_TRIGGER_INFO = 0X08,
        SERVICE_CONFIG_PREFERRED_NODE = 0X09,
        SERVICE_CONFIG_LAUNCH_PROTECTED = 0X12
    }


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct SERVICE_DESCRIPTION
    {
        public string lpDescription;
    }

Метод вызова

    SERVICE_DESCRIPTION DESC = new NativeMethods.SERVICE_DESCRIPTION()
                        {
                            lpDescription = ServiceDescription.ToString()
                        };
    ChangeServiceConfig2(sHandle,
                            (int)NativeMethods.SERVICE_INFO_LEVEL.SERVICE_CONFIG_DESCRIPTION,
                            ref DESC);

0 ответов

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