public void RemoveService()

in SimpleRemoteConsole/ServiceInterop/Service.cs [234:299]


        public void RemoveService()
        {
            var hSCManager = IntPtr.Zero;
            var hService = IntPtr.Zero;

            try
            {
                hSCManager = NativeServiceWrapper.OpenSCManagerW(null, null, (uint)SCMPermissions.SC_MANAGER_ALL_ACCESS);
                if (hSCManager == IntPtr.Zero)
                {
                    var error = Marshal.GetLastWin32Error();
                    var errorMsg = "Error when opening SCM: " + error;

                    if (error == 0x5)
                    {
                        errorMsg = "Error when opening SCM: Access Denied. Please try again with administrator privileges.";
                    }
                    
                    logger.Error("Remove service failed: " + errorMsg);
                    throw new Win32Exception(error, errorMsg);
                }

                hService = NativeServiceWrapper.OpenServiceW(hSCManager, serviceName, (uint)ServicePermissions.SERVICE_DELETE | (uint)ServicePermissions.SERVICE_STOP);
                if (hService == IntPtr.Zero)
                {
                    var error = Marshal.GetLastWin32Error();
                    var errorMsg = "Could not open the service for removal. Error: " + error;
                    logger.Error("Remove service failed: " + errorMsg);
                    throw new Win32Exception(error, errorMsg);
                }

                ServiceStatus status = new ServiceStatus();
                if (!NativeServiceWrapper.ControlService(hService, ServiceControls.SERVICE_CONTROL_STOP, ref status))
                {
                    var error = Marshal.GetLastWin32Error();
                    if (error != (int)ServiceErrorCodes.ERROR_SERVICE_NOT_ACTIVE &&
                        error != (int)ServiceErrorCodes.ERROR_SERVICE_CANNOT_ACCEPT_CTRL &&
                        error != (int)ServiceErrorCodes.ERROR_SHUTDOWN_IN_PROGRESS)
                    {
                        var errorMsg = "Could not stop the service for removal. Error: " + error;
                        logger.Error("Remove service failed: " + errorMsg);
                        throw new Win32Exception(error, errorMsg);
                    }
                }

                if (!NativeServiceWrapper.DeleteService(hService))
                {
                    var error = Marshal.GetLastWin32Error();
                    var errorMsg = "Could not delete the service. Error: " + error;
                    logger.Error("Remove service failed: " + errorMsg);
                    throw new Win32Exception(error, errorMsg);
                }
            }
            finally
            {
                if (hService != IntPtr.Zero)
                {
                    NativeServiceWrapper.CloseServiceHandle(hService);
                }

                if (hSCManager != IntPtr.Zero)
                {
                    NativeServiceWrapper.CloseServiceHandle(hSCManager);
                }
            }
        }