Wie die meisten wissen, mache ich mir das Leben gerne einfach bei der Arbeit. Das bedeutet nicht das ich Arbeit scheue, ich automatisiere oder vereinfache sie nur gerne wo es geht. Ich nutze dafür gerne die PowerShell.
Ein weiterer Grund neben der Bequemlichkeit oder das Fehlen von Zeit warum man Aufgaben durch Skripte zu lösen sollte, ist eine gleichbleibende Qualität. Mal ehrlich wer kennt das nicht, selbst wenn es Checklisten gibt, wird schon mal ein Schritt vergessen, wenn man abgelenkt wird.
Ich empfehle immer einfache Dinge weitest gehend zu automatisieren, damit die Admins Zeit haben für die wichtigen Dinge. Heute möchte ich mal ein paar Beispiele zum Thema Benutzer anlegen durch gehen. Da die Anforderungen an diesen Prozess sehr individuell sind, kann es nur als Beispiele oder Bausteine für eine Eigenentwicklung dienen. Damit es etwas einfacher als Ideen Spender dienen kann, zeige ich euch einzelne Bausteine und zum Schluss das ganze Skript was ich in meiner Testumgebung nutze.
Hinweise zu Programm- und PowerShell Code
Der hier enthaltene Code dient als Beispiel. Ich übernehme keine Garantie, Gewährleistung oder Support für den Code oder Bestandteile. Verwendung des Codes erfolgt auf eigene Gefahr.
Ich empfehle immer sich die Skripte vor der Verwendung genau anzuschauen, was sie wirklich tun.
Verbindung zum Active Directory
Der erste Schritt ist die Verbindung zum Active Directory, das für laden wir das benötigte Modul. Hier prüfe ich gerne vorher, ob es schon geladen wurde. Was ich zusätzlich noch gerne mache, ich gebe einen Domänen Controller für alle Befehle an. Das ist sinnvoll, damit ich nicht auf Replikation warten muss, weil ich jedes Mal auf einem anderen Server lande. Da ich nicht immer einen angeben möchte, oder den DC festverdrahten möchte, lasse ich wenn ich dem Skript keinen Vorgebe, das Skript einen aussuchen.
if(@(get-module | where-object {$_.Name -eq "ActiveDirectory"} ).count -eq 0) {import-module ActiveDirectory}
IF ($DC -eq "") { $DC = $(Get-ADDomainController).HostName ; Write-Verbose "Kein DC angegeben, nutze $DC" }
Anlegen des Benutzers
Es gibt viele Optionen, die man beim Anlegen eines Benutzers festlegen kann. Eine Auflistung aller Möglichkeiten finden Sie unter der Dokumentation der PowerShell Befehle New-ADUser und Set-ADUser. Ich gehe in meinen Skripten gerne hin, und setze nur die zusätzlichen Optionen mit New-ADUser, die für alle Benutzer gleich sind. Den Rest modifiziere ich mit Set-ADUser. Es ist einfacher beim Programmieren des PowerShell Skriptes mit Parameter-Schaltern und IF-Abfragen zu arbeiten als verschiedene Strings für den „Ultimativen“ New-ADUser Befehl zusammen zu bauen.
Bei der Auswahl der möglichen Optionen muss man sich überlegen welche Möglichkeiten brauche ich im Unternehmen? Neben den Klassischen Informationsattributen wie Adresse, Telefonnummer und Co. gibt es einige AD Attribute, die ich meistens mit implementiere, hier ein paar Beispiele:
- Passwortänderung bei erster Anmeldung (ChangePasswordAtLogon)
- Aktiviert (Enabled)
- Abteilungs- oder Gruppenzugehörigkeiten
- Ablaufdatum (AccountExpirationDate) zum Beispiel für befristete Mitarbeiter und Praktikanten
- Vorgesetzte
Wenn man bei dem PowerShell Skript mit dem Switch Parameter arbeitet, kann dies sehr einfach umgesetzt werden
New-ADUser -Name $Username -GivenName $Vorname -Surname $Nachname -Path $OU -AccountPassword $SecPass -DisplayName $($Vorname+" "+$Nachname) -EmailAddress $Email -UserPrincipalName $UPN -OtherAttributes @{proxyAddresses=$("SMPT:"+$Email)} -Server $DC
Start-Sleep -Seconds 10
IF ( $PWwechsel ) { Set-ADUser -Identity $Username -ChangePasswordAtLogon $true -Server $DC } ELSE { Set-ADUser -Identity $Username -ChangePasswordAtLogon $false -Server $DC }
IF ( $Aktiviert ) { Set-ADUser -Identity $Username -Enabled $true -Server $DC ; Write-Verbose "Aktiviere $Username" }
IF ( $Abt -eq "" ) { Write-verbose "Keine Abteilung ausgewählt" } Else { Add-ADGroupMember -Identity $Abt -Members $Username }
Hinzufügen von Lizenzen für Office365
Viele Firmen nutzen heute Microsoft Office 365, auch hierfür gibt es PowerShell Befehle, warum sie nicht nutzen? Für dieses Beispiel gehe ich von einer Synchronisierung mit „Azure AD Connect“ aus. Der Einfachheit halber arbeitet dieses Musterskript mit einer manuellen Administrativen Anmeldung am Azure AD, für den Produktiven Einsatz würde ich über ein Service Konto mit RBAC oder eine andere Authentifizierungsform nachdenken.
Als erstes benötige ich wieder den passenden Werkzeugkasten, sprich die PowerShell Module. Dafür nutze ich die Funktion PowerShellGet um mir Module aus der PowerShell Galerie nachzuladen. Dies ist seit der PowerShell 5 integriert, kann aber für PowerShell Versionen ab 3 nachinstalliert werden.
Auch hier prüfe ich bevor ich das Module lade, erstmal ob es vorhanden ist.
Try { Connect-AzureAD } catch { Write-Verbose "Installiere AzureAD Modul" ; Install-Module -Name AzureAD -Force ; Connect-AzureAD }
Um jetzt für einen neuen Benutzer eine Lizenz zuweisen zu können, muss er erstmal synchronisiert werden. Die Standardzeit dafür ist bei AAD Connect alle 30 Minuten, wer mich kennt weiß, solange möchte ich nicht warten. Also teile ich dem AAD Connect meinen Wunsch nach Synchronisierung mit und prüfe wann er fertig ist. Dann weise ich die passende Office365 oder Microsoft365€ Lizenz zu.
Write-Verbose "Starte AAD Sync"
Invoke-Command -ComputerName $ADCServer -ScriptBlock { Start-ADSyncSyncCycle -PolicyType Delta }
while ( $(try {Get-AzureADUser -ObjectId $Email} catch {}).count -lt 1) { start-sleep -Seconds 10 ; Write-Verbose "Wait for user appear online"}
#Lizenzzuweisen
Set-AzureADUser -ObjectId $Email -UsageLocation "DE"
$license = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$licenses = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$license.SkuId = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $O365Lic -EQ).SkuID
$licenses.AddLicenses = $license
Set-AzureADUserLicense -ObjectId $Email -AssignedLicenses $licenses
Write-Verbose "Assigned Licenses: $($(Get-AzureADUserLicenseDetail -ObjectId $Email ).SkuPartNumber)"
Die nette Art des willkommen heißen
Ich finde es immer nett, neue Mitarbeiter im Namen der IT zu begrüßen und Ihnen direkt die Wichtigsten Information mitzugeben. Dies können Informationen wie die Hotline-Nummer, die Seite des Ticketsystems oder die Lieblingssorte der Süßigkeiten in der IT sein (Nicht lachen, ich kenn einige Firmen, da beschleunigt ein Kilo Kekse den Prozess unglaublich). All diese Information kann ich ja schon in einem Email Template verpacken und personalisiert beim Anlegen mitschicken.
Um Emails mit der PowerShell zu verschicken nutze ich immer denselben Funktionsbaustein. Dieser beherrscht auch Authentifizierung und TLS für SMTP.
Function SendEmailStatus($From, $To, $Subject, $SmtpServer, $BodyAsHtml, $Body)
{ $SmtpMessage = New-Object System.Net.Mail.MailMessage $From, $To, $Subject, $Body
$SmtpMessage.IsBodyHTML = $BodyAsHtml
$SmtpClient = New-Object System.Net.Mail.SmtpClient $SmtpServer
IF ($TLS) { $SmtpClient.EnableSsl = $true }
IF ($SmtpAuth) { $SmtpClient.Credentials = New-Object System.Net.NetworkCredential($smtpuser, $smtppw) }
$SmtpClient.Send($SmtpMessage)
If($? -eq $False){Write-Warning "$($Error[0].Exception.Message) | $($Error[0].Exception.GetBaseException().Message)"}
$SmtpMessage.Dispose()
Remove-Variable SmtpClient
Remove-Variable SmtpMessage
}
Den Inhalt der Mail kann ich als HTML mir mit Variablen aus dem Skript anreichern, zum Beispiel „Herzlich willkommen $Vorname“. Der Aufruf der Mailfunktion ist entsprechend einfach:
SendEmailStatus -From $From -To $Email -Subject $WelcomeSub -SmtpServer $SmtpServer -BodyAsHtml $True -Body $WelcomeBody
Natürlich kann ich die Funktion auch nutzen um dem Vorgesetzten ein gewürfeltes Anfangskennwort zu schicken.
Was kann man noch in so ein Skript integrieren
Im Prinzip kann ich es für alles was ich brauche erweitern. Hier einige Mögliche Ideen, die mir schon mal untergekommen sind:
- Anlegen einer persönlichen VM / VDI
- Erweiterte Gruppenzuweisungen über PowerShell Schalter, Standortinformation oder Abteilungszuordnung
- Anlegen von einer Telefonnummer in der TK Anlage und pflege der Telefonnummer im AD
- Hinzufügen von einem Foto zum AD
- Mail an die Kollegen über neuen MA (Abfrage über den gleichen Manager)
- Mail an Anbieter von Ausgelagerten Systemen um dort auch einen Benutzer anzulegen
- Mail an die Marketingabteilung um am ersten Arbeitstag ein Set Firmenwerbegeschenke (Tasse, Kugelschreiber, etc.) bereitzustellen
- Automatisches erstellen der Mailadresse auf Basis einer festen Konvention
- Prüfung der Eingaben, zum Beispiel ob der SAMAccountname zu lang ist oder die E-Mail auch dem Schema entspricht.
Auch gibt es noch Möglichkeiten noch mehr Automatisierung hinzuzufügen. Zum Beispiel könnte man der HR Abteilung ein Verzeichnis mit einer CSV-Datei zur Verfügung stellen. Einmal in der Nacht läuft das Anlageskript, import die Daten und legt die Benutzer an. Im Anschluss verschickt das Skript noch eine Statusmail an die HR oder IT. Dafür sollte dann das Skript auch auf volle Automatisierung angepasst sein.
Das Skript findet ihr auf GitHub.
Download der PowerShell Skripte
Die PowerShell Skripte sind mittlerweile auf GitHub gehostet.
Hinweis zu Programm- und PowerShell Code
Der hier enthaltene Code dient als Beispiel. Ich übernehme keine Garantie, Gewährleistung oder Support für den Code oder Bestandteile. Verwendung des Codes erfolgt auf eigene Gefahr.
Ich empfehle immer sich die Skripte vor der Verwendung genau anzuschauen, was sie wirklich tun.
Schreibe einen Kommentar