Azure AD Connect - ซิงค์อัตโนมัติเมื่อมีการเปลี่ยนแปลงผู้ใช้
ตามที่อธิบายไว้ในโพสต์แยกต่างหาก Azure AD Connect จะซิงโครไนซ์การเปลี่ยนแปลง Active Directory กับ Azure ทุก ๆ 30 นาทีตามค่าเริ่มต้น ซึ่งหมายความว่าการเปลี่ยนแปลงผู้ใช้ภายในองค์กร (ยกเว้นการเปลี่ยนรหัสผ่าน) อาจใช้เวลานานถึง 30 นาทีก่อนที่จะปรากฏใน Azure/Office 365
สำหรับผู้ดูแลระบบส่วนใหญ่ สิ่งนี้ยังหมายถึงการซิงโครไนซ์ Azure AD Connect ด้วยตนเองอีกมากมาย ทั้งคุณและผู้ใช้ของคุณไม่ต้องการรอถึงครึ่งชั่วโมงก่อนที่จะทดสอบนามแฝงอีเมลใหม่ที่คุณเพิ่งกำหนดค่าบนออบเจ็กต์ผู้ใช้ภายในองค์กร...
แล้วจะทำยังไงกับมันล่ะ?
เราไม่สามารถตั้งค่า Azure AD Connect ให้ซิงโครไนซ์ทุกนาทีได้หรือไม่ น่าเสียดายที่ไม่ใช่... กำหนดการที่ใช้บ่อยที่สุดที่อนุญาตคือค่าเริ่มต้น 30 นาทีตามที่กำหนดโดยแอตทริบิวต์ AllowedSyncCycleInterval ของ ADSyncScheduler มีการกำหนดค่าตามการออกแบบและไม่สามารถตั้งค่าแบบผู้ดูแลระบบได้
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
ตอนนี้อะไร??? จะดีกว่าไหมถ้า Azure AD Connect เพิ่งตัดสินใจทำการซิงโครไนซ์อัตโนมัติทุกครั้งที่เราสร้างหรืออัปเดตออบเจ็กต์ผู้ใช้ แน่นอน ทำไมจะไม่ได้!? ไปกันเถอะ…
“ซิงโครไนซ์ Azure AD Connect โดยอัตโนมัติกับทุกการเปลี่ยนแปลงออบเจ็กต์ผู้ใช้ภายในองค์กร” - สคริปต์ PowerShell!
การสืบค้น Active Directory LDAP ค่อนข้างรวดเร็วตราบใดที่คุณจำกัดความซับซ้อนของการสืบค้น อย่ารวมแอตทริบิวต์ที่ไม่ได้จัดทำดัชนีมากเกินไปในการสืบค้นของคุณ และ อย่าดึงแอตทริบิวต์มากเกินไป ในสถานการณ์ส่วนใหญ่ คุณควรจะสามารถเรียกใช้การค้นหาผู้ใช้ที่กรองแอตทริบิวต์ whenChanged ได้ในเวลาไม่ถึงวินาที นั่นคือเว้นแต่ว่า DC ของคุณจะถูกกดหาทรัพยากรแล้ว และ/หรือหากจำนวนผู้ใช้ของคุณเกินกว่า 5,000 คน
เพื่อทดสอบประสิทธิภาพ DC ของคุณ ให้ลองกำหนดเวลาโค้ดด้านล่างบนระบบของคุณ (จะได้รับคุณลักษณะพื้นฐานสำหรับผู้ใช้ทั้งหมดที่มีการเปลี่ยนแปลงภายในสัปดาห์ที่ผ่านมา):
Import-Module ActiveDirectory
$OneWeekAgo = (Get-Date) + (New-TimeSpan -Days -7)
[array]$Users = Get-ADUser -Filter 'whenChanged -gt $OneWeekAgo'หากการสืบค้น (บรรทัดที่ 3) ใช้เวลามากกว่าสองสามวินาทีในการดำเนินการ ให้ตรวจสอบสาเหตุ หาก DC ของคุณประมวลผลการสืบค้นอย่างมีประสิทธิภาพ คุณไม่ควรใช้กำหนดการ 15 วินาทีตามที่แนะนำในบทความนี้
แต่ถ้าโค้ดข้างต้นถูกดำเนินการภายในเวลาประมาณหนึ่งวินาทีหรือน้อยกว่านั้น ฉันจะบอกว่ามันสมเหตุสมผลที่จะรันโค้ดทุกๆ 15 วินาทีกับหนึ่งใน Domain Controller ของคุณ
ระยะเวลาและการควบคุมสคริปต์โดยใช้ไฟล์บันทึก
หลังจากยืนยันผลกระทบต่ำของแบบสอบถาม whenChanged แล้ว มาลองจัดโครงสร้างกัน เราต้องการสิ่งต่อไปนี้:
- เรียกใช้การสืบค้นเพื่อดูว่าผู้ใช้มีการเปลี่ยนแปลงหรือไม่นับตั้งแต่ครั้งล่าสุดที่เราเรียกใช้การสืบค้น
- หากผู้ใช้มีการเปลี่ยนแปลง ให้ทริกเกอร์การซิงโครไนซ์ Azure AD Connect
- เมื่อเสร็จแล้ว ให้รอ 15 วินาทีก่อนเริ่มใหม่
มีหลายวิธีในการควบคุมโฟลว์นี้ ฉันชอบใช้ไฟล์บันทึกเนื่องจากจัดการได้ค่อนข้างง่ายและให้ประโยชน์มากมาย เช่น ประวัติการดำเนินการและข้อมูลการแก้ไขปัญหา
ไฟล์บันทึกควรดำเนินการดังต่อไปนี้:
เขียนเวลาที่เราทำแบบสอบถาม (เพื่อให้เรารู้ว่าจะต้องย้อนกลับไปค้นหาการเปลี่ยนแปลงของผู้ใช้ในครั้งถัดไปที่เราเรียกใช้สคริปต์):
$Now = Get-Date
$Now.ToString("yyyyMMddHHmmss") + " Some status info." | Out-File $LogFile -Appendอ่านครั้งล่าสุดที่เราสร้างข้อความค้นหาและตรวจสอบผู้ใช้และกลุ่มที่มีการเปลี่ยนแปลงตั้งแต่นั้นมา:
$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
}
(การตั้งค่าเวลาการซิงโครไนซ์ครั้งล่าสุดเป็นวันที่ 1 มกราคม 1999 จะทำให้แน่ใจได้ว่าจำนวนผู้ใช้ที่เปลี่ยนแปลงในการรันครั้งถัดไปมากกว่า 0 และด้วยเหตุนี้ จะทริกเกอร์การซิงค์เดลต้า Azure AD Connect)
การสรุปสคริปต์การซิงโครไนซ์ Azure AD Connect
เมื่อกำหนดรายละเอียดทั้งหมดแล้ว เราก็พร้อมที่จะกำหนดเวลาแล้ว ในส่วนของการจัดกำหนดการ ผู้ดูแลระบบบางคนเลือกที่จะรวมงานตามกำหนดเวลาไว้บนเซิร์ฟเวอร์แบตช์เฉพาะเพื่อติดตามการทำงานอัตโนมัติ เพื่อสนับสนุนสิ่งนี้ เราจำเป็นต้องใช้การควบคุมระยะไกลซึ่งต้องมีการปรับแต่งเล็กน้อยเพื่อดำเนินการจัดการข้อผิดพลาดอย่างเหมาะสม
ด้านล่างนี้คุณจะพบกับสคริปต์สุดท้ายทั้งหมด
# 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
}ขอขอบคุณ Phil Ready จากหน่วยงานคุ้มครองสิ่งแวดล้อมในนิวซีแลนด์ที่แนะนำการเปลี่ยนแปลงกลุ่มในการสแกน AD!
การกำหนดเวลาสคริปต์การซิงโครไนซ์
หากต้องการซิงโครไนซ์สคริปต์ให้ใช้การตั้งค่าด้านล่างจากตัวกำหนดเวลางาน สคริปต์ได้รับการกำหนดค่าให้ทำงานเป็นเวลาห้านาที และผู้กำหนดเวลางานควรเริ่มงานทุกๆ ห้านาที การรวมกันนี้ช่วยให้มั่นใจได้ว่าคุณจะทำงานได้อย่างมั่นคงตลอดเวลา โปรดปฏิบัติตามคำแนะนำเหล่านี้เพื่อหลีกเลี่ยงไม่ให้สคริปต์หลายตัวทำงานพร้อมกันหรือไม่มีสคริปต์ทำงานเลย
ตรวจสอบให้แน่ใจว่าใช้บัญชีบริการ/แบทช์ด้วยรหัสผ่านที่ไม่มีวันหมดอายุ นอกจากนี้ ให้พิจารณาว่าบัญชีจำเป็นต้องเข้าถึงเพื่อทริกเกอร์การซิงโครไนซ์ Azure AD Connect และเขียนลงในไฟล์บันทึก
ตั้งวันที่/เวลาเริ่มต้นภายในนาทีถัดไปและปล่อยให้เริ่มต้นโดยอัตโนมัติ หากคุณเริ่มต้นด้วยตนเอง คุณอาจเสี่ยงที่จะมีเธรดสองเธรดพร้อมกัน ซึ่งจะทำให้ Domain Controller ของคุณมีภาระเพิ่มขึ้น และทำให้เนื้อหาของไฟล์บันทึกเบลอ
เส้นทางโปรแกรม/สคริปต์ควรเป็นเส้นทางแบบเต็มไปยังไฟล์ PowerShell.exe อาร์กิวเมนต์ควรเป็นเส้นทางแบบเต็มไปยังไฟล์สคริปต์ ควรกำหนดค่าโฟลเดอร์เริ่มต้นให้กับโฟลเดอร์ที่มีไฟล์สคริปต์
ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่างานให้รันโดยเร็วที่สุดหลังจากพลาดการเริ่มตามกำหนดเวลา เพื่อให้งานเริ่มโดยอัตโนมัติหลังจากรีบูตระบบ
โซลูชั่นอัจฉริยะ
คุณสามารถแก้ไขปัญหาใดๆ ก็ได้โดยใช้สคริปต์ หากคุณมีเวลา... แต่หากคุณต้องการ ทำงานอย่างชาญฉลาด เราขอแนะนำให้คุณดูที่ Easy365Manager ซึ่งเปิดให้ทดลองใช้งานฟรีเต็มรูปแบบ
Easy365Manager เพิ่มฟังก์ชันการทำงานของคอนโซลผู้ใช้ AD และคอมพิวเตอร์โดยการเพิ่มแท็บใหม่สองแท็บ เมื่อใช้การตั้งค่าใหม่ คุณสามารถทริกเกอร์การซิงโครไนซ์ Azure AD Connect ได้โดยอัตโนมัติทุกครั้งที่คุณกำหนดค่าบัญชีผู้ใช้ภายในองค์กร Easy365Manager ยังช่วยให้คุณกำหนดค่าใบอนุญาต Office 365 และการตั้งค่ากล่องจดหมายได้โดยตรง
แทนที่จะสลับไปมาระหว่างผู้ใช้ AD และคอมพิวเตอร์, พอร์ทัล Office 365, Azure AD Connect และ PowerShell ให้ติดตั้ง Easy365Manager และ ทำงานอย่างชาญฉลาด ในคอนโซลผู้ใช้ AD และคอมพิวเตอร์แบบขยาย.
หากต้องการเขียนสคริปต์ท่องโลกต่อไป ดาวน์โหลดด้านล่าง ?
ดาวน์โหลดสคริปต์การซิงค์อัตโนมัติของ Azure AD Connect
สำหรับคำแนะนำโดยละเอียดเกี่ยวกับวิธีกำหนดเวลาสคริปต์ โปรดอ่านส่วนนี้





