Untitled
unknown
plain_text
9 months ago
7.0 kB
6
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."
}
}
# 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-."
Editor is loading...
Leave a Comment