Azure AD Connect - Kullanıcı Değişikliklerinde Otomatik Eşitleme


Ayrı bir gönderide açıklandığı gibi Azure AD Connect, Active Directory değişikliklerini varsayılan olarak her 30 dakikada bir Azure ile senkronize eder. Bu, şirket içi kullanıcı değişikliklerinin (parola değişiklikleri hariç) Azure/Office 365'te görünür hale gelmesinin 30 dakikaya kadar sürebileceği anlamına gelir.

Çoğu yönetici için bu aynı zamanda Azure AD Connect'in BİRÇOK manuel senkronizasyonu anlamına da gelir. Ne siz ne de kullanıcınız, şirket içi kullanıcı nesnesinde yapılandırdığınız yeni posta takma adını test etmeden önce yarım saate kadar beklemek istemezsiniz…

Peki bu konuda ne yapmalı?

Azure AD Connect'i her dakika senkronize olacak şekilde ayarlayamaz mıyız? Ne yazık ki hayır... İzin verilen en sık zamanlama, ADSyncScheduler'ın AllowedSyncCycleInterval özniteliği tarafından belirlenen varsayılan 30 dakikadır. Bu, tasarıma göre yapılandırılır ve yönetimsel olarak ayarlanamaz

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

Şimdi ne olacak??? Azure AD Connect, her kullanıcı nesnesi oluşturduğumuzda veya güncelleştirdiğimizde otomatik senkronizasyon yapmaya karar verseydi güzel olmaz mıydı? Tabii neden olmasın!? Hadi gidelim…

“Her Şirket İçi Kullanıcı Nesnesi Değişikliğinde Azure AD Connect'i Otomatik Olarak Eşitle” -PowerShell Betiği!

Active Directory LDAP sorguları, sorgunun karmaşıklığını sınırladığınız, sorgunuza çok fazla dizine eklenmemiş öznitelik eklemediğiniz ve sürece oldukça hızlıdır. çok fazla özellik almayın. Çoğu senaryoda, WhenChanged özniteliğine göre filtre uygulayan bir kullanıcı aramasını bir saniyeden daha kısa sürede çalıştırabilmeniz gerekir. Kaynaklar için DC'lerinize zaten basılmadığı ve/veya kullanıcı sayınız 5.000'in çok üzerinde olmadığı sürece bu geçerlidir.

DC performansınızı test etmek için sisteminizde aşağıdaki kodu zamanlamayı deneyin (geçen hafta içinde değiştirilen tüm kullanıcılar için temel özellikleri alacaktır):

Import-Module ActiveDirectory
$OneWeekAgo = (Get-Date) + (New-TimeSpan -Days -7)
[array]$Users = Get-ADUser -Filter 'whenChanged -gt $OneWeekAgo'

Sorgunun (3. satır) tamamlanması birkaç saniyeden uzun sürdüyse nedenini araştırın. DC'niz sorguyu etkili bir şekilde işlemiyorsa bu makalede önerildiği gibi 15 saniyelik bir zamanlama kullanmamalısınız.

Ancak yukarıdaki kod yaklaşık bir saniye veya daha kısa sürede yürütülürse, bunu Etki Alanı Denetleyicilerinizden birinde her 15 saniyede bir çalıştırmanın makul olduğunu söyleyebilirim.

Günlük Dosyası Kullanarak Komut Dosyasının Zamanlaması ve Kontrolü

WhenChanged sorgusunun etkisinin düşük olduğunu doğruladıktan sonra onu yapılandırmayı deneyelim. Aşağıdakilere ihtiyacımız var:

  1. Sorguyu son çalıştırmamızdan bu yana herhangi bir kullanıcının değişip değişmediğini görmek için bir sorgu çalıştırın
  2. Kullanıcılar değiştirildiyse Azure AD Connect senkronizasyonunu tetikleyin
  3. Bittiğinde, yeniden başlamadan önce 15 saniye bekleyin

Bu akışı kontrol etmenin birçok yöntemi vardır. Kullanımı nispeten basit olduğundan ve bize yürütme geçmişi ve sorun giderme bilgileri gibi çok sayıda fayda sağlayabildiğinden günlük dosyası kullanmayı tercih ediyorum.

Günlük dosyası aşağıdakileri gerçekleştirmelidir:

Sorgu yaptığımız zamanı yazın (böylece betiği bir sonraki çalıştırışımızda kullanıcı değişikliklerini ne kadar geriye bakacağımızı biliriz):

$Now = Get-Date
$Now.ToString("yyyyMMddHHmmss") + " Some status info." | Out-File $LogFile -Append

