Benutzer-Werkzeuge

Webseiten-Werkzeuge


powershell:ad:set-vdisystemgroupmembership

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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki