def walk_ldap_members(groups, dn, seen = [])
      groups.each do |g|
        members = ldap_members(g)
        return true if members.include? dn
        next if seen.include? g
        seen << g
        member_groups = members.collect do |mg|
          dn_to_cn(mg) if (mg.include?('OU=Groups') || mg.include?('OU=Applications'))
        end
        member_groups.compact!
        return true if walk_ldap_members(member_groups, dn, seen)
      end
      return false
    end
def walk_ldap_members(groups, dn, seen = [])
      groups.each do |g|
        members = ldap_members(g)
        return true if members.include? dn
        next if seen.include? g
        seen << g
        member_groups = members.collect do |mg|
          dn_to_cn(mg) if (mg.include?('OU=Groups') || mg.include?('OU=Applications'))
        end
        member_groups.compact!
        return true if walk_ldap_members(member_groups, dn, seen)
      end
      return false
    end
Searches a group and its nested member groups for a member DN
 @param [Array] groups CNs to search
 @param [String] dn the DN to search for
 @param [Array] seen groups that have already been traversed
 @return [Boolean] true if dn was seen in groups