Dies ist eine alte Version des Dokuments!
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
<file powershell 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
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}
function NonStandardFields([string]$a, [string]$b)
{
Write-Host $a,$b
}
# Ä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 <file>
