German

E -Mail -Benutzer, wenn ihr Active Directory -Passwort in Kürze abgelaufen ist - der faule Administrator

464 23/11/2021

Verzeichnis

Benutzer-E-Mail-Adresse

E-Mail Format

SMTP

EPost schicken

Protokollierung

Anmeldeinformationen

Das Skript

In this article I will show you how PowerShell can automatically send an e-Post notification to end users whendasir Active Verzeichnis password is set to expire soon.Ich habe einige andere ähnliche Skripte auf TechNetz überprüft, aber schließlich eine von Grund auf neu geschrieben, um mehrere Funktionen zu integrieren, die ichbenötigte, und den Gesamtskriptfluss verbessert.

Einige der Anforderungen, die ich erfüllen musste, waren wie folgt:

Get users ePost addresses fromdas EPost Address value in Active Verzeichnis, if it’s empty look atdas default address indas proxyaddresses attribute

Senden Sie E-Mails an Benutzer mit Passwörtern, die innerhalb von 7 Tagen oder weniger ausgelaufen sind

Include directions users can follow to resetdasir Active Verzeichnis password

Senden Sie eine E-Mail mit hoher Priorität

Holen Sie sich eine E-Mail-Benachrichtigung, wenn Sie gesendet oder fehlgeschlagen sind

Speichern Sie den Anmeldeinformationen in einem Kreditobjekt, damit er sicher ist

Erweiterte Protokollierung des Skripts zur Fehlerbehebung

Senden Sie eine E-Mail von Office 365

Richten Sie das Skript als geplante Aufgabe ein

One ofdas key pieces I wanted was to checkdas users proxyaddresses attribute for a default e-Post address ifdas E-Post entry indas users Active Verzeichnis properties was empty.Viele Skripte, die ich online gefunden habe.In vielen Umgebungen habe ich gesehen. For Office 365, if you sync your Active Verzeichnis this is where it will getdas default e-Post address, and any other proxy addresses for Exchange.Das Skript findet den Standardwert, indem es sich ansieht, was sich im Proxyadresse -Attributbefindet und nach dem Wert mit einem Kapital „SMTP“ sucht.

In meiner E-Mail wollte ich den Benutzer zuerst mit seinem Namenbegrüßen.Dies ist nicht schwer, da wir nur so etwas wie ihren Anzeignamenwert an eine Variable übergeben und dies dem Körper hinzufügen müssen.Zweitens wollte ich die E-Mail mit hoher Bedeutung senden. Dies zeigt eine rote Ausrufezeichen neben der E-Mail.Das Thema der E -Mail würde dem Benutzer mitteilen, wie viele Tagebis sein Passwort abgelaufen sind, und schließlich, wenn der Benutzer unser IT -Team erreichen wollte.

Eine E-Mail-Benachrichtigung würde an die Send-Adresse zu einem Fehler oder Erfolg zurückgeschickt.Dies würde die tatsächliche E-Mail enthalten, die in einem Anhang an den Benutzer gesendet wurde, und das Thema der E-Mail.Wenn Sie über ein Passwortportal, ein On-Premise-Exchange oder das Office 365-Kennwort-Back verfügen.

Da mein Mailserver Office 365 ist, möchte ich Mail authentifiziert senden und SSL verwenden.Der Benutzer, mit dem ich mich gegen den SMTP-Server authentifiziert habe.Wenn das Skript ausgeführt wird, sucht es nach seinem Anmeldeinformationsobjekt. Wenn das Anmeldeinformationsobjekt nicht vorhanden ist, fordert es Sie nach Anmeldeinformationen auf (ist es ambesten, diese manuell zuerst einzugeben und die Anmeldeinformationen zu speichern,bevor es als geplante Aufgabe eingerichtet wird).. As we see indas Get-Anmeldeinformationen message it reminds you that this account mustbedas sender, or have proper permissions.

EPost schicken

Es gibt zwei Möglichkeiten, wie Sie Post mit PowerShell senden können.Sie können das System verwenden.Netzz.E-Mail-Namespace oder verwenden Sie das SEND-E-MailMessage CMDLet.Wenn Sie dies als geplante Aufgabe einrichten möchten, empfehle ich die Verwendung des Systems.Netzz.Mail-Namespace (den ich im Skript verwende), da Sie auf Probleme stoßen, die versuchen, per E-Mail-Message unbeaufsichtigt zu verwenden.

Indas scriptblockbelow I am callingdas Namespace, settingdas From, SMTP Host, SSL, Anmeldeinformationens, Zu, Subject, Delivery Notifications, Priority and Body.

