====== Set-VdiSystemGroupMembership.ps1 ======
===== Was macht das Skript? =====
Das Skripte ermittelt Systeme innerhalb einer OU und fügt sie dann Gruppen im AD hinzu. Weiteres Kriterium ist, dass Systeme bei Mitgliedschaft in einer "Skip-Gruppe" nicht verarbeitet werden sollen.\\
Hintergrund ist das Anlegen größerer Mengen von Maschinen während der Einführung neuer Systeme, welche dann über die Gruppenmitgliedschaften GPOs zugewiesen bekommen.
===== Das Skript =====
<#
Name Set-VdiSystemGroupMembership
Version 1.0
Datum 10.12.2019
Autor VBW / Henning Löser
Funktion:
Das Skript ist eine temporäre Hilfe, um neu deployte VDI-Maschinen in eine benannte Liste von AD-Gruppen aufzunehmen.
Bereits erfolgreich bearbeitete Systeme werden in eine Hilfsgruppe "$SkipGroup" aufgenommen und von der weiteren Bearbeitung ausgeschlossen.
#>
# Logging festlegen
$Date=get-date -Format yyyMMdd
$LogPath="C:\ProgramData\Skripte\log\Set-VdiSystemGroupMembership"
if (!(Test-Path $LogPath))
{
New-Item -ItemType Directory $LogPath
}
$Logfile="$LogPath\$date`.log"
# Dauer der Wartezeit vor dem Prüfen der neu geschriebenen Gruppenmitgliedschaften
$AdReplicationTime=30
# Logging beginnen
Start-Transcript -Path $Logfile -Append
# Logdateien auf $LogFileLimit begrenzen
$LogFileLimit=14
$LogFiles=Get-ChildItem $LogPath
# Wenn mehr als $LogFileLimit Dateien bestehen, die ältesten überschüssigen Dateien löschen
If ($LogFiles.count -gt $LogFileLimit)
{
Write-Host "Alte Logdateien entfernen"
$RemoveNo=($LogFiles.count - $LogFileLimit)
$RemoveFiles=$LogFiles | sort-object LastWriteTime -Descending | Select-Object -Last $RemoveNo
foreach ($item in $RemoveFiles)
{
Remove-Item $item.fullname -Force -Confirm:$false
}
}
Write-Host "Alle Systeme mit passenden Namen aus der defnierten OU abfragen"
$AllSystems=@()
$AllSystems+=get-adcomputer -SearchBase "OU=VBW Horizon VMs,DC=vbw-bochum,DC=local" -filter {samaccountname -like "vm-2c*"}
$AllSystems+=get-adcomputer -SearchBase "OU=VBW Horizon VMs,DC=vbw-bochum,DC=local" -filter {samaccountname -like "vm2c*"}
$AllSystems+=get-adcomputer -SearchBase "OU=VBW Horizon VMs,DC=vbw-bochum,DC=local" -filter {samaccountname -like "vm-4c*"}
$AllSystems+=get-adcomputer -SearchBase "OU=VBW Horizon VMs,DC=vbw-bochum,DC=local" -filter {samaccountname -like "vm4c*"}
Write-Host "Datei mit den benannten Gruppen einlesen"
$groups=Import-Csv -Delimiter ";" -Encoding UTF8 "C:\ProgramData\Skripte\etc\Set-VdiSystemGroupMembership.csv"
#Skip-Gruppe der zu überspringenden Systeme
$SkipGroup="VDI-Skip-Gruppenskript"
Write-Host "Herausfiltern der Systeme mit Gruppenmitgliedschaft in $SkipGroup"
$WorkSystems=@()
foreach ($system in $AllSystems)
{
if (!((Get-ADPrincipalGroupMembership $system.SamAccountName).samaccountname -contains $SkipGroup))
{
Write-Host "Work on $($system.samaccountname)"
$WorkSystems+=$system
}
}
if ($WorkSystems.Count -eq 0)
{
Write-Host "Kein System zur Abarbeitung gefunden, Skript wird beendet"
Stop-Transcript
Exit
}
Else
{
Write-Host "Es wurden $($WorkSystems.Count) Systeme zur Bearbeitung gefunden"
}
Write-Host "Die definierten AD-Gruppen auf bestehende Mitgliedschaft der abzuarbeitenden Systeme prüfen, `nnur fehldene Mitgliedschaften hinzufügen"
foreach ($group in $groups)
{
Write-Host "Mitglieder der Gruppe $($group.Name) ermitteln"
$members = Get-ADGroupMember "$($group.Name)"
if (!($members.count -eq 0))
{
$AddMembers=$WorkSystems.distinguishedname
}
Else
{
$AddMembers=(compare-object $members.distinguishedname $WorkSystems.distinguishedname | Where-Object SideIndicator -Like "=>").inputobject
}
foreach ($AddMember in $AddMembers)
{
$newmember=$($AddMember.Split(",")[0]).split("=")[1]
$newmember=$newmember+"`$"
Write-Host "$newmember zur $($group.name) hinzufügen"
Add-ADGroupMember -identity $group.name -Members $newmember -Verbose
}
}
Write-Host "$AdReplicationTime Sekunden auf AD-Repliaktion der neuen Mitgliedschaften warten"
Start-sleep -Seconds $AdReplicationTime
Write-Host "Prüfen, ob die Mitgliedschaften geschrieben wurden und System in die Skip-Gruppe aufnehmen"
foreach ($system in $WorkSystems)
{
$check=(Compare-Object (Get-ADPrincipalGroupMembership $system.SamAccountName).samaccountname $groups.name | Where-Object sideindicator -like "=>").count
if ($check -like "0")
{
Write-Host "$($System.samaccountname) wird zu $SkipGroup hinzugefügt"
Add-ADGroupMember -Identity $SkipGroup -Members $system.SamAccountName
}
Else
{
Write-Host "$($System.samaccountname) wurde nicht in allen definierten Gruppen gefunden und deshalb nicht zu $SkipGroup hinzugefügt"
}
}
# Logging beenden
Stop-Transcript
===== Gruppen-Datei =====
Dir Gruppen werden in einer einfachen CSV-Datei definiert.
"Name"
"Computer_SAP_Logon_CFG_von_Server_laden_(SAPGui_7.60)_s"
"Computer Win10 Windows-Fotoanzeige für JPG-PNG-BMP-GIF_s"
"Computer_Google_Chrome_erlaubte_Erweiterungen_s"
"Computer_SW_Google_Chrome_Enterprise_s"
"Computer_Benutzerkontensteuerung Verwendung des Administratorg_S"
"Computer_SW_Ortis_Contract_Dropzone_S"
"Computer_SW_XPhoneUC_Commander_4.5.5_UM_s"
"Computer_SW_innovaphone_myPBX_s"
"Computer_SW_AdobeAcrobatReader_2015_s"
"Computer_Windows-Firewall_DomaenenProfil_FW_aus_S"
"Computer_Wartezeit_fuer_Richtlinienverarb_beim_Systemstart_s"
"Computer_WSUS_s"
"Computer_SW_Teamviewer_Host_s"
"Computer_Windows-Remoteverwaltung_einschalten_s"
"Computer_SW_SymantecEP_SVBW22_s"