Untitled
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." } } # Appliquer les restrictions d'horaires pour tous les groupes commençant par "GG-" $GGGroups = Get-ADGroup -Filter { Name -like "GG-*" } foreach ($group in $GGGroups) { Log-Action "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) Get-ADGroupMember -Identity $group | Set-LogonHours -TimeIn24Format @(7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23) -Monday -Tuesday -Wednesday -Thursday -Friday -Saturday -NonSelectedDaysare WorkingDays Log-Action "Les restrictions pour IT ont été appliquées avec succès pour le groupe : $($group.Name)" } else { # Restrictions pour les autres groupes (lundi au vendredi de 8h à 18h) Get-ADGroupMember -Identity $group | Set-LogonHours -TimeIn24Format @(8,9,10,11,12,13,14,15,16,17,18) -Monday -Tuesday -Wednesday -Thursday -Friday -NonSelectedDaysare WorkingDays Log-Action "Les restrictions pour les autres groupes ont été appliquées avec succès pour le groupe : $($group.Name)" } } Write-Host "Le script a terminé l'application des restrictions pour tous les groupes GG-."
Leave a Comment