Zum Inhalt springen
  • 0

Problem Powershell: Benutzer per Mail über Kennwortablauf benachrichtigen


Frage

Geschrieben

Hallo Leute,

da es nun schon das zweite Mal seit Einführung unserer neuen Kennwortrichtlinie (sprich, jedes mal seit Einführung einer Kennwortrichtlinie) der Fall ist, dass die User das Ballondings mit der Aufforderung zu Ändern des Kennwortes übersehen, wollte ich dagegen etwas tun.

Über GPO die Anzeigedauer des Ballons hoch setzten geht zwar, ist aber unelegant, da es sämtliche Ballons betreffen würde. Deswegen hab ich dieses Powershell Script ein wenig modifiziert.

Allerdings bekomme ich es nicht zum Laufen. Das bedeutet ich kann es ausführen und bekomme keine Fehlermeldung, aber es passiert nichts. Auch wenn ich den Wert in if ($display -lt 14 -and $display -gt 0) von 14 auf 85 setze. Spätestens da müsste mein Testuser eine Nachricht bekommen. tut er aber nicht. send-mailmessage mit der Adresse funktioniert aber. Ich habe eher das Gefühl, dass mir die Werte nicht in die Variablen geschrieben werden, aber ich verstehe nicht warum.

 

Import-Module ActiveDirectory


Get-ADUser -filter  {(Enabled -eq $True) -and (PasswordNeverExpires -eq $False)} -properties PasswordLastSet,EmailAddress,GivenName,Surname -SearchBase OU=Test,OU=Benutzer,DC=Domain,DC=local -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 14 -and $display -gt 0)
		{
			$MyText = @"
			Sehr geehrte/r $UserName $SurName,

			Ihr Kennwort wird in $display Tagen ablaufen. Bitte denken Sie daran das Kennwort rechtzeitig zu ändern!

			Mit freundlichen Grüßen,
			Die IT

			"@
			send-mailmessage -to $_.EmailAddress -from kennwortwarnung@domain.local -Subject "Achtung! Ihr Kennwort läuft in $display Tagen ab" -body $MyText  -smtpserver smtp.domain.local
		}
	}
}

9 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
Geschrieben

Heureka.

Import-Module ActiveDirectory

# Filtern nach Accounts die aktiv sind und deren Kennwort ablaufen kann
# Auslesen der benötigtn Attribute aus dem AD
# ForEach Cmdlet, nicht die Schleife!
Get-ADUser -filter  {(Enabled -eq $True) -and (PasswordNeverExpires -eq $False)} -properties PasswordLastSet,EmailAddress,GivenName,Surname -SearchBase “OU=Test,DC=contoso,DC=local” -SearchScope Subtree | ForEach {
	
	# Ablaufdatum = Zeitpunkt des letzten Passwordänderung - Maximales Passwortalter
	$ExpiryDate=$_.PasswordLastSet + (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge
		
	# Aktuelles Datum abholen
	$today=get-date
	
	# Restliche Laufzeit = Ablaufdatum (als Datum) - Heutiges Datum (als Datum)
	$DaysLeft=$ExpiryDate - $today
			
	# Setzen der Variablen, die im Mailtext verwendet werden
	# Übrige Tage als Anzahl Tage (.days)
	$display=$daysleft.days
	$UserName=$_.GivenName
	$SurName=$_.Surname
	
		#Wenn Anzahl verbliebener Tage <14
		if ($display -lt 14)
			{
			#Nachrichtentext als Here-String @"..."@ abspeichern 
			$MyVariable = @"
			Sehr geehrte/r $UserName $SurName,
			
			Ihr Kennwort wird in $display Tagen ablaufen. Bitte denken Sie daran das Kennwort rechtzeitig zu ändern!
			
			Um das Kennwort zu ändern, drücken Sie bitte "STRG + ALT + ENTF" und wählen SIe die Option  "Kennwort ändern"
			
			Mit freundlichen Grüßen,
			
			Eure IT
"@

			# Nachricht verschicken
			send-mailmessage -to $_.EmailAddress -from Kennwortwarnung@contoso.local -Subject "Achtung! Ihr Kennwort läuft in $display Tagen ab" -body $MyVariable  -smtpserver mail.contoso.local -encoding ([System.Text.Encoding]::UTF8)
		}
}	

$DaysLeft=$ExpiryDate.day - $Today.day liefert mir zwar Werte, aber Kauderwelsch zurück, da mit .day der Tag des Monats abgefragt wird.

So wie oben funktioniert es nun. Einziger Schönheitsfehler: Im Mailbody werden die Leerzeilen nicht mit übergeben der Text schaut also etwas gequetscht aus.

 

  • 1
Geschrieben
vor 13 Minuten schrieb Tiro:

Jeder 0815-Domänen-User darf AD-Abfragen machen. Und es ist erstaunlich wie viel man abfragen darf. ;-)

Da hast du recht! Meine Frage war nur zu Sicherheit. Wer weiß unter welchem Account das Skript ausgeführt wird.

Das Skript von dir, Tiro, enthält einen Haken beim Datum.

$today=get-date -uformat %j 

Bewirkt, dass in der Variable der Tag des Jahres gespeichert wird. Heute ist. z.B. Tag 81 des Jahres 2016. Wenn du diese Werte denn von deinem Ablaufdatum abziehst, dann kann es vorkommen, dass eine negative Zahl raus kommt. z.B wenn das Passwort gestern bereits abgelaufen ist und damit schlägt deine Bedingung fehl. Ich würde einfach direkt mit den Datums-Objekten rechnen.

