use strict; use warnings; use Carp qw(croak); use Net::LDAP::LDIF; my ($fads, $fadam, $fout) = @ARGV; my $Ads = read2hash($fads, 'sAMAccountName'); # strukturiert einlesen, siehe unten my $Adam = read2hash($fadam, 'cn'); # Da dn kein Attribute ist -> cn # Wenn nun der sAMAccountName eines User-Objektes(in dem Fall "muetz") # aus der ADS im ADAM File nicht zu finden ist, my @missing = grep { !defined $Adam->{lc $_} } keys %{$Ads}; my $targetOU = 'OU=BEREICH1,DC=wurstfabrik,DC=DE'; my $out = Net::LDAP::LDIF->new ($fout, 'w', 'die'); foreach my $misskey (@missing) { my $ads = $Ads->{$misskey}; # Net::LDAP::Entry-Objekt my $neu = Net::LDAP::Entry->new(); $neu->dn ("CN=$misskey,$targetOU"); #$neu->add (objClass => [qw/top person organizationalPerson user/]); foreach my $att (qw/sn givenName company mail/) { # Zu übernehmende Attribute my $val = $ads->get_value($att); $neu->add ($att, $val) if length $val; } $out->write_entry ($neu); } $out->done(); sub read2hash { my $file = shift; # Eingabe: Dateiname my $keyname = shift; # Schlüssel für Referenzierung: 'sAMAccountName' oder 'cn' my %hash; # Ausgabe: (Ref auf) Hash my $n = 0; my $ldif = Net::LDAP::LDIF->new ($file, 'r', 'die'); while(not $ldif->eof ()) { my $entry = $ldif->read_entry (); $n++; if ($ldif->error ()) { print STDERR "Error msg: ", $ldif->error (), "\n"; print STDERR "Error lines:\n", $ldif->error_lines (), "\n"; die "\n"; } else { my $key = $entry->get_value ($keyname); croak "Schluessel ($keyname) nicht vorhanden in Satz $n" unless $key; $hash{lc $key} = $entry; # Net::LDAP:Entry-Objekt unter dem # (klein geschriebenen ) Schlüssel speichern } } return wantarray ? %hash : \%hash; }