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_AddNonExistantGroupToGroup()
        {
            // Get Group That Does Not Exist
            String groupName = $"testgroup_{Utility.GenerateToken( 8 )}";
            String groupDistinguishedName = $"OU={groupName},{workspaceName}";

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

            Console.WriteLine($"Exception Message : {ex.Message}");
            Assert.That(ex.Message, Contains.Substring("cannot be found"));
        }
        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 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);
        }
    }