powershell:ad:set-aduserattributes
Inhaltsverzeichnis
Set-AdUserAttributes.ps1
Was macht das Skript?
Es werden aus einer Excel-Tabelle Werte ausgelesen und in Attribute von AD-Benutzerkonten übernommen. Dazu erfolgt zunächst ein Abgleich mit bestehenden Werten und eine Änderungsversionierung.
Das Skript
- Set-AdUserAttributes.ps1
<# Set-AdUserAttributes.ps1 Autor: Henning Löser / VBW / IT Version: 1.0 Datum: 05.02.2020 Funktion: Liest aus einer Exceltabelle Einträge aus, und schreibt sie ins AD. - samaccountname = Benutzeranmeldename im AD - ExtensionAttribute10 = Änderungsindex des Eintrags in der Tabelle, wird ins AD geschrieben, Änderungen werden nur durchgeführt, wenn in der Tabelle ein höherer Wert als im AD gefunden wird. - ExtensionAttribute11 = Das Feld wird in das AD-Attribut ExtensionAttribute 11 geschrieben und von Exclaimer als Zeile 1 verwendet - ExtensionAttribute12 = Das Feld wird in das AD-Attribut ExtensionAttribute 12 geschrieben und von Exclaimer als Zeile 2 verwendet - ExtensionAttribute13 = Das Feld wird in das AD-Attribut ExtensionAttribute 13 geschrieben und von Exclaimer als Zeile 3 verwendet Es werden nur Benutzer abgearbeitet, die unter der definierten $SearchBase liegen. Das Skript führt rudimentäre Vergleiche aus: - Bei Benutzerkonten im AD, die in der Exceltabelle offensichtlich fehlen, sendet das Skript eine Email an $EmailRecipient. - Bei zu ändernden Objekten wird zunächst ein Inhaltsvergleich der Attribute durchgeführt und nur die tatsächlich geänderten Attribute in das AD-Objekt geschrieben. Historie: Version 1.0 / 05.02.2020 Fertigstellung #> # Definitionen # Datum für die Gnereationeen der Logdatei. $Date=get-date -Format yyy-MM-dd # Pfad, unter dem die Logdateien abgelegt werden. Der Pfad wird benötigt, um das Handling # alter Logdateien zu erleichtern $LogPath="C:\ProgramData\Skripte\log\Set-AdUserAttributes" # Aktuelle Logdatei $LogFile="$logpath\Set-AdUserAttributes`_$date.log" # Maximale Anzahl an behaltenen Logdateien. Es wird eine Logdatei pro Tag angelegt, an die # alle Skriptdurchläufe ihre Ergebnisse anhängen. $KeepLogFiles="30" # Excel-Datei, in der die anzupassenden AD-Attribute festgelegt werden. $AdAttributeFile="\\vbw-bochum.local\dfs\edv\05_Benutzerverwaltung\99_PowerShellAutomatisierung\Set-AdUserAttributes.xlsx" # AD Suchbasis, es werden nur Benutzerkonten unterhalb dieser Basis von dem Skript bearbeitet $SearchBase="OU=VBW,DC=vbw-bochum,DC=local" # Email-Konfiguration für das Versenden der Hinweis-Emails $EmailServer = "svbw12.vbw-bochum.local" $EmailSender = "it-hilfe@vbw-bochum.de" $EmailRecipient = "henning.loeser@vbw-bochum.de" $EmailSubject = "Set-AdUserAttributes.ps1 auf sbvw11.vbw-bochum.local" $EmailAttachment = "C:\ProgramData\Skripte\temp\Set-AdUserAttributes.txt" $EmailBody = "`"$AdAttributeFile`"`nDie folgenden Benutzer sind nicht in der Exceltabelle enthalten und werden entsprechend nicht von dem Skript erfasst und bearbeitet:`n" # Aktivierung der zusätzlichen Ausgabe aller Ausgaben des Skriptes in die Logdatei. Start-Transcript -Path $LogFile -Append # Existenz des LogPaths prüfen und ggf. Pfad anlegen if (!(Test-Path $LogPath)) { Write-Host "Verzeichnis `"$LogPath`" ist nicht vorhanden und wird angelegt." New-Item -ItemType Directory $LogPath } # Ermitteln der alten Logdateien $LogFiles=Get-ChildItem $LogPath $LogCount = $LogPath.count # Überschüssige Logdateien entfernen if ($LogCount -gt $KeepLogFiles) { $remove=$LogFiles | Sort-Object -lastwritetime | Select-Object -Last $($LogCount - $KeepLogFiles) foreach ($item in $remove) { remove-item $item.fullname -Confirm:$false -Force } } # Daten einlesen Write-Host "`"$AdAttributeFile`" einlesen" if (Test-Path $AdAttributeFile) { Write-Host "Datei gefunden, Inhalte werden eingelesen." $ExcelUsers = Import-Excel $AdAttributeFile -WorksheetName "VbwAttributes" } Else { Write-Host "Datei nicht gefunden, Skriptabbruch!" send-email -SMTPServer $EmailServer -AuthenticationMethod Integrated -UseSSL $false -Port 25 -HTMLBody $false -SenderAddress $EmailSender -SenderName "svbw11: Set-AdUserAttributes" -To $EmailRecipient -Subject $EmailSubject -Body "Die ExcelDatei mit den Benutzerattributen wurde nicht gefunden.`n`nAus diesem Grund erfolgte ein Skriptabbruch!" Exit } Write-Host "AD-Benutzerkonten einlesen" $QueryProperties = @{ SearchBase = "OU=VBW,DC=vbw-bochum,DC=local" Properties = "extensionattribute10","extensionattribute11","extensionattribute12","extensionattribute13","department","division","mail" filter = "*" } $AdUsers = Get-ADUser @QueryProperties #$AdUsers = Get-ADUser -SearchBase $SearchBase -Properties extensionattribute10,extensionattribute11,extensionattribute12,extensionattribute13,department,division,mail if ($AdUsers.count -eq 0) { Write-Host "Keine AD-User gefunden, Skriptabbruch" send-email -SMTPServer $EmailServer -AuthenticationMethod Integrated -UseSSL $false -Port 25 -HTMLBody $false -SenderAddress $EmailSender -SenderName "svbw11: Set-AdUserAttributes" -To $EmailRecipient -Subject $EmailSubject -Body "Es wurden keine AD-Benutzerkonten gefunden.`n`nAus diesem Grund erfolgte ein Skriptabbruch!" Exit } Else { Write-Host "Nicht zu bearbeitende Benutzer entfernen" $AdUsers=$AdUsers | Where-Object mail -notlike $null $AdUsers=$AdUsers | where-object distinguishedname -notLike "*test*" $AdUsers=$AdUsers | where-object distinguishedname -notLike "*funktionsuser*" $AdUsers=$AdUsers | where-object department -notLike "schulung" } # Suche nach AD-Benutzern, die in der Exceltabelle fehlen. if ($AdUsers.count -gt 0 -and $ExcelUsers.count -gt 0) { $UnknownUserObjects=(Compare-Object $AdUsers.samaccountname $ExcelUsers.samaccountname | where-object sideindicator -like "<=").inputobject if ($UnknownUserObjects.count -ge 1) { $EmailBody += $UnknownUserObjects send-email -SMTPServer $EmailServer -AuthenticationMethod Integrated -UseSSL $false -Port 25 -HTMLBody $false -SenderAddress $EmailSender -SenderName "svbw11: Set-AdUserAttributes" -To $EmailRecipient -Subject $EmailSubject -Body $EmailBody } } # Abfangen eines leeren ExtensionAttribute10 umd Fehlermeldungen des Skripts zu vermeiden $ChangedExcelUsers=$ExcelUsers | Where-Object {$_.ExtensionAttribute10 -NotLike $null} # Änderungen für jedes Benutzerobjekt feldweise prüfen foreach ($ExcelUser in $ChangedExcelUsers) { # Für Loganalyse das Benutzerkoto vor Abarbeitung weiterer Schritte nennen Write-Host "`n### Benutzer bearbeiten:`n$($ExcelUser.samaccountname)" # Für das einfachere Handling das aktuelle Benutzerobjekt in eine eigene Variable schreiben. $AdUser=$AdUsers | Where-Object samaccountname -like $ExcelUser.SamAccountName # Vergleich von ExtensionAttribute10, für eine Änderung des AD-Objektes muss der Wert in der # Exceldatei größer sein als der Wert im AD. Um einen Zahlenvergleich durchzuführen und keinen # Textvergleich wird die Ausgabe als "Integer" verglichen (Bei Text wäre 9>10) if (([int]$ExcelUser.ExtensionAttribute10) -gt [int]$AdUser.extensionattribute10) { Write-Host "Aktuelle Änderungen in der Excel-Tabelle gefunden => Benutzer wird im AD bearbeitet" -ForegroundColor Green # Prüfen, ob es ein eindeutiges AD-Objekt zu dem SamAccountName gibt if (($ADuser|measure).count -eq 1) { Write-Host "Eindeutigtes Userkonto im AD gefunden: $($AdUser.SamAccountName)" # ExtensionAttribute10 bearbeiten # Vergleich der Werte des Attributs in Excel und AD if ($AdUser.extensionattribute10 -eq $ExcelUser.ExtensionAttribute10) { Write-Host "AD-ExtensionAttribute10 und Excel-ExtensionAttribute10 sind identisch, keine Änderung" } Else { # Prüfen, ob das Feld einen Wert hat. Ein Wert in dem Feld kann nicht aktualisiert, # sondern muss zunächst entfernt werden bevor ein neuer Wert eingetragen werden kann if ($AdUser.extensionattribute10 -ne $null) { Write-Host "AD-ExtensionAttribute10: Wert `"$($AdUser.extensionattribute10)`"wird gelöscht:" Set-ADUser $AdUser.samaccountname -clear extensionattribute10 #-whatif } Else { Write-Host "AD-ExtensionAttribute10 noch ohne Wert" } # Prüfen, ob ein Wert in der Excel-Tabelle vorliegt und in die Tabelle geschrieben werden muss. if ($ExcelUser.extensionattribute10 -ne $null) { Write-Host "Excel-ExtensionAttribute10 Wert:`n$($ExcelUser.extensionattribute10)`nDer Wert wird ins AD übertragen" Set-ADUser $AdUser.SamAccountName -Add @{"extensionattribute10"=[string]$($ExcelUser.extensionattribute10)} #-whatif } Else { Write-Host "Excel-ExtensionAttribute10 ohne Wert." } } # Bearbeitung von ExtensionAttribute10 beenden. # ExtensionAttribute11 if ($AdUser.extensionattribute11 -eq $ExcelUser.ExtensionAttribute11) { Write-Host "AD-ExtensionAttribute11 und Excel-ExtensionAttribute11 sind identisch" } Else { if ($AdUser.extensionattribute11 -ne $null) { Write-Host "AD-ExtensionAttribute11: Wert `"$($AdUser.extensionattribute11)`"wird gelöscht:" Set-ADUser $AdUser.samaccountname -clear extensionattribute11 #-whatif } Else { Write-Host "AD-ExtensionAttribute11 noch ohne Wert" } if ($ExcelUser.extensionattribute11 -ne $null) { Write-Host "Excel-ExtensionAttribute11 Wert:`n$($ExcelUser.extensionattribute11)`nDer Wert wird ins AD übertragen" Set-ADUser $AdUser.SamAccountName -Add @{"extensionattribute11"=$($ExcelUser.extensionattribute11)} #-whatif } Else { Write-Host "Excel-ExtensionAttribute11 ohne Wert" } } # /ExtensionAttribute11 # ExtensionAttribute12 if ($AdUser.extensionattribute12 -eq $ExcelUser.ExtensionAttribute12) { Write-Host "AD-ExtensionAttribute12 und Excel-ExtensionAttribute12 sind identisch" } Else { if ($AdUser.extensionattribute12 -ne $null) { Write-Host "AD-ExtensionAttribute12: Wert `"$($AdUser.extensionattribute12)`"wird gelöscht:" Set-ADUser $AdUser.samaccountname -clear extensionattribute12 #-whatif } Else { Write-Host "AD-ExtensionAttribute12 noch ohne Wert" } if ($ExcelUser.extensionattribute12 -ne $null) { Write-Host "Excel-ExtensionAttribute12 Wert:`n$($ExcelUser.extensionattribute12)`nDer Wert wird ins AD übertragen" Set-ADUser $AdUser.SamAccountName -Add @{"extensionattribute12"=$($ExcelUser.extensionattribute12)} #-whatif } Else { Write-Host "Excel-ExtensionAttribute12 ohne Wert" } } # /ExtensionAttribute12 # ExtensionAttribute13 if ($AdUser.extensionattribute13 -eq $ExcelUser.ExtensionAttribute13) { Write-Host "AD-ExtensionAttribute13 und Excel-ExtensionAttribute13 sind identisch" } Else { if ($AdUser.extensionattribute13 -ne $null) { Write-Host "AD-ExtensionAttribute13: Wert `"$($AdUser.extensionattribute13)`"wird gelöscht:" Set-ADUser $AdUser.samaccountname -clear extensionattribute13 #-whatif } Else { Write-Host "AD-ExtensionAttribute13 noch ohne Wert" } if ($ExcelUser.extensionattribute13 -ne $null) { Write-Host "Excel-ExtensionAttribute13 Wert:`n$($ExcelUser.extensionattribute13)`nDer Wert wird ins AD übertragen" Set-ADUser $AdUser.SamAccountName -Add @{"extensionattribute13"=$($ExcelUser.extensionattribute13)} #-whatif } Else { Write-Host "Excel-ExtensionAttribute13 ohne Wert" } } # /ExtensionAttribute13 } Else { Write-Host "User nicht gefunden oder nicht eindeutig" } } Else { Write-Host "In der Exceltabelle wurde keine aktuelle Änderung des Benutzerkontos gefunden`nDas AD-Konto $($AdUser.samaccountname) wird nicht verändert." } } # Zusätzliche Ausgabe in die Logdatei beenden. Stop-Transcript
powershell/ad/set-aduserattributes.txt · Zuletzt geändert: 2024/05/27 08:36 von 127.0.0.1
