Hello everybody,
I encounter a little problem with a script using the Net-LDAP module. I
post here because I believe Net-LDAP is the root of this annoyance,
although I could be wrong of course. I've probably made a mistake so
your help may be very useful ;).
Here's more details :
- script's goal : connection to a list of AD's servers to extract
the 'lastLogon' attribute of all users
- problem : script is sometime hanging so I must kill it, frequency
and server are unpredictables.
- context : the following script is running under Windows with
ActivePerl 5.8.8.822, using Net-LDAP 0.34 provided by ActivePerl itself.
This is mandatory, no possibility to test or use under a Linux distribution.
- others usefuls informations : problem occurs under Windows 2000
SP4 and Server 2003. However, I noticed problem appears a lot more under
Windows 2000 than under Server 2003
What I've tried and noticed :
- tried Net-LDAP 0.35 : no change
- perl's CPU usage when problem occurs : 0%. It seems to wait for
something...
- 'netstat' command always shows connection to AD's server is
established when it's hanging.
- 'netstat' has allowed me to see it's not a particular server
which is causing this trouble.
Here's my source sample :
eval {
my ($page,$flag,$ldap);
$page = Net::LDAP::Control::Paged->new( size => 1000 );
$flag = 1;
# 1- connection
$ldap = Net::LDAP->new( $serveur,
scheme => 'ldap',
timeout => 5,
onerror => 'die',
version => 3,
port => 389,
debug => 0 );
if ( ! defined($ldap) ) { die("connection to server failed\n"); }
$ldap->bind( [EMAIL PROTECTED],
password => XXXX
);
# 2- treatment
while( $flag ) {
my ($request,$cookie,$resp);
$request = $ldap->search( base => 'DC=ADOUEST,DC=EDF,DC=FR'
scope => 'sub',
deref => 'never',
sizelimit => 0,
timelimit => 300,
typesonly => 0,
filter => '(&
(objectclass=top)(objectclass=person)(objectclass=organizationalPerson)(objectclass=user)(!
(objectclass=computer) ))',
attrs => [ 'lastLogon' ],
control => [ $page ]
);
foreach my $entry ( \($request->entries()) ) {
my $dn;
# DN
$dn = $$entry->dn();
if ( defined($user{$dn}) && $$entry->exists('lastLogon') ) {
my $date =
&ConvertTime($$entry->get_value('lastLogon', alloptions => 0, asref =>
0));
if ( defined($user{$dn}{'lastLogon'}) ) {
if ( $user{$dn}{'lastLogon'} < $date ) {
$user{$dn}{'lastLogon'} = $date; }
} else {
$user{$dn}{'lastLogon'} = $date;
}
}
}
($resp) = $request->control(LDAP_CONTROL_PAGED);
$cookie = $resp->cookie() or $flag = 0;
$page->cookie($cookie);
}
# 3- end
die('success');
};
if ( $@ ) {
print 'status : ' . $@ . "\n";
# deconnection
if ( defined($ldap) ) {
eval {
$ldap->unbind();
$ldap->disconnect();
};
}
}
}
Las note : i remarked this on Net::LDAP::Paged doc page :
if ($cookie) {
# We had an abnormal exit, so let the server know we do not want any more
$page->cookie($cookie);
$page->size(0);
$ldap->search( @args );
}
was added just after the loop. I judged this unnecessary because I'm using the
'die' method on error. But I may be wrong...
Anyway, any help would be greatly appreciated.
Thanks.
Mickaƫl