2012-03-22 2 views
0

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

Благодарим за помощь.

#!/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

Почему вы удалить 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 и используйте метод , чтобы узнать, что вызывает вашу ошибку.

+0

Благодарим вас за разъяснение строгого положения. Включив это, я подумал, что это нарушает мою программу, я видел все проблемы с моим кодом. Теперь я могу подключиться к LDAP и правильно фильтровать. Однако в моем выходе я все равно получаю вывод Net :: LDAP :: Entry = HASH (0xe89dd4). Кстати, мой вывод, который я просматриваю, - это ход скрипта в командной строке. Как прекратить показ? – cquadrini

+0

Опять же, эта ошибка начала появляться: Пожалуйста, введите ваш пароль: Не удается вызвать метод «привязки» на неопределенное значение в ldaptest.pl линии 77, линии 2. Line 77 мой $ pwordinput = ; и он работал и просто остановился. Это как если бы зависает и не отвечает, когда я нажимаю «Enter». Почему это происходит, и как я могу это исправить? – cquadrini

+0

@cquadrini Я замечаю, что вы не 'chomp' ваш вход. Когда вы вводите STDIN, вы можете получить символ LF в конце строки. Вы можете сделать 'chomp (my $ password = )' или в двух строках. Вы можете поместить 'print qq (Password =" $ password ");' после ввода пароля, чтобы убедиться, что это так.'Qq()' подобен использованию двойных кавычек, но вы можете использовать двойные кавычки, не избегая их. Найдите 'qq' в [Perldocs] (http://perldoc.perl.org/perlop.html#Quote-Like-Operators). –