$ SMTPCLIENT = New-Object System.Netz.Post.SMTPClient $ MailMessage = New-Object System.Netz.Post.Postmessage#Who isdas e-Post sent from$Postmessage.From = $FromEPost#SMTP server to send ePost$SmtpClient.Host = $ SMTPHOST#SMTP SSL $ SMTPCLISSE.Enablessl = $ true#SMTP -Anmeldeinformationen $ SMTPCLISSE.Anmeldeinformationens = $cred#Send e-Post todas users ePost$Postmessage.Zu.add("$ePostaddress")#EPost subject$Postmessage.Subject = "Your password will expire $daystoexpire days"#Notification ePost on delivery / failure$MailMessage.DeliveryNotificationOptions = ("onSuccess", "onFailure")#Send e-Post with high priority$MailMessage.Priority = "High"$Postmessage.Körper =...

Mit Schreibhost und Versuch/Fangenblöcken kann ich jeden Schritt des Skripts und alle ausgeführten Fehler protokollieren.Das Protokoll wird an demselben $ -Regel -Ort gespeichert, den ichbei C: \ Automatisierung \ passwordexpiry festgelegt habe.In diesem Ordner wird das Protokoll sowie das Anmeldeinformationsobjekt gespeichert.Hier ist meine Protokolldatei:

Wenn Sie das Skript manuell ausführen, zeigt die Shell auch den Fortschritt an Sie an.

Das Skript speichert Ihre Office 365 / Authentifizierungsanmeldeinformationen mithilfe des Export-ClixML-CMDLet.Dies ermöglicht es uns, das gesamte System zu speichern.Management.Automatisierung.PSAnmeldeinformationen Object as an XML file.das

Export-clixml

cmdlet encrypts credential objects usingdas Windows standard Data Protection API.Es ist immer ambesten, Anmeldeinformationen eines Benutzers ohne administrative Rollen in Ihrer Office 365 / Mail -Umgebung zu speichern.

#VARS#SMTP HOST $ SMTPHOST = "SMTP.Büro 365.com"#Who isdas e-Post from$FromEPost = "

[ePost protected]

