Kennwort läuft ab Mail verschicken mit PowerShell - www.itnator.net

Du hast eine Frage?

Du haste eine ganz andere Frage? Diese kannst du in unseren Fragen & Antworten stellen.
Nach kurzer Zeit sollte eine brauchbare Antwort zu finden sein.


kostenlos einreichen
6

Kennwort läuft ab Mail verschicken mit PowerShell

In manchen ActiveDirectory Umgebungen ist es notwendig, dass Benutzer eine Mail erhalten, wenn ihr Passwort / Kennwort bald abläuft, da die Windows Benachrichtigungen nicht funktionieren. Wie man solche eine Kennwort läuft ab Mail versenden kann, mit einem einfachen PowerShell Script, seht ihr hier bei uns. 🙂

Kennwort läuft ab

raphaelsilva / Pixabay

 

Die Kennwort läuft ab Mail versenden

Da Benutzer nicht immer an Ihren Windows-Computer angemeldet sind, sondern in Web-Portalen, so kann es vorkommen, dass das Windows-Kennwort nicht früh genug geändert wird und somit kein Login mehr möglich ist. Abhilfe schafft hier ein PS-Script. Dies ist sehr simpel mit einem kleinen Powershell Script umzusetzen:

(passwordnotificationmail.ps1 – Powershell)

#################################################################################################################
# Requires: Windows PowerShell Module for Active Directory
##################################################################################################################
# Please Configure
$smtpServer="0.0.0.0." #IP mail server
$expireindays = 7 #days before reminding
$from = "Support <[email protected]>"
$logging = "Enabled" # Set to Disabled to Disable Logging
$logFile = "C:\mail.csv" # ie. c:\mylog.csv
$testing = "Enabled" # Set to Disabled to Email Users
$testRecipient = "[email protected]" # If Testing Is Enabled - Email Administrator ONLY
#
###################################################################################################################
# Check Logging Settings
if (($logging) -eq "Enabled")
{
# Test Log File Path
$logfilePath = (Test-Path $logFile)
if (($logFilePath) -ne "True")
{
# Create CSV File and Headers
New-Item $logfile -ItemType File
Add-Content $logfile "Date,Name,EmailAddress,DaystoExpire,ExpiresOn,Notified"
}
} # End Logging Check
# System Settings
$textEncoding = [System.Text.Encoding]::UTF8
$date = Get-Date -format ddMMyyyy
# End System Settings
# Get Users From AD who are Enabled, Passwords Expire and are Not Currently Expired
Import-Module ActiveDirectory
$users = get-aduser -filter * -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false }
$DefaultmaxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge
# Process Each User for Password Expiry
foreach ($user in $users)
{
$Name = $user.Name
$emailaddress = $user.emailaddress
$passwordSetDate = $user.PasswordLastSet
$PasswordPol = (Get-AduserResultantPasswordPolicy $user)
$sent = "" # Reset Sent Flag
# Check for Fine Grained Password
if (($PasswordPol) -ne $null)
{
$maxPasswordAge = ($PasswordPol).MaxPasswordAge
}
else
{
# No FGP set to Domain Default
$maxPasswordAge = $DefaultmaxPasswordAge
}
$expireson = $passwordsetdate + $maxPasswordAge
$today = (get-date)
$daystoexpire = (New-TimeSpan -Start $today -End $Expireson).Days
# Set Greeting based on Number of Days to Expiry.
# Check Number of Days to Expiry
$messageDays = $daystoexpire
if (($messageDays) -gt "1")
{
$messageDays = "in " + "$daystoexpire" + " Tagen"
}
else
{
$messageDays = "HEUTE"
}
# Email Subject Set Here
$subject="Ihr Kennwort läuft $messageDays ab."
# Email Body Set Here, Note You can use HTML, including Images.
$body ="
<p style=""font-family:'Segoe UI', Segoe UI;""> Hallo $name, <br><br>
Ihr Windows-Kennwort wird $messageDays ablaufen.<br>
Um Ihr Kennwort zu ändern, drücken Sie STRG-ALT-ENTF und wählen Sie 'Kennwort ändern'.<br><br>
Dein Support Team.<br>
(Bitte antworten Sie NICHT auf diese Email. Bei Fragen wenden Sie sich per Mail an <a href=""mailto:[email protected]"">[email protected]</a>)
</P>"
# If Testing Is Enabled - Email only Administrator
if (($testing) -eq "Enabled")
{
$emailaddress = $testRecipient
} # End Testing
# If a user has no email address listed
if (($emailaddress) -eq $null)
{
$emailaddress = $testRecipient
}# End No Valid Email
# Send Email Message
if (($daystoexpire -ge "0") -and ($daystoexpire -lt $expireindays))
{
$sent = "Yes"
# If Logging is Enabled Log Details
if (($logging) -eq "Enabled")
{
Add-Content $logfile "$date,$Name,$emailaddress,$daystoExpire,$expireson,$sent"
}
# Send Email Message
Send-Mailmessage -smtpServer $smtpServer -from $from -to $emailaddress -subject $subject -body $body -bodyasHTML -priority High -Encoding $textEncoding
} # End Send Message
else # Log Non Expiring Password
{
$sent = "No"
# If Logging is Enabled Log Details
if (($logging) -eq "Enabled")
{
Add-Content $logfile "$date,$Name,$emailaddress,$daystoExpire,$expireson,$sent"
}
}
} # End User Processing
# End

 

Folgende Zeilen müssen im Script angepasst werden, um die Mail zum Kennwort korrekt zu senden:

  • Zeile 4 – 12: Grundkonfiguration zum Mail – Server und Funktion
  • Zeile 76 – 86: Content / Text der E-Mail
mail senden

Pexels / Pixabay

 

Tipp

Diese Kennwort läuft ab Mail sollte dann nur noch 1x täglich per Aufgabenplanung ausgeführt werden. Wenn das Script nur wöchentlich ausgeführt wird, nützt es natürlich nichts 😉

Johannes Huber
 

In seiner Freizeit macht Johannes nichts lieber, als für ITnator Beiträge zu schreiben. Input bekommt er hierfür von Problemen in der IT Administration von Servern, Clients und vielen weiteren IT Komponenten.

  • Thomas sagt:

    Das Skript läuft leider nicht wenn ein anderer Port für SMTP genutzt wird.
    wie bekommt man den Port geändert wenn die Variable -Port nicht erkannt wird
    in der Zeile Send-Mailmessage ?

  • Rüdiger sagt:

    Hallo,

    tolle Sache!
    Eine Logrotation würde das Ganze jetzt noch perfekt machen ;=)

  • Schneider sagt:

    Hallo zusammen,

    wie kann hier noch eine OU einschränkung hinzugefügt werden?

    VG
    Schneider

    • Johannes Huber sagt:

      Guten Tag,

      In der Zeile 35 werden die AD-Benutzer ausgelesen.
      Dort muss nach “Get-ADUser” ein
      -SearchBase "OU=Abteilung1,OU=RootOU,DC=yourdomain,DC=com"
      angehängt werden.

      Die Zeile 35 wird also abgeändert auf:

      $users = get-aduser -SearchBase "OU=Abteilung1,OU=RootOU,DC=yourdomain,DC=com" -filter * -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false }

  • sidebar
    >