Untitled

 avatar
unknown
plain_text
17 days ago
5.6 kB
4
Indexable
Function Set-LogonHours {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True)]
        [ValidateRange(0, 23)]
        $TimeIn24Format,  # Heures en format 24h à appliquer

        [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True, Position=0)]
        $Identity,  # Utilisateur ou groupe d'utilisateurs

        [parameter(mandatory=$False)]
        [ValidateSet("WorkingDays", "NonWorkingDays")]
        $NonSelectedDaysare="NonWorkingDays",  # Jours de la semaine sélectionnés pour les restrictions

        # Paramètres des jours de la semaine
        [parameter(mandatory=$False)][switch]$Sunday,
        [parameter(mandatory=$False)][switch]$Monday,
        [parameter(mandatory=$False)][switch]$Tuesday,
        [parameter(mandatory=$False)][switch]$Wednesday,
        [parameter(mandatory=$False)][switch]$Thursday,
        [parameter(mandatory=$False)][switch]$Friday,
        [parameter(mandatory=$False)][switch]$Saturday
    )

    Process {
        # Initialisation des valeurs de chaque jour
        $FullByte = New-Object "byte[]" 21
        $FullDay = [ordered]@{}
        
        0..23 | foreach { $FullDay.Add($_,"0") }

        # Appliquer les horaires sélectionnés
        $TimeIn24Format.ForEach({ $FullDay[$_] = 1 })
        $Working = -join ($FullDay.Values)

        # Définition des valeurs pour les jours de travail ou jours non travaillés
        Switch ($PSBoundParameters["NonSelectedDaysare"]) {
            'NonWorkingDays' { 
                $SundayValue = $MondayValue = $TuesdayValue = $WednesdayValue = $ThursdayValue = $FridayValue = $SaturdayValue = "000000000000000000000000"
            }
            'WorkingDays' { 
                $SundayValue = $MondayValue = $TuesdayValue = $WednesdayValue = $ThursdayValue = $FridayValue = $SaturdayValue = "111111111111111111111111"
            }
        }

        # Modification des jours de la semaine spécifiés
        Switch ($PSBoundParameters.Keys) {
            'Sunday' { $SundayValue = $Working }
            'Monday' { $MondayValue = $Working }
            'Tuesday' { $TuesdayValue = $Working }
            'Wednesday' { $WednesdayValue = $Working }
            'Thursday' { $ThursdayValue = $Working }
            'Friday' { $FridayValue = $Working }
            'Saturday' { $SaturdayValue = $Working }
        }

        # Construire la chaîne de 168 bits représentant toute la semaine
        $AllTheWeek = "{0}{1}{2}{3}{4}{5}{6}" -f $SundayValue, $MondayValue, $TuesdayValue, $WednesdayValue, $ThursdayValue, $FridayValue, $SaturdayValue

        # Gestion des fuseaux horaires
        if ((Get-TimeZone).BaseUtcOffset.Hours -lt 0) {
            $TimeZoneOffset = $AllTheWeek.Substring(0, 168 + ((Get-TimeZone).BaseUtcOffset.Hours))
            $TimeZoneOffset1 = $AllTheWeek.Substring(168 + ((Get-TimeZone).BaseUtcOffset.Hours))
            $FixedTimeZoneOffSet = "$TimeZoneOffset1$TimeZoneOffset"
        } elseif ((Get-TimeZone).BaseUtcOffset.Hours -gt 0) {
            $TimeZoneOffset = $AllTheWeek.Substring(0, ((Get-TimeZone).BaseUtcOffset.Hours))
            $TimeZoneOffset1 = $AllTheWeek.Substring(((Get-TimeZone).BaseUtcOffset.Hours))
            $FixedTimeZoneOffSet = "$TimeZoneOffset1$TimeZoneOffset"
        } else {
            $FixedTimeZoneOffSet = $AllTheWeek
        }

        # Conversion du résultat en tableau binaire de bytes
        $i = 0
        $BinaryResult = $FixedTimeZoneOffSet -split '(\d{8})' | Where { $_ -match '(\d{8})' }

        foreach ($singleByte in $BinaryResult) {
            $Tempvar = $singleByte.ToCharArray()
            [array]::Reverse($Tempvar)
            $Tempvar = -join $Tempvar
            $Byte = [Convert]::ToByte($Tempvar, 2)
            $FullByte[$i] = $Byte
            $i++
        }

        # Appliquer les restrictions à l'utilisateur ou groupe
        try {
            Set-ADUser -Identity $Identity -Replace @{logonHours = $FullByte}
        }
        catch {
            Write-Host "Erreur lors de l'application des restrictions pour $Identity : $_" -ForegroundColor Red
        }
    }

    end {
        Write-Host "Toutes les restrictions de connexion ont été appliquées avec succès." -ForegroundColor Green
    }
}

# Appliquer les restrictions d'horaires pour tous les groupes commençant par "GG-"
$GGGroups = Get-ADGroup -Filter { Name -like "GG-*" }

foreach ($group in $GGGroups) {
    Write-Host "Début de l'application des restrictions pour le groupe : $($group.Name)"
    if ($group.Name -eq "GG-IT") {
        # Restrictions pour le groupe IT (lundi 7h au samedi 23h, sans interruption)
        Get-ADGroupMember -Identity $group | Set-LogonHours -TimeIn24Format @(0..23) -Monday -Tuesday -Wednesday -Thursday -Friday -Saturday -NonSelectedDaysare NonWorkingDays
        Write-Host "Les restrictions pour IT ont été appliquées avec succès pour le groupe : $($group.Name)" -ForegroundColor Green
    }
    else {
        # Restrictions pour les autres groupes (lundi au vendredi de 8h à 18h, pas d'accès samedi et dimanche)
        Get-ADGroupMember -Identity $group | Set-LogonHours -TimeIn24Format @(8..18) -Monday -Tuesday -Wednesday -Thursday -Friday -NonSelectedDaysare WorkingDays
        Write-Host "Les restrictions pour les autres groupes ont été appliquées avec succès pour le groupe : $($group.Name)" -ForegroundColor Green
    }
}

Write-Host "Le script a terminé l'application des restrictions pour tous les groupes GG-." -ForegroundColor Green
Leave a Comment