En son ne zaman sorgu yaptığımızı okuyun ve o tarihten bu yana değişen kullanıcı ve grupları kontrol edin.

$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
}

(Son senkronizasyon zamanının 1 Ocak 1999'a ayarlanması, bir sonraki çalıştırmada değiştirilen kullanıcı sayısının 0'dan büyük olmasını sağlayacak ve dolayısıyla bir Azure AD Connect delta senkronizasyonunu tetikleyecektir.)

Azure AD Connect Eşitleme Betiğini Tamamlama

Tüm küçük parçalar tanımlandığında, planlamaya hemen hemen hazırız. Zamanlamayla ilgili olarak, bazı yöneticiler otomasyonu takip etmek için zamanlanmış görevlerini özel bir toplu sunucuda merkezileştirmeyi tercih eder. Bunu desteklemek için, doğru hata işlemeyi gerçekleştirmek için biraz ince ayar gerektiren uzaktan iletişim uygulamamız gerekiyor.

Aşağıda son komut dosyasının tamamını bulacaksınız.

# 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
}

AD taramasına grup değişikliklerinin dahil edilmesini önerdiği için Yeni Zelanda Çevre Koruma Kurumu'ndan Phil Ready'ye teşekkür ederiz!

Senkronizasyon Komut Dosyasını Zamanlama

Komut dosyasını senkronize etmek için görev zamanlayıcıdan aşağıdaki ayarları kullanın. Komut dosyası beş dakika çalışacak şekilde yapılandırılmıştır ve görev zamanlayıcının işi her beş dakikada bir başlatması gerekir. Bu kombinasyon, cihazın günün her saatinde istikrarlı bir şekilde çalışmasını sağlar. Birden fazla komut dosyasının paralel olarak çalışmasını veya hiç komut dosyasının çalışmamasını önlemek için bu talimatları uygularken dikkatli olun.

Süresi dolmayan bir parolaya sahip bir hizmet/toplu hesap kullandığınızdan emin olun. Ayrıca, Azure AD Connect senkronizasyonunu tetiklemek ve günlük dosyasına yazmak için hesabın erişime ihtiyacı olduğunu göz önünde bulundurun.

Başlangıç tarihini/saatini önümüzdeki dakikalara ayarlayın ve otomatik olarak başlamasını sağlayın. Manuel olarak başlatırsanız, iki eşzamanlı iş parçacığına sahip olma riskiyle karşı karşıya kalırsınız, bu da Etki Alanı Denetleyicinize ekstra yük getirecek ve günlük dosyasının içeriğini bulanıklaştıracaktır.

Program/komut dosyası yolu, PowerShell.exe dosyasının tam yolu olmalıdır. Bağımsız değişken, komut dosyası dosyasının tam yolu olmalıdır. Başlangıç klasörü, komut dosyasını içeren klasöre yapılandırılmalıdır.

Sistemin yeniden başlatılmasından sonra otomatik olarak başlatılmasını sağlamak için, görevi, zamanlanmış bir başlatma kaçırıldıktan sonra mümkün olan en kısa sürede çalışacak şekilde ayarladığınızdan emin olun.

Akıllı Çözüm

Komut dosyası kullanarak hemen hemen her sorunu çözebilirsiniz; eğer vaktiniz varsa... Ancak akıllıca çalışmayı tercih ediyorsanız, tamamen işlevsel bir ücretsiz deneme sürümü olarak sunulan Easy365Manager'a bakmanızı öneririz.

Easy365Manager, iki yeni sekme ekleyerek AD Kullanıcıları ve Bilgisayarları konsolunun işlevselliğini artırır. Yeni ayarları kullanarak, şirket içi kullanıcı hesaplarınızı her yapılandırdığınızda Azure AD Connect senkronizasyonunu otomatik olarak tetikleyebilirsiniz. Easy365Manager ayrıca Office 365 lisanslarını ve posta kutusu ayarlarını doğrudan yapılandırmanıza da olanak tanır.

AD Kullanıcıları ve Bilgisayarları, Office 365 Portalı, Azure AD Connect ve PowerShell arasında geçiş yapmak yerine Easy365Manager'ı yükleyin ve genişletilmiş AD Kullanıcıları ve Bilgisayarları konsolunda akıllıca çalışın.

Dünya çapında yolunuzu bulmaya devam etmek için aşağıdan indirin ?

Azure AD Connect Otomatik Eşitleme Betiğini İndirin

Komut dosyasının nasıl planlanacağına ilişkin ayrıntılı talimatlar için bu bölümü okuyun.

İlgili makaleler