Untitled

 avatar
unknown
plain_text
17 days ago
6.4 kB
2
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
    )

    # Définir le chemin du fichier de journalisation
    $LogFilePath = "C:\Logs\Set-LogonHours_Action.log"

    # Fonction pour ajouter des messages au fichier journal
    Function Log-Action {
        param (
            [string]$message
        )
        $timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
        $logEntry = "$timestamp - $message"
        Add-Content -Path $LogFilePath -Value $logEntry
        Write-Host $logEntry  # Affiche également dans la console
    }

    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"
                Log-Action "Les jours non travaillés sont définis pour tous les jours de la semaine."
            }
            'WorkingDays' { 
                $SundayValue = $MondayValue = $TuesdayValue = $WednesdayValue = $ThursdayValue = $FridayValue = $SaturdayValue = "111111111111111111111111"
                Log-Action "Les jours travaillés sont définis pour tous les jours de la semaine."
            }
        }

        # Modification des jours de la semaine spécifiés
        Switch ($PSBoundParameters.Keys) {
            'Sunday' { $SundayValue = $Working; Log-Action "Horaires appliqués pour dimanche." }
            'Monday' { $MondayValue = $Working; Log-Action "Horaires appliqués pour lundi." }
            'Tuesday' { $TuesdayValue = $Working; Log-Action "Horaires appliqués pour mardi." }
            'Wednesday' { $WednesdayValue = $Working; Log-Action "Horaires appliqués pour mercredi." }
            'Thursday' { $ThursdayValue = $Working; Log-Action "Horaires appliqués pour jeudi." }
            'Friday' { $FridayValue = $Working; Log-Action "Horaires appliqués pour vendredi." }
            'Saturday' { $SaturdayValue = $Working; Log-Action "Horaires appliqués pour samedi." }
        }

        # 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
        Log-Action "La chaîne de 168 bits pour la semaine a été générée."

        # 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"
            Log-Action "Les horaires ont été ajustés pour un fuseau horaire négatif."
        } 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"
            Log-Action "Les horaires ont été ajustés pour un fuseau horaire positif."
        } else {
            $FixedTimeZoneOffSet = $AllTheWeek
            Log-Action "Aucun ajustement nécessaire pour le fuseau horaire."
        }

        # 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}
            Log-Action "Les restrictions de connexion ont été appliquées à l'utilisateur ou groupe : $Identity"
        }
        catch {
            Log-Action "Erreur lors de l'application des restrictions pour $Identity : $_"
        }
    }

    end {
        Log-Action "Toutes les restrictions de connexion ont été appliquées avec succès."
    }
}

# Exemple de journalisation
# Appliquer les restrictions d'horaires pour un groupe spécifique (par exemple "GG-DIRECTION")
Get-ADGroupMember -Identity "GG-DIRECTION" | Set-LogonHours -TimeIn24Format @(8,9,10,11,12,13,14,15,16,17,18) -Monday -Tuesday -Wednesday -Thursday -NonSelectedDaysare WorkingDays

# Appliquer les restrictions d'horaires pour un utilisateur spécifique
Set-LogonHours -Identity "Jack.Ripper" -TimeIn24Format @(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,0) -Monday -Tuesday -Wednesday -Thursday -Friday -NonSelectedDaysare NonWorkingDays
Leave a Comment