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); } }