Azure AD Connect: sincronización automática de cambios de usuario
Como se describe en una publicación separada, Azure AD Connect sincroniza los cambios de Active Directory con Azure cada 30 minutos de forma predeterminada. Esto significa que cualquier cambio de usuario local (excepto cambios de contraseña) puede tardar hasta 30 minutos antes de que sea visible en Azure/Office 365.
Para la mayoría de los administradores, esto también significa MUCHAS sincronizaciones manuales de Azure AD Connect. Ni usted ni su usuario quieren esperar hasta media hora antes de probar ese nuevo alias de correo que acaba de configurar en el objeto de usuario local...
Entonces, ¿qué hacer al respecto?
¿No podemos simplemente configurar Azure AD Connect para que se sincronice cada minuto? Desafortunadamente no... La programación más frecuente permitida es la predeterminada de 30 minutos según lo establecido por el atributo AllowedSyncCycleInterval de ADSyncScheduler. Esto se configura por diseño y no se puede configurar administrativamente
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
¿¿¿Ahora que??? ¿No sería bueno si Azure AD Connect decidiera realizar una sincronización automática cada vez que creemos o actualicemos un objeto de usuario? ¿¡Seguro Por qué no!? Vamos…
¡El script de PowerShell “Sincronizar automáticamente Azure AD Connect en cada cambio de objeto de usuario local”!
Las consultas LDAP de Active Directory son bastante rápidas siempre que limite la complejidad de la consulta, no incluya demasiados atributos no indexados en su consulta y no recupere demasiados atributos. En la mayoría de los escenarios, debería poder ejecutar una búsqueda de usuario que filtre el atributo whenChanged en menos de un segundo. Esto es a menos que sus DC ya estén presionados por recursos y/o si su recuento de usuarios está muy por encima de 5000.
Para probar el rendimiento de su DC, intente cronometrar el siguiente código en su sistema (obtendrá atributos básicos para todos los usuarios que se cambiaron durante la última semana):
Import-Module ActiveDirectory
$OneWeekAgo = (Get-Date) + (New-TimeSpan -Days -7)
[array]$Users = Get-ADUser -Filter 'whenChanged -gt $OneWeekAgo'Si la consulta (línea 3) tardó más de unos segundos en completarse, investigue el motivo. Si sus DC no procesan la consulta de manera efectiva, no debe utilizar un cronograma de 15 segundos como se sugiere en este artículo.
Pero si el código anterior se ejecuta en aproximadamente un segundo o menos, diría que es razonable ejecutarlo cada 15 segundos en uno de sus controladores de dominio.
Temporización y control del script mediante un archivo de registro
Habiendo confirmado el bajo impacto de la consulta whenChanged, intentemos estructurarla. Necesitamos lo siguiente:
- Ejecute una consulta para ver si se modificó algún usuario desde la última vez que ejecutamos la consulta.
- Si se cambiaron los usuarios, active la sincronización de Azure AD Connect
- Cuando termine, espere 15 segundos antes de comenzar de nuevo.
Hay muchos métodos para controlar este flujo. Prefiero usar un archivo de registro porque es relativamente sencillo de manejar y puede brindarnos numerosos beneficios, como historial de ejecución e información de solución de problemas.
El archivo de registro debe realizar lo siguiente:
Escriba la hora en la que hicimos una consulta (para que sepamos hasta dónde debemos buscar los cambios del usuario la próxima vez que ejecutemos el script):
$Now = Get-Date
$Now.ToString("yyyyMMddHHmmss") + " Some status info." | Out-File $LogFile -AppendLea la última vez que hicimos una consulta y verifique los usuarios y grupos que han cambiado desde entonces:
$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
}
(Establecer la hora de la última sincronización en el 1 de enero de 1999 garantizará que la cantidad de usuarios modificados en la próxima ejecución sea mayor que 0 y, por lo tanto, desencadenará una sincronización delta de Azure AD Connect).
Resumen del script de sincronización de Azure AD Connect
Con todos los detalles definidos, estamos prácticamente listos para programarlo. En cuanto a la programación, algunos administradores prefieren centralizar sus tareas programadas en un servidor por lotes dedicado para realizar un seguimiento de la automatización. Para respaldar esto, necesitamos implementar la comunicación remota, lo que requiere algunos ajustes para realizar un manejo adecuado de errores.
A continuación encontrará el guión final en su totalidad.
# 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
}¡Gracias a Phil Ready de la Autoridad de Protección Ambiental de Nueva Zelanda por sugerir incluir cambios de grupo en el escaneo AD!
Programación del script de sincronización
Para sincronizar el script, utilice la siguiente configuración del programador de tareas. El script está configurado para ejecutarse durante cinco minutos y el programador de tareas debe iniciar el trabajo cada cinco minutos. Esta combinación garantiza que funcione de manera constante las 24 horas del día. Tenga cuidado al seguir estas instrucciones para evitar que se ejecuten varios scripts en paralelo o que no se ejecute ningún script.
Asegúrese de utilizar una cuenta de servicio/lote con una contraseña que no caduque. Además, tenga en cuenta que la cuenta necesita acceso para activar la sincronización de Azure AD Connect y escribir en el archivo de registro.
Establezca la fecha/hora de inicio dentro de los próximos minutos y deje que se inicie automáticamente. Si lo inicia manualmente, corre el riesgo de tener dos subprocesos simultáneos, lo que supondrá una carga adicional para su controlador de dominio y difuminará el contenido del archivo de registro.
La ruta del programa/script debe ser la ruta completa al archivo PowerShell.exe. El argumento debe ser la ruta completa al archivo de script. La carpeta de inicio debe configurarse en la carpeta que contiene el archivo de script.
Asegúrese de configurar la tarea para que se ejecute lo antes posible después de que se pierda un inicio programado para que se inicie automáticamente después de reiniciar el sistema.
La solución inteligente
Puede resolver prácticamente cualquier problema utilizando secuencias de comandos, si tiene tiempo... Pero si prefiere trabajar de forma inteligente, le sugerimos que consulte Easy365Manager, que está disponible como una prueba gratuita completamente funcional.
Easy365Manager aumenta la funcionalidad de la consola AD Users & Computers agregando dos nuevas pestañas. Con la nueva configuración, puede desencadenar automáticamente una sincronización de Azure AD Connect cada vez que configure sus cuentas de usuario locales. Easy365Manager también le permite configurar las licencias de Office 365 y los ajustes del buzón directamente.
En lugar de saltar entre Usuarios y Computadoras de AD, el Portal de Office 365, Azure AD Connect y PowerShell, instale Easy365Manager y trabaje de manera inteligente en la consola extendida de Usuarios y Computadoras de AD.
Para seguir guiando tu camino por el mundo, descárgalo a continuación ?
Descargar el script de sincronización automática de Azure AD Connect
Para obtener instrucciones detalladas sobre cómo programar el script, lea esta sección.





