Поиск LDAP - Bad Filter - PullRequest
       29

Поиск LDAP - Bad Filter

0 голосов
/ 23 марта 2012

Итак, я пытаюсь найти LDAP для заполнения файла CSV.Идентификаторы пользователя получаются путем анализа текстового файла.Я хочу найти в LDAP идентификатор пользователя (mailNickname), FName (данное имя), LName (sn), "OU", pwdLastSet.Как использовать фильтр в поиске, потому что я получаю ошибку «плохой фильтр».

Спасибо за вашу помощь.

    #!/usr/bin/perl
use xSV;
use Net::LDAP;
use Term::ReadKey;
# use strict;

$debug_on = 1;  # This will enable some debugging messages.

if (defined($ARGV[0])) {
    $input = $ARGV[0];
} else {
    print "No input file specified!  Assuming MKSGroupsoutput.txt...\n";
    $input = "MKSGroupsoutput.txt";
}

if (defined($ARGV[1])) { 
    $output = $ARGV[1];
} else {
    $output = $input . ".csv";
}

open GROUPS, "< $input" or die "ERROR: Can't open input file: '$input'\n";

print "INPUT: $input\nOUTPUT: $output\n";

sub debug {
    if ($debug_on == 1) {
        print "@_";
    }
}

my $csv = Text::xSV->new(
    filename => $output,
    header   => [
    "AccountName", 
    "LastName", 
    "FirstName", 
    "EEID", 
    "SYSGenericAcct", 
    "Notes", 
    "AccessLevel", 
    "AccessCapability", 
    "Owner/Manager",
    "Description", 
    "Created", 
    "Status", 
    "LastStatusChange", 
    "LastPwdChange", 
    "DataSource"
    ],
  );
$csv->print_header();

my ($inputname, $fname, $lname, @name, $uname, $pwordinput, $pword, $domain, $line, $ldap, $bindstring, $root, $pword, $base_dn);
#User driven input to connect to LDAP.  ReadMode 2 keeps password hidden, the reset back to 0.
print "Please enter your Full Name: ";
$inputname = <STDIN>;
print "Please enter your password: ";
ReadMode 2;
$pwordinput = <STDIN>;
ReadMode 0;

#Builds the LDAP CN value from user input. Trims \n off user input values
$inputname = substr($inputname,0,-1);
@name = split(' ', $inputname);
$fname = ucfirst(@name[0]);
$lname = ucfirst(@name[1]);
$pword = substr($pwordinput,0,-1);
$uname = $lname ."\\, " . $fname;
$bindstring = "CN=" . $uname . ",OU=User,DC=hq,DC=name,DC=com";

#LDAP Connection parameters
$base_dn = "OU=User,DC=hq,DC=name,DC=com";
$ldap = Net::LDAP->new('ldap://local', onerror =>'die');
$ldap->bind($bindstring, password => $pword); #Sometimes the BIND fails (1 out of 10 times)
$root = $ldap->root_dse;

#Parses text file
while ($line = <GROUPS>) {
    chomp($line);
    if ($line =~ m/^  user  .*/) {
        $line =~ s/^  user.\s//;
        my ($searchoutput, $user, @entries, $entry, $href, $strDomain, $strUsername, $strDN, $arrSplitResponse, $strLName, $strFName, $strUserType);
        $user = $line;
        $user = "mailNickname: " . $user;
        $searchoutput = $ldap->search(filter=>$user,base=>$base_dn); # ERROR HERE
        @entries = $searchoutput->entries;
        foreach $entry ( @entries ) {
            print "DN: ", $entry->dn, "\n"; #NEVER ENTERS THIS LOOP
        }

1 Ответ

1 голос
/ 23 марта 2012

Почему вы удалили use strict;? Это должно быть всегда. То же самое с use warnings;. Это может помочь указать на некоторые ваши проблемы.

Я вижу, вы установили onerror, что может быть хорошо, если вы решили свои проблемы, но я рекомендую вам этого не делать, пока вы не решите все свои проблемы. Вместо этого перехватите выходные данные ваших методов LDAP:

my $ldap_message = $ldap->bind($bindstring, password => $pword);
die qq(LDAP Error Code: ) . $ldap_message->code if $ldap_message->code;

Это может помочь вам в отладке.


Хорошо, хватит тебя ругать. Приступим к вашей ошибке:

Если я помню свой Net::LDAP, поиск будет:

my $search_obj = ldap->search(base => $base, filter => $filter);

где $base - действительная база LDAP, а $filter - действительный запрос в синтаксисе LDAP.

Глядя на ваш код:

my $user = "mailNickname: " . $user;
my $searchoutput = $ldap->search(filter=>$user, base=>$base_dn); # ERROR HERE

Похоже, что ваш поисковый запрос mailNickName: david, если $user равно david. Это не правильный поиск LDAP. Должно быть

my $user = "(mailNickname=$user)"; #Equal sign. Parentheses might be unnecessary
my $searchoutput = $ldap->search(filter=>$user, base=>$base_dn);

Обратите внимание, я могу поместить имена переменных в кавычки. Это одна из вещей, которые мне нравятся в Perl. Делает код проще для чтения. Это может помочь. Снова перехватите выходные данные всех ваших методов LDAP и используйте метод code , чтобы выяснить причину вашей ошибки.

...