/// <summary>
        /// Retrieve listing of all roles to which a specified user belongs.
        /// </summary>
        /// <param name="username"></param>
        /// <returns>String array of roles</returns>
        public override String[] GetRolesForUser(String username)
        {
            // If SQL Caching is enabled, try to pull a cached value.
            if (_EnableSqlCache)
            {
                String CachedValue;
                CachedValue = GetCacheItem('U', username);
                if (CachedValue != "*NotCached")
                {
                    return(CachedValue.Split(','));
                }
            }

            ArrayList results = new ArrayList();

            using (PrincipalContext context = new PrincipalContext(ContextType.Domain, null, _DomainDN))
            {
                try
                {
                    UserPrincipal p      = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username);
                    var           groups = p.GetAuthorizationGroups();
                    foreach (GroupPrincipal group in groups)
                    {
                        if (!_GroupsToIgnore.Contains(group.SamAccountName))
                        {
                            if (_IsAdditiveGroupMode)
                            {
                                if (_GroupsToUse.Contains(group.SamAccountName))
                                {
                                    results.Add(group.SamAccountName);
                                }
                            }
                            else
                            {
                                results.Add(group.SamAccountName);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new ProviderException("Unable to query Active Directory.", ex);
                }
            }
            // If SQL Caching is enabled, send value to cache
            if (_EnableSqlCache)
            {
                SetCacheItem('U', username, ArrayListToCSString(results));
            }
            return(results.ToArray(typeof(String)) as String[]);
        }
        /// <summary>
        /// Retrieve listing of all users in a specified role.
        /// </summary>
        /// <param name="rolename">String array of users</param>
        /// <returns></returns>
        public override String[] GetUsersInRole(String rolename)
        {
            if (!RoleExists(rolename))
            {
                throw new ProviderException(String.Format("The role '{0}' was not found.", rolename));
            }
            // If SQL Caching is enabled, try to pull a cached value.
            if (_EnableSqlCache)
            {
                String CachedValue;
                CachedValue = GetCacheItem('R', rolename);
                if (CachedValue != "*NotCached")
                {
                    return(CachedValue.Split(','));
                }
            }
            ArrayList results = new ArrayList();

            using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "UNFCSD", _DomainDN))
            {
                try
                {
                    GroupPrincipal p     = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, rolename);
                    var            users = p.GetMembers(true);
                    foreach (UserPrincipal user in users)
                    {
                        if (!_UsersToIgnore.Contains(user.SamAccountName))
                        {
                            results.Add(user.SamAccountName);
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new ProviderException("Unable to query Active Directory.", ex);
                }
            }
            // If SQL Caching is enabled, send value to cache
            if (_EnableSqlCache)
            {
                SetCacheItem('R', rolename, ArrayListToCSString(results));
            }
            return(results.ToArray(typeof(String)) as String[]);
        }
        /// <summary>
        /// Retrieve listing of all roles.
        /// </summary>
        /// <returns>String array of roles</returns>
        public override string[] GetAllRoles()
        {
            // If SQL Caching is enabled, try to pull a cached value.
            if (_EnableSqlCache)
            {
                String CachedValue;
                CachedValue = GetCacheItem('L', "AllRoles");
                if (CachedValue != "*NotCached")
                {
                    return(CachedValue.Split(','));
                }
            }
            ArrayList results = new ArrayList();

            String[] roles = ADSearch(_ActiveDirectoryConnectionString, "(&(objectCategory=group)(|(groupType=-2147483646)(groupType=-2147483644)(groupType=-2147483640)))", "samAccountName");
            foreach (String strRole in roles)
            {
                if (!_GroupsToIgnore.Contains(strRole))
                {
                    if (_IsAdditiveGroupMode)
                    {
                        if (_GroupsToUse.Contains(strRole))
                        {
                            results.Add(strRole);
                        }
                    }
                    else
                    {
                        results.Add(strRole);
                    }
                }
            }
            // If SQL Caching is enabled, send value to cache
            if (_EnableSqlCache)
            {
                SetCacheItem('L', "AllRoles", ArrayListToCSString(results));
            }
            return(results.ToArray(typeof(String)) as String[]);
        }