Benutzer-Werkzeuge

Webseiten-Werkzeuge


powershell:ad:set-aduserattributes

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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki