Benutzer-Werkzeuge

Webseiten-Werkzeuge


powershell:ad:set-aduserattributes

Dies ist eine alte Version des Dokuments!


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>

powershell/ad/set-aduserattributes.1581512144.txt.gz · Zuletzt geändert: 2024/05/27 08:34 (Externe Bearbeitung) · Momentan gesperrt von: 216.73.216.63

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki