1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# ------------------------------------------------------------------
# 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;
}