2012-03-22 30 views
0

したがって、LDAPを検索してCSVファイルに入力しようとしています。ユーザーIDは、テキストファイルを解析することによって取得されます。私はユーザーID(mailNickname)、FName(givenName)、LName(sn)、 "OU"、pwdLastSetのLDAPを検索したいと思います。 「不良フィルタ」エラーが発生し続けるため、検索のフィルタの態様を使用するにはどうすればよいですか。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 

$userdavidある場合は、検索クエリがmailNickName: 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 ライン77は私の$ pwordinput = です。それは働いていて、ただ止まった。あたかもが電話を切って、私が「Enter」を押したときに応答しないかのようです。なぜこのようなことが起こり、どのように修正するのですか? – cquadrini

+0

@cquadrini私は、あなたの入力を「chomp」しないことに気付きました。 STDINから入力すると、行末にLF文字が表示されている可能性があります。 'chomp(my $ password = )'や2行で​​行うことができます。パスワードを入力した後、 'print qq(Password =" $ password ");'を入力して、それがあなたの考えであるかどうかを確認することができます。'qq()'は二重引用符のようなものですが、二重引用符はエスケープする必要はありません。 [Perldocs](http://perldoc.perl.org/perlop.html#Quote-Like-Operators)の 'qq'を参照してください。 –

関連する問題