"#Password expiry days$expireindays = 7#Program File Path$DirPath = "C:\Automatisierung\PasswordExpiry"$Date = Get-Date#Check if program dir is present$DirPathCheck = Test-Path -Path $DirPathIf (!($DirPathCheck)){Try{#If not presentdasn createdas dirNew-Item -ItemType Verzeichnis $DirPath -Force}Catch{$_ | Out-File ($DirPath + "\" + "Log.txt") -Append}}#CredObj path$CredObj = ($DirPath + "\" + "EPostExpiry.Cred ")#prüfen, ob CredObj $ credobjcheck = testpath -path $ credobjif (! ($ credobjcheck)) {" $ Datum -Info: CREUTOR -Objekt erstellen "| Out -file ($ dirpath +" \ " +"Protokoll.txt") -Append#If not present get office 365 cred to save and store$Anmeldeinformationen = Get-Anmeldeinformationen -Message "Please enter your Office 365 credential that you will use to send e-Post from $FromEPost. If you are not usingdas account $FromEPost make sure this account has 'Send As' rights on $FromEPost."#Export cred obj$Anmeldeinformationen | Export-clixml -Path $CredObj}Write-Host "Importing Cred object..."-ForegroundColor Yellow $ cred = (import -clixml -Path $ credobj)# Nehmen Sie Benutzer aus der Anzeige ab, die aktiviert sind, Passwörter ausfallen und derzeit nicht abgelaufen sind" $ Datum -Info: Admodul importieren "| Out -file ($ Dirpath +"\" + "" Log.txt") -AppendImport-Module ActiveVerzeichnis"$Date - INFO: Getting users" | Out-File ($DirPath + "\" + "Log.txt") -Append$users = Get-Aduser -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EPostAddress -filter { (Enabled -eq 'True') -and (PasswordNeverExpires -eq 'False') } | Where-Object { $_.Passwordexpired -eq $ false} $ maxPasswordage = (Get -AddefaultDomainPasswordPolicy).MaxPasswordage# Verarbeiten Sie jeden Benutzer für Kennwort für expiryforeach ($ Benutzer in $ user) {$ name = (Get-Aduser $ user | foreach-Object {$ _.Name}) Schreibhost "Arbeiten auf $ name..." -ForegroundColor WhiteWrite-Host "Getting e-Post address for $Name..." -ForegroundColor Yellow$ePostaddress = $user.ePostaddressIf (!($ePostaddress)){Write-Host "$Name has no E-Mail address listed, looking atdasir proxyaddresses attribute..." -ForegroundColor RedTry{$ePostaddress = (Get-ADUser $user -Properties proxyaddresses | Select-Object -ExpandProperty proxyaddresses | Where-Object { $_ -cmatch '^SMTP' }).Trim ("SMTP:")} catch {$ _ |Out-File ($ Dirpath + "\" + "" Protokoll.txt") -Append}If (!($ePostaddress)){Write-Host "$Name has no ePost addresses to send an e-Post to!" -ForegroundColor Red#Don't continue on as we can't ePost $Null,but ifdasre is an e-Post found it will ePost that address"$Date - WARNING: No ePost found for $Name" | Out-File ($DirPath + "\" + "Log.txt ") -Append}}#Kennwort abrufen Letztes Datum $ PasswordsetDate = (Get -Aduser $ user -Properties * | foreach -Object {$ _.PasswordLastset})#prüfen Sie, ob feinkörnige Passwörter $ passwordpol = (Get -AduserresultantPasswordPolicy $ Benutzer) if (($ passwordpol) -ne $ null) {$ maxpasswordage = ($ passwordpol).MaxPasswordAge}$expireson = $passwordsetdate + $maxPasswordAge$today = (get-date)#Getsdas count on how many days untildas password expires and stores it indas $daystoexpire var$daystoexpire = (New-TimeSpan -Start $today -End $Expireson).DaysIf (($daystoexpire -ge "0") -and ($daystoexpire -lt $expireindays)){"$Date - INFO: Sending expiry notice ePost to $Name" | Out-File ($DirPath + "\" + "Log.txt") -AppendWrite-Host "Sending Password expiry ePost to $name" -ForegroundColor Yellow$ SMTPCLIENT = New-Object System.Netz.Post.SMTPClient $ MailMessage = New-Object System.Netz.Post.Postmessage#Who isdas e-Post sent from$Postmessage.From = $FromEPost#SMTP server to send ePost$SmtpClient.Host = $ SMTPHOST#SMTP SSL $ SMTPCLISSE.Enablessl = $ true#SMTP -Anmeldeinformationen $ SMTPCLISSE.Anmeldeinformationens = $cred#Send e-Post todas users ePost$Postmessage.Zu.add("$ePostaddress")#EPost subject$Postmessage.Subject = "Your password will expire $daystoexpire days"#Notification ePost on delivery / failure$MailMessage.DeliveryNotificationOptions = ("onSuccess", "onFailure")#Send e-Post with high priority$MailMessage.Priority = "High"$Postmessage.Body = "Lieber $ name, Ihr Domain -Passwort verfällt in $ DaysoExpire -Tagen.Bitte ändern Sie es so schnell wie möglich.Zu change your password, followdas methodbelow:1.Auf Ihrem Windows -Computer.If you are not indas office, logon and connect to VPN.b.Log onto your computer as usual and make sure you are connected todas interNetz.c.Drücken Sie Strg-Alt-Del und klicken Sie auf "" Passwort ändern ""..d.Füllen Sie Ihr altes Passwort aus und legen Sie ein neues Passwort ein. Seedas password requirementsbelow.e.Drücken Sie OK, um zu Ihrem Desktop zurückzukehren. The new password must meetdas minimum requirements set forth in our corporate policies including:1.It mustbe at least 8 characters long.2.It must contain at least one character from 3 ofdas 4 following groups of characters:a.Großbuchstaben (A-Z) B.Kleinbuchstaben (A-Z) C..Zahlen (0-9) D..Symbole (

[ePost protected]

#$%^&*...)3.Es kann nicht mit einem Ihrer letzten 24 Passwörter übereinstimmen.4.Es können keine Zeichen enthalten, die 3 oder mehr aufeinanderfolgende Zeichen Ihres Benutzernamens übereinstimmen.5.Sie können Ihr Passwort nicht öfter als einmal in einem Zeitraum von 24 Stunden ändern.Wenn Sie Fragen haben, wenden Sie sich bitte an unser Support -Team unter

[ePost protected]

oder rufen Sie uns bei 555 an.555.5555Thanks, der faule Administrator

[ePost protected]

555.555.5555"Write-Host "Sending E-Post to $ePostaddress..."-ForegroundColor Greentry {$.Send($Postmessage)}Catch{$_ | Out-File ($DirPath + "\" + "Log.txt ") -Append}} else {" $ Datum -Info: Passwort für $ name nicht für $ Daystoxpire Days "| Out -File ($ dirpath +" \ " +" Protokoll.TXT ") -Appendwrite -Host" -Kennwort für $ name läuft nicht für $ Daystoxpire Days "-ForegroundColor White}}

Brad Wyatt

My name is Bradley Wyatt; I am a Microsoft Most Valuable Professional and I am currently a Manager DevOps Cloud Automatisierung at

BDO Digital

indas Chicago area.

Neueste: So formatieren Sie eine Festplatte für Windows und Mac
NÄCHSTE: So formatieren Sie Samsung SSD für Mac/MacBook Pro unter Windows PC?
Populäre Artikel/span>
Back to top