public void Handler_SearchTestsSuccess()
        {
            Dictionary <string, string> parameters = new Dictionary <string, string>();

            // Create Objects To Search
            UserPrincipal up1 = Utility.CreateUser(workspaceName);
            UserPrincipal up2 = Utility.CreateUser(workspaceName);
            UserPrincipal up3 = Utility.CreateUser(workspaceName);
            UserPrincipal up4 = Utility.CreateUser(workspaceName);

            GroupPrincipal gp1 = Utility.CreateGroup(workspaceName);
            GroupPrincipal gp2 = Utility.CreateGroup(workspaceName);


            // Search For Users
            Console.WriteLine($"Searching For All Users In : [{workspaceName}]");
            parameters.Clear();
            parameters.Add("searchbase", workspaceName);
            parameters.Add("filter", "(objectClass=User)");
            parameters.Add("attributes", @"[ ""objectGUID"", ""objectSid"" ]");

            ActiveDirectoryHandlerResults result = Utility.CallPlan("Search", parameters);

            Assert.That(result.Results[0].Statuses[0].Status, Is.EqualTo(AdStatusType.Success));
            Assert.That(result.Results[0].SearchResults.Results.Count, Is.EqualTo(4));

            // Search For Groups
            Console.WriteLine($"Searching For All Groups In : [{workspaceName}]");
            parameters.Clear();
            parameters.Add("searchbase", workspaceName);
            parameters.Add("filter", "(objectClass=Group)");
            parameters.Add("attributes", @"[ ""objectGUID"", ""objectSid"" ]");

            result = Utility.CallPlan("Search", parameters);
            Assert.That(result.Results[0].Statuses[0].Status, Is.EqualTo(AdStatusType.Success));
            Assert.That(result.Results[0].SearchResults.Results.Count, Is.EqualTo(2));

            // Check Group Membership (GetAllGroups)
            DirectoryServices.AddGroupToGroup(gp1.DistinguishedName, gp2.DistinguishedName);
            DirectoryServices.AddUserToGroup(up1.DistinguishedName, gp1.DistinguishedName);

            Console.WriteLine($"Searching For All Groups For User : [{up1.DistinguishedName}]");
            parameters.Clear();
            parameters.Add("distinguishedname", up1.DistinguishedName);

            result = Utility.CallPlan("GetAllGroups", parameters);
            Assert.That(result.Results[0].Statuses[0].Status, Is.EqualTo(AdStatusType.Success));
            Assert.That(result.Results[0].SearchResults.Results.Count, Is.EqualTo(3));

            // Delete Search Objects
            Utility.DeleteUser(up1.DistinguishedName);
            Utility.DeleteUser(up2.DistinguishedName);
            Utility.DeleteUser(up3.DistinguishedName);
            Utility.DeleteUser(up4.DistinguishedName);
            Utility.DeleteGroup(gp1.DistinguishedName);
            Utility.DeleteGroup(gp2.DistinguishedName);
        }
        public void Core_AddUserToNonExistantGroup()
        {
            // Get Group That Does Not Exist
            String        groupName = $"testgroup_{Utility.GenerateToken( 8 )}";
            String        groupDistinguishedName = $"OU={groupName},{workspaceName}";
            UserPrincipal up = Utility.CreateUser(workspaceName);

            Console.WriteLine($"Adding User [{up.DistinguishedName}] To Group [{groupDistinguishedName}] Which Should Not Exist.");
            AdException ex = Assert.Throws <AdException>(() => DirectoryServices.AddUserToGroup(up.DistinguishedName, groupDistinguishedName));

            Console.WriteLine($"Exception Message : {ex.Message}");
            Assert.That(ex.Message, Contains.Substring("cannot be found"));

            Utility.DeleteUser(up.DistinguishedName);
        }
        public void Core_GroupManagementTestSuccess()
        {
            // Add User To Group
            UserPrincipal       user = Utility.CreateUser(workspaceName);
            UserPrincipalObject upo  = DirectoryServices.GetUser(user.DistinguishedName, true, false, false);
            int beforeCount          = upo.Groups.Count;

            Console.WriteLine($"Adding User [{user.Name}] To Group [{group.Name}].");
            DirectoryServices.AddUserToGroup(user.DistinguishedName, group.DistinguishedName);
            upo = DirectoryServices.GetUser(user.DistinguishedName, true, false, false);
            int afterCount = upo.Groups.Count;

            Assert.That(afterCount, Is.EqualTo(beforeCount + 1));

            // Remove User From Group
            beforeCount = afterCount;
            Console.WriteLine($"Removing User [{user.Name}] From Group [{group.Name}].");
            DirectoryServices.RemoveUserFromGroup(user.DistinguishedName, group.DistinguishedName);
            upo        = DirectoryServices.GetUser(user.DistinguishedName, true, false, false);
            afterCount = upo.Groups.Count;
            Assert.That(afterCount, Is.EqualTo(beforeCount - 1));

            // Delete User
            Utility.DeleteUser(user.DistinguishedName);

            // Add Group To Group
            GroupPrincipal       newGroup = Utility.CreateGroup(workspaceName);
            GroupPrincipalObject gpo      = DirectoryServices.GetGroup(newGroup.DistinguishedName, true, false, false);

            beforeCount = gpo.Groups.Count;
            Console.WriteLine($"Adding Group [{newGroup.Name}] To Group [{group.Name}].");
            DirectoryServices.AddGroupToGroup(newGroup.DistinguishedName, group.DistinguishedName);
            gpo        = DirectoryServices.GetGroup(newGroup.DistinguishedName, true, false, false);
            afterCount = gpo.Groups.Count;
            Assert.That(afterCount, Is.EqualTo(beforeCount + 1));

            // Remove Group From Group
            beforeCount = afterCount;
            Console.WriteLine($"Removing Group [{newGroup.Name}] From Group [{group.Name}].");
            DirectoryServices.RemoveGroupFromGroup(newGroup.DistinguishedName, group.DistinguishedName);
            gpo        = DirectoryServices.GetGroup(newGroup.DistinguishedName, true, false, false);
            afterCount = gpo.Groups.Count;
            Assert.That(afterCount, Is.EqualTo(beforeCount - 1));

            // Delete Groups
            Utility.DeleteGroup(newGroup.DistinguishedName);
        }
    private void ProcessAddRequests(GroupMembershipRequest parms, bool isDryRun)
    {
        string message;
        int    addSectionCount = 0;
        int    addGroupCount   = 0;
        int    addUserCount    = 0;

        if (parms?.AddSection != null)
        {
            foreach (AddSection addSection in parms.AddSection)
            {
                addSectionCount++;
                foreach (string group in addSection.Groups)
                {
                    addGroupCount++;
                    foreach (string user in addSection.Users)
                    {
                        addUserCount++;
                        message = $"Executing add request [{addSectionCount}/{addGroupCount}/{addUserCount}]"
                                  + (isDryRun ? " in dry run mode..." : "...");
                        UpdateProgress(message);
                        OnLogMessage(_context, $"Domain: {addSection.Domain}, Group: {group}, User: {user}");
                        try
                        {
                            if (!IsValidDomain(addSection.Domain))
                            {
                                throw new Exception("Domain specified is not valid.");
                            }
                            DirectoryServices.AddUserToGroup(user, group, isDryRun, addSection.Domain);
                            Result r = new Result()
                            {
                                Domain   = addSection.Domain,
                                User     = user,
                                Group    = group,
                                Action   = "add",
                                ExitCode = 0,
                                Note     = isDryRun ? "Dry run has been completed." : "User has been successfully added to the group."
                            };
                            _response.Results.Add(r);
                            message = $"Processed add request [{addSectionCount}/{addGroupCount}/{addUserCount}].";
                            UpdateProgress(message);
                        }
                        catch (Exception ex)
                        {
                            Result r = new Result()
                            {
                                Domain   = addSection.Domain,
                                User     = user,
                                Group    = group,
                                Action   = "add",
                                ExitCode = -1,
                                Note     = ex.Message
                            };
                            _response.Results.Add(r);
                            _encounteredFailure = true;
                            message             = $"Encountered error while processing add request [{addSectionCount}/{addGroupCount}/{addUserCount}].";
                            UpdateProgress(message);
                        }
                    }
                    addUserCount = 0;
                }
                addGroupCount = 0;
            }
        }
        else
        {
            message = "No add section is found from the incoming request.";
            UpdateProgress(message);
        }
    }
    private void AddToGroup(ActiveDirectoryObjectResult result, AdObject obj, bool returnObject = true)
    {
        ActiveDirectoryStatus status = new ActiveDirectoryStatus()
        {
            Action  = ActionType.AddToGroup,
            Status  = AdStatusType.Success,
            Message = "Success",
        };

        try
        {
            switch (obj.Type)
            {
            case AdObjectType.User:
                AdUser user = (AdUser)obj;
                if (user.Groups != null)
                {
                    foreach (string userGroup in user.Groups)
                    {
                        try
                        {
                            roleManager.CanPerformActionOrException(requestUser, ActionType.AddToGroup, userGroup);
                            DirectoryServices.AddUserToGroup(user.Identity, userGroup, isDryRun);
                            String userMessage = $"{obj.Type} [{user.Identity}] Added To Group [{userGroup}].";
                            OnLogMessage("ProcessGroupAdd", userMessage);
                            status.Message = userMessage;
                            result.Statuses.Add(new ActiveDirectoryStatus(status));
                        }
                        catch (AdException ldeUserEx)
                        {
                            ProcessActiveDirectoryException(result, ldeUserEx, status.Action);
                        }
                    }
                }
                break;

            case AdObjectType.Group:
                AdGroup group = (AdGroup)obj;
                if (group.Groups != null)
                {
                    foreach (string groupGroup in group.Groups)
                    {
                        try
                        {
                            roleManager.CanPerformActionOrException(requestUser, ActionType.AddToGroup, groupGroup);
                            DirectoryServices.AddGroupToGroup(group.Identity, groupGroup, isDryRun);
                            String groupMessage = $"{obj.Type} [{group.Identity}] Added To Group [{groupGroup}].";
                            OnLogMessage("ProcessGroupAdd", groupMessage);
                            status.Message = groupMessage;
                            result.Statuses.Add(new ActiveDirectoryStatus(status));
                        }
                        catch (AdException ldeGroupEx)
                        {
                            ProcessActiveDirectoryException(result, ldeGroupEx, status.Action);
                        }
                    }
                }
                break;

            default:
                throw new AdException("Action [" + config.Action + "] Not Implemented For Type [" + obj.Type + "]", AdStatusType.NotSupported);
            }

            if (returnObject)
            {
                GetObject(result, obj, true, false);
            }
        }
        catch (AdException ex)
        {
            ProcessActiveDirectoryException(result, ex, status.Action);
        }
        catch (Exception e)
        {
            OnLogMessage("ProcessGroupAdd", e.Message);
            OnLogMessage("ProcessGroupAdd", e.StackTrace);
            AdException le = new AdException(e);
            ProcessActiveDirectoryException(result, le, status.Action);
        }
    }