# ------------------------------------------------------------------ # Loaded Modules # ------------------------------------------------------------------ use strict; use warnings; #no warnings 'uninitialized'; use Net::LDAP; use Net::LDAP; use Date::Manip; use Email::Simple (); use Email::Sender::Simple qw(sendmail); use Email::Sender::Transport::SMTP (); use Email::Simple::Creator (); # ------------------------------------------------------------------ # smtp parameters # ------------------------------------------------------------------ my $smtpserver = 'smtp-srv'; my $smtpport = 25; my $transport = Email::Sender::Transport::SMTP->new({ host => $smtpserver, port => $smtpport, }); # ------------------------------------------------------------------ # Email send from Adress # ------------------------------------------------------------------ my $sender_adr = "bodo.bachlein\@foobar.com"; # ------------------------------------------------------------------ # ldap parameters # ------------------------------------------------------------------ my $ldap_srv = 'server'; my $ldap_usr = 'CN=manager,OU=User,OU=DE,DC=foo,DC=com'; my $ldap_pwd = 'ist geheim'; my $ldap_base_dir = 'dc=foo,dc=com'; # ------------------------------------------------------------------ # connect to ldap # ------------------------------------------------------------------ my $ldap = Net::LDAP->new( $ldap_srv ) or die "$@"; my $mesg = $ldap->bind( $ldap_usr, password => $ldap_pwd ); die $mesg->error if $mesg->code; # ------------------------------------------------------------------ # search LDAP database # ------------------------------------------------------------------ $mesg = $ldap->search( base=>$ldap_base_dir, filter => '(userAccountControl:1.2.840.113556.1.4.803:=512)'); # nur Benutzer $mesg->code && die $mesg->error; my @entries = $mesg->entries; my %email_by_dn; foreach my $entry (@entries) { my $dn = $entry->dn(); # Hinweis: der DN wird nicht mit get_value ermittelt my $mail = $entry->get_value('mail'); $email_by_dn{$dn}=$mail; } foreach my $entry (@entries) { my $samACC = $entry->get_value('samAccountName'); my $name = $entry->get_value('name'); my $descr = $entry->get_value('description'); my $mail = $entry->get_value('mail'); my $expired = readable_date($entry->get_value('accountExpires')); my $dn = $entry->dn(); my $manager = $entry->get_value('manager'); my $mgmt_mail = $email_by_dn{$manager}; &check_data($samACC, $name, $mail, $expired, $manager, $descr, $mgmt_mail); } # ------------------------------------------------------------------ # Process data and send Email # ------------------------------------------------------------------ sub check_data{ my $date = ParseDate("today"); my $newdate = DateCalc(ParseDate($_[3]), ParseDateDelta('- 2 days')); if ($newdate eq $date) { foreach my $contact ($_[4]){ my $email = Email::Simple->create( header => [ To => $_[6], From => $sender_adr, Subject => 'Benutzer Konto läuft ab - Bitte Verlängern', ], body => " Sehr geehrte Damen und Herren, das folgende Benutzerkonto läuft zum $_[3] ab: User ID: $_[0] Vorname / Name: $_[1] Description: $_[5] Sofern dieser Zugang weiterhin benötigt wird, ist diese bitte mittels Auftrag zu verlängern. DB Richtlinie zur Verlängerung von Benutzer Konten: Benutzer Konten für externe Mitarbeiter und Fremdfirmen haben eine Gültigkeit von maximal 6 Monaten. Wird der Account nicht Verlängert, ist der Zugang mit Ablauf der Gültigkeit zu TRZ Systemen gesperrt. Bitte antworten Sie nicht auf diese Nachricht, da sie automatisch von einem Postfach generiert wurde. Mit freundlichen Grüßen Abteilung xy Straße 99 12345 dawo sendmail($email, { transport => $transport }); } } } # ------------------------------------------------------------------ # disconnect from ldap # ------------------------------------------------------------------ $mesg = $ldap->unbind; # take down session # ------------------------------------------------------------------ # convert none readable date/time format to readable format # ------------------------------------------------------------------ sub readable_date { my $wintime = shift; my $unix_epoch = win_to_unix_epoch($wintime); my ($year, $month, $day,) = (localtime $unix_epoch)[5,4,3,2,1,0]; $year += 1900; $month += 1; ($month, $day) = map { sprintf '%02d', $_ } $month, $day; my $LastLogin = join('-', $year, $month, $day); } sub win_to_unix_epoch { # Actually hundreths of nanoseconds at this point... my $nanoseconds = shift; # Get seconds my $seconds = $nanoseconds / 10_000_000; # This magic number is the difference between Unix and Windows epoch. my $unix_epoch = $seconds - 11644473600; # Return the Unix epoch for use with localtime(). return $unix_epoch; }