public override ExecuteResult Execute(HandlerStartInfo startInfo)
    {
        string message;

        try
        {
            message = "Deserializing incoming requests...";
            UpdateProgress(message, StatusType.Initializing);
            GroupMembershipRequest parms = DeserializeOrNew <GroupMembershipRequest>(startInfo.Parameters);

            message = "Processing individual child request...";
            UpdateProgress(message, StatusType.Running);
            ProcessAddRequests(parms, startInfo.IsDryRun);
            ProcessDeleteRequests(parms, startInfo.IsDryRun);

            message = (startInfo.IsDryRun ? "Dry run execution is completed" : "Execution is completed")
                      + (_encounteredFailure ? " with errors encountered" : "") + ".";
            UpdateProgress(message, _encounteredFailure ? StatusType.CompletedWithErrors : StatusType.Success);
        }
        catch (Exception ex)
        {
            message = $"Execution has been aborted due to: {ex.Message}";
            UpdateProgress(message, StatusType.Failed);
            _encounteredFailure = true;
        }
        _response.Status = message;

        message = "Serializing response...";
        UpdateProgress(message, StatusType.Any, true);
        _result.ExitData = JsonConvert.SerializeObject(_response);
        _result.ExitCode = _encounteredFailure ? -1 : 0;

        return(_result);
    }
    private void ProcessDeleteRequests(GroupMembershipRequest parms, bool isDryRun)
    {
        string message;
        int    deleteSectionCount = 0;
        int    deleteGroupCount   = 0;
        int    deleteUserCount    = 0;

        if (parms?.DeleteSection != null)
        {
            foreach (DeleteSection deleteSection in parms.DeleteSection)
            {
                deleteSectionCount++;
                foreach (string group in deleteSection.Groups)
                {
                    deleteGroupCount++;
                    foreach (string user in deleteSection.Users)
                    {
                        deleteUserCount++;
                        message = $"Executing delete request [{deleteSectionCount}/{deleteGroupCount}/{deleteUserCount}]"
                                  + (isDryRun ? " in dry run mode..." : "...");
                        UpdateProgress(message);
                        OnLogMessage(_context, $"Domain: {deleteSection.Domain}, Group: {group}, User: {user}");
                        try
                        {
                            if (!IsValidDomain(deleteSection.Domain))
                            {
                                throw new Exception("Domain specified is not valid.");
                            }
                            DirectoryServices.RemoveUserFromGroup(user, group, isDryRun, deleteSection.Domain);
                            Result r = new Result()
                            {
                                Domain   = deleteSection.Domain,
                                User     = user,
                                Group    = group,
                                Action   = "delete",
                                ExitCode = 0,
                                Note     = isDryRun ? "Dry run has been completed." : "User has been successfully removed from the group."
                            };
                            _response.Results.Add(r);
                            message = $"Processed delete request [{deleteSectionCount}/{deleteGroupCount}/{deleteUserCount}].";
                            UpdateProgress(message);
                        }
                        catch (Exception ex)
                        {
                            Result r = new Result()
                            {
                                Domain   = deleteSection.Domain,
                                User     = user,
                                Group    = group,
                                Action   = "delete",
                                ExitCode = -1,
                                Note     = ex.Message
                            };
                            _response.Results.Add(r);
                            _encounteredFailure = true;
                            message             = $"Encountered error while processing delete request [{deleteSectionCount}/{deleteGroupCount}/{deleteUserCount}].";
                            UpdateProgress(message);
                        }
                    }
                    deleteUserCount = 0;
                }
                deleteGroupCount = 0;
            }
        }
        else
        {
            message = "No delete section is found from the incoming request.";
            UpdateProgress(message);
        }
    }