public virtual void ChangeConfig(string displayName, string binaryPath, ServiceType serviceType, ServiceStartType startupType, ErrorSeverity errorSeverity, Win32ServiceCredentials credentials) { var success = NativeInterop.ChangeServiceConfigW(this, serviceType, startupType, errorSeverity, binaryPath, null, IntPtr.Zero, null, credentials.UserName, credentials.Password, displayName); if (!success) { throw new Win32Exception(Marshal.GetLastWin32Error()); } }
public void CreateOrUpdateService(string serviceName, string displayName, string description, string binaryPath, Win32ServiceCredentials credentials, bool autoStart = false, bool startImmediately = false, ErrorSeverity errorSeverity = ErrorSeverity.Normal) { if (string.IsNullOrEmpty(binaryPath)) { throw new ArgumentException("Value cannot be null or empty.", nameof(binaryPath)); } if (string.IsNullOrEmpty(serviceName)) { throw new ArgumentException("Value cannot be null or empty.", nameof(serviceName)); } try { using (var mgr = ServiceControlManager.Connect(nativeInterop, machineName, databaseName, ServiceControlManagerAccessRights.All)) { ServiceHandle existingService; Win32Exception errorException; if (mgr.TryOpenService(serviceName, ServiceControlAccessRights.All, out existingService, out errorException)) { using (existingService) { DoUpdateService(displayName, description, binaryPath, credentials, autoStart, errorSeverity, existingService); } } else { if (errorException.NativeErrorCode == KnownWin32ErrorCoes.ERROR_SERVICE_DOES_NOT_EXIST) { DoCreateService(mgr, serviceName, displayName, description, binaryPath, credentials, autoStart, startImmediately, errorSeverity); } else { throw errorException; } } } } catch (DllNotFoundException dllException) { throw new PlatformNotSupportedException(nameof(Win32ServiceHost) + " is only supported on Windows with service management API set.", dllException); } }
private void DoCreateService(ServiceControlManager serviceControlManager, string serviceName, string displayName, string description, string binaryPath, Win32ServiceCredentials credentials, bool autoStart, bool startImmediately, ErrorSeverity errorSeverity) { using (var svc = serviceControlManager.CreateService(serviceName, displayName, binaryPath, ServiceType.Win32OwnProcess, autoStart ? ServiceStartType.AutoStart : ServiceStartType.StartOnDemand, errorSeverity, credentials)) { if (!string.IsNullOrEmpty(description)) { svc.SetDescription(description); } if (startImmediately) { svc.Start(); } } }
public void CreateService(string serviceName, string displayName, string description, string binaryPath, Win32ServiceCredentials credentials, bool autoStart = false, bool startImmediately = false, ErrorSeverity errorSeverity = ErrorSeverity.Normal) { if (string.IsNullOrEmpty(binaryPath)) { throw new ArgumentException("Value cannot be null or empty.", nameof(binaryPath)); } if (string.IsNullOrEmpty(serviceName)) { throw new ArgumentException("Value cannot be null or empty.", nameof(serviceName)); } try { using (var mgr = ServiceControlManager.Connect(nativeInterop, machineName, databaseName, ServiceControlManagerAccessRights.All)) { DoCreateService(mgr, serviceName, displayName, description, binaryPath, credentials, autoStart, startImmediately, errorSeverity); } } catch (DllNotFoundException dllException) { throw new PlatformNotSupportedException(nameof(Win32ServiceHost) + " is only supported on Windows with service management API set.", dllException); } }
private static void DoUpdateService(string displayName, string description, string binaryPath, Win32ServiceCredentials credentials, bool autoStart, ErrorSeverity errorSeverity, ServiceHandle existingService) { existingService.ChangeConfig(displayName, binaryPath, ServiceType.Win32OwnProcess, autoStart ? ServiceStartType.AutoStart : ServiceStartType.StartOnDemand, errorSeverity, credentials); existingService.SetDescription(description); existingService.Start(throwIfAlreadyRunning: false); }
public ServiceHandle CreateService(string serviceName, string displayName, string binaryPath, ServiceType serviceType, ServiceStartType startupType, ErrorSeverity errorSeverity, Win32ServiceCredentials credentials) { var service = NativeInterop.CreateServiceW(this, serviceName, displayName, ServiceControlAccessRights.All, serviceType, startupType, errorSeverity, binaryPath, null, IntPtr.Zero, null, credentials.UserName, credentials.Password); service.NativeInterop = NativeInterop; if (service.IsInvalid) { throw new Win32Exception(Marshal.GetLastWin32Error()); } return(service); }