Thread LDAP Daten Auslesen und weiter Verarbeiten (24 answers)
Opened by Rambo at 2018-08-08 09:02

Rambo
 2018-08-15 15:07
#188798 #188798
User since
2003-08-14
803 Artikel
BenutzerIn

user image
2018-08-14T19:48:40 thomas38
Hallo Rambo,

die E-Mail-Adressen _aller_ Benutzer müssen zuerst komplett ermittelt werden.
Deshalb der Hash '%email_by_dn', der in der ersten foreach-Schleife komplett befüllt wird.
In der 2. foreach-Schleife werden daraus nur die Werte gelesen.


Salue Thomas38,
ich verstehe nicht wirklich warum man 2 Durchläufe benötgit um die Email Adr. heraus zu bekommen. Er hat ja in meinen Versuchen ca. 50% der Infos ausgespuckt :-)
Aber wie dem auch sei, ich habe den Code entsprechend deinen Infos angepasst und bekomme nun für alle User die es betrifft die entspechenden Infos.

Hab ganz herzlichen Dank für Deine Hilfe und sorry falls ich etwas nervend war mit meinen Fragen.

Hier nun der neue (vorerst) entgültige Code inkl. Mail versand, evtl. benötigt jemand soetwas mal:
Code: (dl )
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;
}



Herzlichen Dank an alle!
VG R.

View full thread LDAP Daten Auslesen und weiter Verarbeiten