Heute bin ich über folgendes Problem gestolpert: Bei einem neuen Mitarbeiter enthielt die E-Mail-Adresse im Office 365 einen Unterstrich (“Underscore”) an erster Stelle:
(Zusätzlich wurde nicht die reguläre Domäne sondern eine “@*.onmicrosoft.com” verwendet…)
Die Benutzer werden mittels “Azure AD Connect” vom lokalen Active Directory nach Azure AD synchronisiert und bilden dort die Grundlage für die Office 365 Benutzer. Daher kann man die E-Mail-Adressen auch nicht online ändern, sondern nur on-premise. Im lokalen AD war aber auf den ersten Blick alles in Ordnung:
Nach kurzer Recherche fand ich einen Microsoft KB Artikel, der mich auf die Lösung brachte:
In this scenario, after directory synchronization is run, the special character is replaced by an underscore character. Therefore, the user’s Office 365 email address contains an underscore character instead of the special character.
Dabei wird eine Liste mit “verbotenen” Zeichen aufgeführt (die merkwürdigerweise auch das @-Zeichen enthält…), zu denen auch das Leerzeichen gehört. Bezogen ist das ganze auf die AD-Attribute “mail” und “proxyAddresses”. “Mail” war in Ordnung, aber “proxyAddresses”…
…nicht! Hier war ein Leerzeichen zwischen “SMTP:” und der eigentlichen E-Mailadresse. Nach dem ich dieses entfernt hatte und schnell noch den DirSync mit
Start-ADSyncSyncCycle -PolicyType Delta
angestoßen hatte, war der Benutzer mit seiner korrekten E-Mail-Adresse in Office 365 vorhanden!
Wie schon vor zwei Jahren möchte ich auch in diesem Jahr zum internationalen "System Administrator Appreciation Day", kurz Sysadminday, einladen. Zum wiederholten Mal wird es zu diesem Anlass in Leipzig am 28.07.2017 eine kostenfreie Veranstaltung geben. Ab ca. 14:00 Uhr starten wir mit interessanten Fachvorträgen, ehe wir es uns dann gemeinsam bei Buffet und kühlen Getränken gut gehen lassen werden. Wer erst später dazu stoßen kann ist natürlich genauso gerne gesehen – geplant ist, dass die Veranstaltung bis ca. 21:00 gehen wird. Die Veranstaltung wird durch einige Sponsoren ermöglicht, darunter Microsoft Deutschland , Arvato Systems Perdata GmbH sowie Altaro. Alle Systemadministratoren, IT-Professionals, Entscheider sowie alle weiteren Mitarbeiter der verschiedenen IT-Bereiche sind recht herzlich zu dieser Veranstaltung eingeladen!
Hat man häufig wechselnde Benutzer in seinem Active Directory (wie z.B. bei mir an der Hochschule, oder auch bei Lehrlingen, Werkstudenten oder ähnlichem), dann ist es sinnvoll, die Benutzerkonten dieser Personenkreise von vornherein mit einem Ablaufdatum zu versehen:
Ein mögliches Problem hierbei ist, dass die Benutzer erst NACH dem Ablauf feststellen, dass sie nicht mehr arbeiten können und sich bis zur Verlängerung durch einen Admin daran auch nichts ändert. Also wäre es doch schön, wenn die Benutzer schon vor dem Ablaufdatum daran erinnert werden, um sich zeitnah zu melden. Eine mögliche Lösung hierfür liegt wie so oft in einem PowerShell-Skript.
Der Kern des Skriptes ist die Suche nach den relevanten Accounts. Dazu dient “Search-ADAccount”:
Search-ADAccount -AccountExpiring -TimeSpan „32“
Diese Abfrage liefert alle Accounts, die in den nächsten 32 Tagen ablaufen (32 habe ich hier gewählt, um bei monatlicher Ausführung des Skriptes niemanden zu “vergessen”.
Der Rest ist dann eher schmückendes Beiwerk. Mit einer Schleife wird über alle entsprechenden Benutzer iteriert und jedem eine passende E-Mail gesendet:
Import-Module ActiveDirectory
# Werte wie gewünscht anpassen:[int]$AnzahlTage=32[TimeSpan]$Zeitraum=New-TimeSpan-Days$AnzahlTage[string]$subject="Ihr Benutzeraccount wird in den nächsten 31 Tagen ablaufen!"[string]$MailSender="ich@domain.de"[string]$MailServer="mail.server.com"ForEach($ExpiringUserin(Search-ADAccount -AccountExpiring -TimeSpan $Zeitraum| Get-ADObject -Properties samaccountname,mail,accountExpires)){$ExpDate=[datetime]::FromFileTime($($ExpiringUser.accountExpires))$body="Werter Benutzer!`r`r
Ihr Benutzerkonto `"$($ExpiringUser.samaccountname)`" wird in den kommenden 31 Tagen ablaufen. Das genaue Ablaufdatum lautet:`r`r
$(Get-Date ($ExpDate.AddDays(-1)) -Format "dd.MM.yyyy")`r`r
Mit freundlichen Grüßen,`r
Ihre IT-Abteilung"
Send-MailMessage -From $MailSender-To $ExpiringUser.mail -Subject $subject-Body$body-SmtpServer $MailServer-Encoding UTF8 -Priority High -Bcc $MailSender}
Import-Module ActiveDirectory
# Werte wie gewünscht anpassen:
[int]$AnzahlTage = 32
[TimeSpan]$Zeitraum = New-TimeSpan -Days $AnzahlTage
[string]$subject = "Ihr Benutzeraccount wird in den nächsten 31 Tagen ablaufen!"
[string]$MailSender = "ich@domain.de"
[string]$MailServer = "mail.server.com"
ForEach($ExpiringUser in (Search-ADAccount -AccountExpiring -TimeSpan $Zeitraum | Get-ADObject -Properties samaccountname,mail,accountExpires))
{
$ExpDate = [datetime]::FromFileTime($($ExpiringUser.accountExpires))
$body =
"Werter Benutzer!`r
`r
Ihr Benutzerkonto `"$($ExpiringUser.samaccountname)`" wird in den kommenden 31 Tagen ablaufen. Das genaue Ablaufdatum lautet:`r
`r
$(Get-Date ($ExpDate.AddDays(-1)) -Format "dd.MM.yyyy")`r
`r
Mit freundlichen Grüßen,`r
Ihre IT-Abteilung"
Send-MailMessage -From $MailSender -To $ExpiringUser.mail -Subject $subject -Body $body -SmtpServer $MailServer -Encoding UTF8 -Priority High -Bcc $MailSender
}
Das war es dann auch schon. Viel Spaß beim Adaptieren…
Das vollständige Skript kann auch hier heruntergeladen werden: