powershell:ad:set-vdisystemgroupmembership
Inhaltsverzeichnis
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
- Set-VdiSystemGroupMembership.ps1
<# 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.
- set-VdiSystemGroupMembership.csv
"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"
powershell/ad/set-vdisystemgroupmembership.txt · Zuletzt geändert: 2024/05/27 08:36 von 127.0.0.1
