Azure AD Connect - Synchronisation automatique sur les modifications utilisateur
Comme décrit dans un article séparé, Azure AD Connect synchronise par défaut les modifications d'Active Directory avec Azure toutes les 30 minutes. Cela signifie que toute modification d'utilisateur local (à l'exception des modifications de mot de passe) peut prendre jusqu'à 30 minutes avant d'être visible dans Azure/Office 365.
Pour la plupart des administrateurs, cela signifie également BEAUCOUP de synchronisations manuelles d’Azure AD Connect. Ni vous ni votre utilisateur ne souhaitez attendre jusqu'à une demi-heure avant de tester le nouvel alias de messagerie que vous venez de configurer sur l'objet utilisateur sur site…
Alors que faire à ce sujet ?
Ne pouvons-nous pas simplement configurer Azure AD Connect pour qu'il se synchronise toutes les minutes ? Malheureusement non… La planification la plus fréquente autorisée est la durée par défaut de 30 minutes, définie par l'attribut AllowedSyncCycleInterval de ADSyncScheduler. Ceci est configuré par conception et ne peut pas être défini administrativement
PS C:\Windows\system32> Get-ADSyncScheduler
AllowedSyncCycleInterval : 00:30:00
CurrentlyEffectiveSyncCycleInterval : 00:30:00
CustomizedSyncCycleInterval :
NextSyncCyclePolicyType : Delta
NextSyncCycleStartTimeInUTC : 5/3/2019 9:09:31 AM
PurgeRunHistoryInterval : 7.00:00:00
SyncCycleEnabled : True
MaintenanceEnabled : True
StagingModeEnabled : False
SchedulerSuspended : False
SyncCycleInProgress : False
Maintenant quoi??? Ne serait-il pas bien si Azure AD Connect décidait simplement d'effectuer une synchronisation automatique à chaque fois que nous créons ou mettons à jour un objet utilisateur ? Bien sûr, pourquoi pas!? Allons-y…
Le script PowerShell « Synchroniser automatiquement Azure AD Connect à chaque modification d'objet utilisateur sur site » !
Les requêtes Active Directory LDAP sont assez rapides tant que vous limitez la complexité de la requête, n'incluez pas trop d'attributs non indexés dans votre requête, et ne récupérez pas trop d'attributs. Dans la plupart des scénarios, vous devriez pouvoir exécuter une recherche d'utilisateur qui filtre sur l'attribut whenChanged en moins d'une seconde. C'est à moins que vos DC soient déjà pressés pour les ressources et/ou si votre nombre d'utilisateurs est bien supérieur à 5 000.
Pour tester les performances de votre DC, essayez de chronométrer le code ci-dessous sur votre système (il obtiendra les attributs de base pour tous les utilisateurs qui ont été modifiés au cours de la semaine dernière) :
Import-Module ActiveDirectory
$OneWeekAgo = (Get-Date) + (New-TimeSpan -Days -7)
[array]$Users = Get-ADUser -Filter 'whenChanged -gt $OneWeekAgo'Si la requête (ligne 3) a pris plus de quelques secondes, recherchez pourquoi. Si vos contrôleurs de domaine ne traitent pas la requête efficacement, vous ne devez pas utiliser un calendrier de 15 secondes comme suggéré dans cet article.
Mais si le code ci-dessus est exécuté en une seconde environ ou moins, je dirais qu'il est raisonnable de l'exécuter toutes les 15 secondes sur l'un de vos contrôleurs de domaine.
Synchronisation et contrôle du script à l'aide d'un fichier journal
Après avoir confirmé le faible impact de la requête whenChanged, essayons de la structurer. Nous avons besoin des éléments suivants :
- Exécutez une requête pour voir si des utilisateurs ont été modifiés depuis la dernière fois que nous avons exécuté la requête
- Si les utilisateurs ont été modifiés, déclenchez la synchronisation Azure AD Connect
- Une fois terminé, attendez 15 secondes avant de recommencer
Il existe de nombreuses méthodes pour contrôler ce flux. Je préfère utiliser un fichier journal car il est relativement simple à gérer et peut nous apporter de nombreux avantages tels que l'historique d'exécution et les informations de dépannage.
Le fichier journal doit effectuer les opérations suivantes :
Écrivez l'heure à laquelle nous avons effectué une requête (afin que nous sachions jusqu'où rechercher les modifications de l'utilisateur la prochaine fois que nous exécuterons le script) :
$Now = Get-Date
$Now.ToString("yyyyMMddHHmmss") + " Some status info." | Out-File $LogFile -AppendLisez la dernière fois que nous avons effectué une requête et recherchez les utilisateurs et les groupes qui ont été modifiés depuis :
$LastLine = Get-Item -Path $LogFile | Get-Content -Tail 1 # Read last line of log file
$LastSync = [datetime]::parseexact($LastLine.Substring(0, 14), 'yyyyMMddHHmmss', $null) # Get last synchronization time
[array]$Users = Get-ADUser -Filter ‘whenChanged -gt $LastSync’ # Find users that changed since last time
[array]$Groups = Get-ADGroup -Filter 'whenChanged -gt $LastSync' # Find groups that changed since last time$ChangeCount = $Users.Count + $Groups.Count
If ($ChangeCount -gt 0) {
Import-Module ADSync
Start-ADSyncSyncCycle -PolicyType Delta
}If ((Test-Path $LogFile) -eq $False){ # Create log file if it doesn't exist
"Time Message" | Out-File $LogFile
"19990101000001 SyncAllChanges" | Out-File $LogFile -Append
}
$LastLine = Get-Item -Path $LogFile | Get-Content -Tail 1 # Read last line of log file
If ((Get-Item $LogFile).Length -gt $MaxSize){ # Reset log file if it has grown larger than $MaxSize
"Time Message" | Out-File $LogFile
$LastLine | Out-File $LogFile -Append
}Try {
# Main code goes here
}
Catch {
"19990101000001 " + $ErrorMessage | Out-File $LogFile -Append
}
(La définition de l'heure de la dernière synchronisation sur le 1er janvier 1999 garantira que le nombre d'utilisateurs modifiés lors de la prochaine exécution sera supérieur à 0 et déclenchera donc une synchronisation delta Azure AD Connect.)
Conclusion du script de synchronisation Azure AD Connect
Avec tous les éléments définis, nous sommes à peu près prêts à le planifier. Concernant la planification, certains administrateurs préfèrent centraliser leurs tâches planifiées sur un serveur batch dédié pour suivre l'automatisation. Pour prendre en charge cela, nous devons implémenter la communication à distance, ce qui nécessite quelques ajustements pour effectuer une gestion appropriée des erreurs.
Ci-dessous vous trouverez le script final dans son intégralité.
# Azure AD Connect Auto Sync script - Provided as-is, use at own risk.
# Make sure ActiveDirectory module is available on system where script is scheduled.
# Will trigger Azure AD Connect synchronization when on-prem AD user or group is changed.
# Schedule to run every 5 minutes and to start after scheduled start is missed.
# For full info on script and how to schedule it:
# https://www.easy365manager.com/azure-ad-connect-automatic-synchronization-on-user-change
# Configure parameters before scheduling the script:
$AADConnectServer = "" # Azure AD Connect server (blank assumes local system)
$LogFile = "AD_Azure_Sync_Log.txt" # Log file used for keeping track of AD changes and troubleshooting
$MaxSize = 5242880 # Maximum size of log file in bytes (5MB)
$StartTime = Get-Date
While ((New-TimeSpan $StartTime (Get-Date)).Seconds -lt 300) {
Try {
Import-Module ActiveDirectory
If ((Test-Path $LogFile) -eq $False) {
# Create log file if it doesn't exist
"Time Message" | Out-File $LogFile
"19990101000001 SyncAllChanges" | Out-File $LogFile -Append
}
$LastLine = Get-Item -Path $LogFile | Get-Content -Tail 1 # Read last line of log file
If ((Get-Item $LogFile).Length -gt $MaxSize) {
# Reset log file if it has grown larger than $MaxSize
"Time Message" | Out-File $LogFile
$LastLine | Out-File $LogFile -Append
}
$Now = Get-Date
$LastSync = [datetime]::parseexact($LastLine.Substring(0, 14), 'yyyyMMddHHmmss', $null) # Get last synchronization time
[array]$Users = Get-ADUser -Filter 'whenChanged -gt $LastSync' # Find users that changed since last time
[array]$Groups = Get-ADGroup -Filter 'whenChanged -gt $LastSync' # Find groups that changed since last time
$ChangeCount = $Users.Count + $Groups.Count
If ($ChangeCount -gt 0) {
# If any users or groups were changed start the Azure AD Synchronization
If ($AADConnectServer -ne "" -and $AADConnectServer.ToLower() -ne $env:COMPUTERNAME.ToLower()) {
# Connect to Azure AD Connect server if not running on local system
$Session = New-PSSession $AADConnectServer
$Result = Invoke-Command -Session $Session -Scriptblock {
Try {
Import-Module ADSync
Start-ADSyncSyncCycle -PolicyType Delta
}
Catch {
return $_
}
}
Remove-PSSession $Session
}
Else {
Import-Module ADSync
Start-ADSyncSyncCycle -PolicyType Delta
}
If (!$Result -or $Result.ToString() -eq "Microsoft.IdentityManagement.PowerShell.ObjectModel.SchedulerOperationStatus") {
$Now.ToString("yyyyMMddHHmmss") + " Synchronized " + $ChangeCount + " Users/Groups." | Out-File $LogFile -Append
}
Else {
"19990101000001 " + ($Result.ToString().Split("`r")[0]) | Out-File $LogFile -Append
}
}
Else {
$Now.ToString("yyyyMMddHHmmss") + " No changes." | Out-File $LogFile -Append
}
}
Catch {
"19990101000001 " + ($_.ToString().Split("`r")[0]) | Out-File $LogFile -Append
}
Start-Sleep 15
}Merci à Phil Ready de l'Environmental Protection Authority de Nouvelle-Zélande pour avoir suggéré d'inclure les modifications de groupe dans l'analyse AD !
Planification du script de synchronisation
Pour synchroniser le script, utilisez les paramètres ci-dessous du planificateur de tâches. Le script est configuré pour s'exécuter pendant cinq minutes et le planificateur de tâches doit démarrer la tâche toutes les cinq minutes. Cette combinaison garantit que votre système fonctionne régulièrement 24 heures sur 24. Veillez à suivre ces instructions pour éviter que plusieurs scripts ne soient exécutés en parallèle ou qu'aucun script ne soit exécuté du tout.
Assurez-vous d'utiliser un compte de service/batch avec un mot de passe non expirant. N’oubliez pas non plus que le compte a besoin d’un accès pour déclencher la synchronisation Azure AD Connect et pour écrire dans le fichier journal.
Réglez la date/heure de début dans les prochaines minutes et laissez-la démarrer automatiquement. Si vous le démarrez manuellement, vous risquez d'avoir deux threads simultanés, ce qui imposera une charge supplémentaire à votre contrôleur de domaine et brouillera le contenu du fichier journal.
Le chemin du programme/script doit être le chemin complet du fichier PowerShell.exe. L'argument doit être le chemin complet du fichier de script. Le dossier de démarrage doit être configuré sur le dossier contenant le fichier de script.
Assurez-vous de configurer la tâche pour qu'elle s'exécute dès que possible après un démarrage planifié afin qu'elle démarre automatiquement après un redémarrage du système.
La solution intelligente
Vous pouvez résoudre à peu près n'importe quel problème à l'aide de scripts - si vous avez le temps… Mais si vous préférez travailler intelligemment, nous vous suggérons de consulter Easy365Manager, qui est disponible sous forme d'essai gratuit entièrement fonctionnel.
Easy365Manager augmente les fonctionnalités de la console Utilisateurs et ordinateurs AD en ajoutant deux nouveaux onglets. Grâce aux nouveaux paramètres, vous pouvez déclencher automatiquement une synchronisation d'Azure AD Connect chaque fois que vous configurez vos comptes d'utilisateurs locaux. Easy365Manager vous permet également de configurer directement les licences Office 365 et les paramètres de la boîte aux lettres.
Au lieu de basculer entre les utilisateurs et ordinateurs AD, le portail Office 365, Azure AD Connect et PowerShell, installez Easy365Manager et travaillez intelligemment dans la console étendue Utilisateurs et ordinateurs AD.
Pour continuer à écrire votre chemin à travers le monde, téléchargez ci-dessous ?
Télécharger le script de synchronisation automatique Azure AD Connect
Pour des instructions détaillées sur la façon de planifier le script, lisez cette section.





