Untitled
unknown
plain_text
9 months ago
5.6 kB
7
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
Editor is loading...
Leave a Comment