Kurzes Beispiel: Ausgabe der Anzahl Tage bis Heiligabend 2016

$a = get-date
$b = get-date -year 2016 -month 12 -day 24
write-host ($b-$a).Days

 

vor 15 Minuten schrieb Maniska:

Einziger Schönheitsfehler: Im Mailbody werden die Leerzeilen nicht mit übergeben der Text schaut also etwas gequetscht aus.
 

Sollte kein Problem darstellen. Über den Parameter "-BodyAsHtml" von send-mailmessage kannst du angeben, dass der Inhalt als html interpretiert werden soll und du kannst den Inhalt dann mit html formatieren.

mfg Hendrik232

 

  • 0
Geschrieben

Soche Ballons oder/und E-Mails werden schnell ignoriert. Outlook-Regel drauf und weg ist die E-Mail.

Wenn es im Logon gleich im Dialog n Tage vorher angeboten wird, halte ich für wirksamer.

Untested

  • 0
Geschrieben

Den Ballon kann man leicht übersehen, eine Mail muss man aktiv ignorieren/wegregeln. Wer das macht ignoriert auch eine Meldung im Logon Screen. Irgendwann mal ist gut mit Hilfestellung, denken müssen die User dann doch noch selbst.

Außerdem will ich wissen, wo ich den Fehler im Script habe :P deinen Link werde ich mir trotzdem gerne zu Gemüte führen.

  • 0
Geschrieben

Also: Ich habe den Link von allesweg jetzt mal getestet, in der verzweifelten Hoffnung so etwas wie Meldung die es damals bei XP gab zu bekommen...

Nope, ich bekomme *Trommelwirbel* einen Ballon!

Deckt sich mit dem was ich bis jetzt zum Thema ablaufende Kennwörter und Benachrichtigung in Erfahrung bringen konnte. Leider.

Es wäre also immer noch total toll wenn jemand sich des Scripts annehmen könnte :)

  • 0
Geschrieben (bearbeitet)

Auf den ersten Blick würde ich sagen, dass bei

$daysleft=$ExpiryDate-$today

nichts rechtes rauskommt. "get-date" gibt schließlich "Thursday, March 17, 2016 3:56:14 PM" zurück.
Vielleicht solltest Du mit "get-date -uformat %j" arbeiten?
 

Ich habe irgendwo eine fertige Lösung rumliegen.

Bearbeitet von Tiro
  • 0
Geschrieben

Ich habe das mal getestet und eine Fehlermeldung bekommen, die besagt, was Tiro sagt.

$DaysLeft=$ExpiryDate.day - $Today.day

ergab hingegen einen sinnvollen Wert.

Vielleicht hilft das weiter

  • 0
Geschrieben

Hallo,

wie ist denn die ExecutionPolicy gesetzt? Darf der Benutzer Skripte ausführen?
Darf der Benutzer die Informationen aus dem AD lesen?

Bei dem Datum sollte es in beiden Fällen ein Datumsobjekt sein. Wie die Ausgabe formatiert wird, sollte egal sein.

Geb die ganzen Variablen doch alle einfachmal aus oder schreibe sie in eine Textdatei, dann weisst du was Sache ist.

mfg Hendrik232

  • 0
Geschrieben
vor 22 Stunden schrieb hendrik232:

Darf der Benutzer die Informationen aus dem AD lesen

Jeder 0815-Domänen-User darf AD-Abfragen machen. Und es ist erstaunlich wie viel man abfragen darf. ;-)

Hallo Maniska,
ich habe heute etwas auf die Schnelle an Deinem Skript gebastelt. So wie es oben steht kommen "vogelwilde" Werte zurück. Daher habe ich ein paar Änderungen vorgenommen. Es sollten keine Fehler mehr dran sein. Mangels Mailserver in der Testumgebung konnte ich den korrekten Mailversand nicht prüfen.

Import-Module ActiveDirectory

$benutzer=Get-ADUser -filter {(Enabled -eq $True) -and (PasswordNeverExpires -eq $false)} -SearchBase "dc=mytest,dc=pri" -Properties DisplayName, msDS-UserPasswordExpiryTimeComputed, Mail | Where-Object {$_.DisplayName -ne $null} | Select-Object Mail, DisplayName,@{Name="ExpiryDate";Expression={([datetime]::fromfiletime($_."msDS-UserPasswordExpiryTimeComputed")).DateTime}}

foreach($item in $benutzer)

{
$today=get-date -uformat %j 
$daysleft = Get-date($item.ExpiryDate) -UFormat %j 
$daysleft1=($daysleft-$today)
if ($daysleft1 -lt '14' -and $daysleft1 -gt 0)
{
$MyText = "Sehr geehrte/r $item.DisplayName,
Ihr Kennwort wird in $display Tagen ablaufen. Bitte denken Sie daran das Kennwort rechtzeitig zu ändern!
Mit freundlichen Grüßen,
Die IT"

send-mailmessage -to $item.EmailAddress -from kennwortwarnung@mytest.pri -Subject "Achtung! Ihr Kennwort läuft in $daysleft1 Tagen ab" -body $MyText -smtpserver smtp.mytest.pri

}

}


 

Gast
Dieses Thema wurde nun für weitere Antworten gesperrt.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...