teutone
Goto Top

AD Password Reminder Mail

Hallo liebe Leute,

ich habe vor langer Zeit einmal ein Password Reminder Mail Script erstellt, welches nun nicht mehr so richtig will, wie es soll.

Anbei das Script:
Import-Module ActiveDirectory

Get-ADUser -filter * -properties PasswordLastSet,EmailAddress,GivenName,Surname -SearchBase “OU=Benutzer,OU=Nuernberg,DC=contoso,DC=com” -SearchScope Subtree |foreach {
 
 $PasswordSetDate=$_.PasswordLastSet
 $maxPasswordAgeTimeSpan = $null
 $maxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge

$today=get-date
 $ExpiryDate=$passwordSetDate + $maxPasswordAgeTimeSpan

$daysleft=$ExpiryDate-$today

$display=$daysleft.days
 $UserName=$_.GivenName
 $SurName=$_.Surname

if ($display -lt 25 -and $display -gt 0)
 {
 $MyVariable = @”
Sehr geehrte/r $UserName $Surname,

Ihr Kennwort wird in $display Tagen ablaufen. Bitte aendern Sie Ihr Kennwort zeitnah.

****Diese Nachricht wurde automatisch generiert. Bitte antworten Sie nicht darauf.

“@
send-mailmessage -to $_.emailaddress -from Support@23gmbh.de -Subject “IT Information: Ihr Kennwort wird in $display Tagen ablaufen.” -body $MyVariable  -smtpserver Server123
 }
 }
**
Das Script läuft einwandfrei, wenn ich in der letzten Zeile statt "$_.emailaddress" eine feste E-Mailadresse eines Empfängers eintrage. Ich bin einfach mittlerweile zu betriebsblind für das Script *duck und weg*.

Ich brauche in jedem Fall dort dynamisch die Empfängermailadresse aus der AD.

Was mache ich falsch, bzw. wie muss diese Zeile korrekt aussehen?

Die Fehlermeldung lautet wie folgt:
Send-MailMessage : Cannot validate argument on parameter 'To'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.  
At C:\Scripte\ITpassword.ps1:32 char:22
+ send-mailmessage -to $_.EmailAddress -from Support@23gmbh.de ...
+                      ~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Send-MailMessage], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.SendMailMessage**
Vielen Dank vorab für eure Unterstützung.

Content-ID: 392525

Url: https://administrator.de/contentid/392525

Ausgedruckt am: 25.11.2024 um 23:11 Uhr

erikro
erikro 13.11.2018 um 12:02:46 Uhr
Goto Top
Moin,

ist das nicht

$_.mail

hth

Erik
Teutone
Teutone 13.11.2018 um 13:07:21 Uhr
Goto Top
Hi,

leider funktioniert das Script so auch nicht... .

VG Teutone
erikro
erikro 13.11.2018 um 13:14:41 Uhr
Goto Top
Moin,

dann mach doch mal ein

get-aduser irgendeinuser | select *

um mal zu gucken, ob und wenn ja in welchem Attribut die Adresse eingepflegt ist.

Liebe Grüße

Erik
DerWoWusste
DerWoWusste 13.11.2018 um 13:47:41 Uhr
Goto Top
Moin.

Das Skript funktioniert, sobald bei Deinen AD-Objekten das Attribut "Mail", welches auch auf der Haupteigenschaftsseite als "E-Mailadresse" auftaucht, korrekt gesetzt ist.
137808
137808 13.11.2018 aktualisiert um 14:13:23 Uhr
Goto Top
Always check the contents of your variables first, before using them! Besides this, your script also doesn't take into account that a user could be under the control of a PSO (password settings object) and thus can have a different max. password age! Common error that most unaware users do not respect with their reminders.

Best regards.
Teutone
Teutone 13.11.2018 um 14:58:58 Uhr
Goto Top
Hallo,

ich habe mal folgenden Befehl auf meine Mailadresse abgesetzt:

Get-ADUser -Filter {EmailAddress -like "*@*"} -Properties

und ich sehe nun alle Eigenschaften zu meinem Account.
Unter anderem gibt es dort die "EmailAddress", die auch gepflegt ist.

Und wie geht es nun weiter?

Gruß Teutone
DerWoWusste
DerWoWusste 13.11.2018 aktualisiert um 15:06:32 Uhr
Goto Top
Auf mindestens einem Account wird die Adresse nicht eingepflegt sein - und das gibt dir den Fehler.

Teste folgendes: erzeuge eine Test-OU "Test" als unterOU deiner User-OU. Füge da deinen eigenen oder einen Testuser ein und änder Zeile 3 auf
“OU=Test,OU=Benutzer,OU=Nuernberg,DC=contoso,DC=com” -SearchScope Subtree |foreach {

Passe natürlich auch
if ($display -lt 25 -and $display -gt 0)
so an, dass hinter lt eine Zahl steht, die die Tage bis zur Änderung deines eigenen Kennwortes überschreitet.
erikro
erikro 13.11.2018 um 15:31:03 Uhr
Goto Top
Moin,

so geht's:

$users = Get-ADUser -filter * -properties PasswordLastSet,mail,GivenName,Surname -SearchBase OU=Benutzer,OU=Nuernberg,DC=contoso,DC=com” -SearchScope Subtree 

foreach($user in $users) {

$PasswordSetDate=$_.PasswordLastSet
$maxPasswordAgeTimeSpan = $null
$maxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge

$today=get-date
$ExpiryDate=$passwordSetDate + $maxPasswordAgeTimeSpan

$daysleft=$ExpiryDate-$today

$display=$daysleft.days
$UserName=$user.GivenName
$SurName=$user.Surname

if ($display -lt 25 -and $display -gt 0) {
$MyVariable = @”
Sehr geehrte/r $UserName $Surname,

Ihr Kennwort wird in $display Tagen ablaufen. Bitte aendern Sie Ihr Kennwort zeitnah.

Diese Nachricht wurde automatisch generiert. Bitte antworten Sie nicht darauf.

“@
send-mailmessage -to $user.mail -from Support@23gmbh.de -Subject “IT Information: Ihr Kennwort wird in $display Tagen ablaufen.” -body $MyVariable -smtpserver Server123
}
}

hth

Erik
Teutone
Teutone 14.11.2018 um 10:27:16 Uhr
Goto Top
Vielen Dank für eure zahlreichen Beiträge.

Durch Erik und DerWoWusste habe ich das Script nun wieder zum Leben erweckt.

Ich habe noch eine Kleinigkeit entdeckt. Umlaute mag das Script nicht. Diese werden in dem Fließtext der Informationsmail als "?" dargestellt.

Gibt es da auch was von Ratiopharm? ^^

Vielen Dank.

Grüße Teutone
137808
137808 14.11.2018 aktualisiert um 10:32:54 Uhr
Goto Top
Set the -Encoding Parameter for Send-Mailmessage to UTF8.
Teutone
Teutone 22.11.2018 um 11:16:38 Uhr
Goto Top
Hi,

thanks for your post. With the parameter

$PSDefaultParameterValues['*:Encoding'] = 'utf8'


i completed the script and it runs perfect.

Thanks to all for your support face-smile.

Greetings Teutone