Обновление описания службы при сбое удаленной машины
Я создал класс для установки службы 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);