Robocopy: ย้าย File Server ไปเครื่องใหม่ สิทธิ์ NTFS ไม่หาย

ใช้ Robocopy ย้ายข้อมูล File Server ไป Windows Server เครื่องใหม่ พร้อมสิทธิ์ NTFS เจ้าของไฟล์ และวันที่เดิม ด้วยการคัดลอกสองรอบให้ผู้ใช้หยุดงานสั้นที่สุด

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 13 นาที

แชร์FacebookXLINELinkedIn
Robocopy — Robocopy: ย้าย File Server ไปเครื่องใหม่ สิทธิ์ NTFS ไม่หาย
Robocopy: ย้าย File Server ไปเครื่องใหม่ สิทธิ์ NTFS ไม่หาย

คำตอบสั้น ๆ: ใช้ Robocopy ย้ายข้อมูล File Server ไป Windows Server เครื่องใหม่ พร้อมสิทธิ์ NTFS เจ้าของไฟล์ และวันที่เดิม ด้วยการคัดลอกสองรอบให้ผู้ใช้หยุดงานสั้นที่สุด

คู่มือนี้อธิบาย Robocopy ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

Robocopy (Robust File Copy) เป็นเครื่องมือคัดลอกไฟล์ที่มากับ Windows Server ทุกรุ่น และเป็นวิธีมาตรฐานในการย้ายข้อมูล File Server ไปเครื่องใหม่ เพราะพาสิทธิ์ NTFS เจ้าของไฟล์ และวันที่เดิมไปได้ครบ รันซ้ำได้โดยคัดลอกเฉพาะไฟล์ที่เปลี่ยน และทำงานหลายเธรดพร้อมกันได้ ต่างจากการลากวางใน Explorer ที่ไฟล์ปลายทางจะรับสิทธิ์ของโฟลเดอร์ใหม่แทนสิทธิ์เดิม

คู่มือนี้ใช้วิธีคัดลอกสองช่วง ช่วงแรกคัดลอกข้อมูลทั้งหมดขณะผู้ใช้ยังทำงานตามปกติ ช่วงสุดท้ายเก็บเฉพาะส่วนต่างในเวลาปิดระบบสั้น ๆ ผลลัพธ์คือ File Server ใหม่ที่ข้อมูลและสิทธิ์ตรงกับเครื่องเดิม โดยผู้ใช้หยุดงานเพียงไม่กี่นาทีถึงไม่กี่สิบนาที

แผนภาพการย้ายข้อมูลด้วย Robocopy ที่รันบนเครื่องใหม่ ดึงไฟล์และสิทธิ์ NTFS จาก OLDFS01 ผ่าน SMB แล้วเปิด Share ให้ผู้ใช้
รันคำสั่งบนเครื่องใหม่แบบดึงข้อมูลผ่าน Share ของระบบ D$ แล้วจึงย้ายผู้ใช้หลังรอบสุดท้าย

สิ่งที่ต้องเตรียม (Robocopy)

  • เครื่องเดิมและเครื่องใหม่ (Windows Server 2019, 2022 หรือ 2025) อยู่ในโดเมน Active Directory เดียวกัน เพื่อให้สิทธิ์ที่อ้างถึงผู้ใช้และกลุ่มโดเมนยังใช้ได้บนเครื่องใหม่
  • บัญชีที่อยู่ในกลุ่ม Administrators ของทั้งสองเครื่อง เช่น Domain Admin และเปิด PowerShell แบบ Run as administrator
  • ดิสก์ข้อมูลบนเครื่องใหม่ฟอร์แมตเป็น NTFS และมีพื้นที่มากกว่าข้อมูลจริงอย่างน้อย 20%
  • สองเครื่องคุยกันผ่าน SMB (TCP 445) ได้ ควรใช้เครือข่ายภายในของคลาวด์เพื่อความเร็วและความปลอดภัย
  • ข้อมูลสำรองของเครื่องเดิมที่กู้คืนได้จริง ดูวิธีได้ใน คู่มือ Windows Server Backup

ตัวอย่างในคู่มือนี้ใช้เครื่องเดิมชื่อ OLDFS01 และเครื่องใหม่ชื่อ NEWFS01 โดยข้อมูลอยู่ที่ D:\Shares ทั้งสองฝั่ง รันคำสั่งคัดลอกทั้งหมดบนเครื่องใหม่ในลักษณะดึงข้อมูลเข้ามา

ขั้นตอนที่ 1: สำรวจเครื่องเดิมและบันทึกการตั้งค่า Share

Robocopy คัดลอกไฟล์และสิทธิ์ NTFS แต่ไม่คัดลอกการตั้งค่า Share ให้ส่งออกรายการ Share และสิทธิ์ของ Share บนเครื่องเดิมเก็บไว้ก่อน

New-Item -ItemType Directory -Path C:\Migration -Force
Get-SmbShare -Special $false | Select-Object Name, Path, Description, FolderEnumerationMode | Export-Csv C:\Migration\shares.csv -NoTypeInformation -Encoding UTF8
Get-SmbShare -Special $false | Get-SmbShareAccess | Export-Csv C:\Migration\share-access.csv -NoTypeInformation -Encoding UTF8

จากนั้นหาสิทธิ์ที่ผูกกับบัญชีหรือกลุ่มภายในเครื่องเดิม ซึ่งจะใช้ไม่ได้บนเครื่องใหม่เพราะเป็นคนละ SID

icacls D:\Shares /T /C | Select-String 'OLDFS01\\' | Select-Object -First 20

ถ้าพบรายการ เช่น OLDFS01\Accounting ให้สร้างกลุ่มโดเมนที่มีสมาชิกเดียวกันแล้วเพิ่มสิทธิ์ให้กลุ่มโดเมนบนเครื่องเดิมก่อนย้าย กลุ่มที่ขึ้นต้นด้วย BUILTIN หรือ NT AUTHORITY ใช้ได้ทุกเครื่องจึงไม่ต้องแก้

ขั้นตอนที่ 2: ทดลองรันด้วย /L ก่อนคัดลอกจริง

คำเตือน: สวิตช์ /MIR ทำให้ปลายทางเหมือนต้นทางทุกประการ ไฟล์ใดที่อยู่ปลายทางแต่ไม่มีที่ต้นทางจะถูกลบทิ้งทันทีโดยไม่ผ่าน Recycle Bin ถ้าสลับต้นทางกับปลายทาง หรือชี้ปลายทางผิดเป็นไดรฟ์ทั้งลูก ข้อมูลจะหายจำนวนมาก จึงต้องรันแบบ /L ซึ่งแสดงรายการโดยไม่คัดลอกหรือลบอะไรก่อนทุกครั้ง

New-Item -ItemType Directory -Path D:\Shares, C:\Logs -Force
robocopy \\OLDFS01\D$\Shares D:\Shares /MIR /COPYALL /DCOPY:DAT /B /XJ /XD 'System Volume Information' '$RECYCLE.BIN' /L /NP /LOG:C:\Logs\robo-dryrun.log

ใน PowerShell ต้องครอบ '$RECYCLE.BIN' ด้วยเครื่องหมายคำพูดเดี่ยว ไม่เช่นนั้นระบบจะมองว่าเป็นตัวแปร เปิด log แล้วค้นคำว่า *EXTRA ซึ่งคือไฟล์ที่จะถูกลบออกจากปลายทาง ในการรันครั้งแรกที่ปลายทางยังว่างต้องไม่พบรายการนี้เลย

ขั้นตอนที่ 3: คัดลอกรอบแรกขณะผู้ใช้ยังทำงาน

robocopy \\OLDFS01\D$\Shares D:\Shares /MIR /COPYALL /DCOPY:DAT /B /IT /XJ /XD 'System Volume Information' '$RECYCLE.BIN' /MT:16 /R:1 /W:1 /NP /LOG:C:\Logs\robo-pass1.log
สวิตช์หน้าที่
/MIRคัดลอกทุกโฟลเดอร์ย่อยรวมโฟลเดอร์ว่าง และลบสิ่งที่ไม่มีที่ต้นทาง (เท่ากับ /E กับ /PURGE)
/COPYALLคัดลอกข้อมูล แอตทริบิวต์ เวลา สิทธิ์ NTFS เจ้าของ และข้อมูล Auditing
/DCOPY:DATรักษาแอตทริบิวต์และวันที่ของโฟลเดอร์ ไม่ให้กลายเป็นวันที่ย้าย
/Bอ่านไฟล์ในโหมด Backup จึงคัดลอกได้แม้แอดมินไม่มีสิทธิ์ในโฟลเดอร์นั้น
/ITคัดลอกไฟล์ที่ขนาดและเวลาเท่าเดิมแต่แอตทริบิวต์เปลี่ยน ช่วยจับสิทธิ์ที่แก้ระหว่างรอบ
/MT:16ทำงาน 16 เธรดพร้อมกัน เร็วขึ้นมากเมื่อมีไฟล์เล็กจำนวนมาก
/R:1 /W:1ลองใหม่ 1 ครั้ง รอ 1 วินาที ค่าเริ่มต้นคือลองล้านครั้ง ครั้งละ 30 วินาที
/XJข้าม Junction Point ป้องกันการวนลูปไม่รู้จบ

ระยะเวลาขึ้นกับจำนวนไฟล์มากกว่าขนาดรวม ข้อมูลหลายแสนไฟล์อาจใช้หลายชั่วโมง ปล่อยให้ทำงานในหน้าต่าง PowerShell ที่เปิดค้างไว้ หรือสั่งผ่าน Task Scheduler ก็ได้

ลำดับการย้าย File Server ด้วย Robocopy ตั้งแต่สำรวจ ทดลอง /L คัดลอกรอบแรก เก็บส่วนต่าง จนถึง cutover
งานหนักทั้งหมดเกิดก่อนวันย้าย รอบสุดท้ายเก็บเฉพาะไฟล์ที่เปลี่ยนจึงเสร็จเร็ว

ขั้นตอนที่ 4: รันซ้ำเก็บส่วนต่างและอ่านผลลัพธ์

รันคำสั่งเดิมซ้ำทุกคืนจนถึงวันย้ายจริง โดยเปลี่ยนชื่อไฟล์ log เป็น robo-pass2 ไปเรื่อย ๆ ครั้งหลังจะเร็วกว่ามากเพราะ Robocopy เทียบขนาดและเวลาแล้วคัดลอกเฉพาะไฟล์ที่เปลี่ยน ดูตารางสรุปท้าย log และรหัสผลลัพธ์ทันทีหลังรัน

Get-Content C:\Logs\robo-pass2.log -Tail 12
$LASTEXITCODE
Select-String -Path C:\Logs\robo-pass2.log -Pattern 'ERROR ' | Select-Object -First 20
หน้าจอ PowerShell แสดงตารางสรุปของ Robocopy รอบที่สอง ที่คัดลอกเฉพาะไฟล์ที่เปลี่ยนและไม่มีไฟล์ล้มเหลว
รอบหลังคัดลอกเฉพาะไฟล์ที่เปลี่ยน คอลัมน์ FAILED ต้องเป็น 0 ก่อนทำ cutover

รหัสต่ำกว่า 8 ถือว่าสำเร็จ รหัส 8 ขึ้นไปแปลว่ามีไฟล์ที่คัดลอกไม่ได้ ให้ดูบรรทัด ERROR ใน log ซึ่งบอกทั้งชื่อไฟล์และสาเหตุ เช่นไฟล์ถูกเปิดค้างหรือสิทธิ์ไม่พอ

ขั้นตอนที่ 5: ปิด Share เดิมและคัดลอกรอบสุดท้าย

ในช่วงเวลาที่แจ้งผู้ใช้ไว้ ให้หยุดการเขียนไฟล์บนเครื่องเดิมก่อน คำสั่งนี้ลบเฉพาะชื่อ Share ที่ส่งออกไว้ในขั้นตอนที่ 1 ข้อมูลยังอยู่ครบ และ Share ของระบบอย่าง D$ ยังใช้งานได้ ห้ามใช้กับเครื่องที่เป็น Domain Controller โดยไม่ตรวจรายการก่อน เพราะอาจลบ SYSVOL หรือ NETLOGON

# บนเครื่องเดิม OLDFS01
Import-Csv C:\Migration\shares.csv | ForEach-Object { Remove-SmbShare -Name $_.Name -Force }
Get-SmbSession | Close-SmbSession -Force

จากนั้นรันคำสั่ง Robocopy เดิมบนเครื่องใหม่อีกครั้งโดยใช้ log ชื่อ robo-final ซึ่งมักเสร็จในไม่กี่นาที ตรวจว่าแถว Files ในคอลัมน์ FAILED เป็น 0 ก่อนไปขั้นถัดไป

ขั้นตอนที่ 6: สร้าง Share บนเครื่องใหม่และย้ายผู้ใช้

คัดลอกไฟล์ CSV ทั้งสองไฟล์มาไว้ที่ C:\Migration ของเครื่องใหม่ แล้วสร้าง Share ด้วยชื่อและสิทธิ์เดิม

Import-Csv C:\Migration\shares.csv | ForEach-Object {
    New-SmbShare -Name $_.Name -Path $_.Path -Description $_.Description -FolderEnumerationMode $_.FolderEnumerationMode
}
Import-Csv C:\Migration\share-access.csv | Where-Object AccessControlType -eq 'Allow' | ForEach-Object {
    Grant-SmbShareAccess -Name $_.Name -AccountName $_.AccountName -AccessRight $_.AccessRight -Force
}
Get-SmbShare -Special $false | Get-SmbShareAccess

New-SmbShare จะใส่สิทธิ์ Everyone แบบ Read ให้อัตโนมัติ ถ้าเครื่องเดิมไม่มีรายการนี้ให้ถอดออกด้วย Revoke-SmbShareAccess สุดท้ายเปลี่ยนการแมปไดรฟ์ของผู้ใช้ให้ชี้ไป \\NEWFS01\ชื่อShare ผ่าน Drive Maps ใน Group Policy หรือสคริปต์ล็อกอินที่ใช้อยู่

ตรวจสอบว่าข้อมูลบนเครื่องใหม่ครบถ้วน

รัน Robocopy ด้วยคำสั่งเดิมแบบ /L อีกหนึ่งครั้งหลังรอบสุดท้าย ผลที่ถูกต้องคือคอลัมน์ Copied และ Extras เป็น 0 ทั้งแถว Dirs และ Files แปลว่าสองฝั่งตรงกันแล้ว จากนั้นสุ่มเทียบสิทธิ์ด้วย icacls D:\Shares\Company\Finance บนทั้งสองเครื่อง และให้ผู้ใช้จากแต่ละแผนกลองเปิดไฟล์จริง หลักการตั้งสิทธิ์ดูเพิ่มได้ใน คู่มือสิทธิ์ Share และ NTFS

ตารางความหมายของรหัสผลลัพธ์ Robocopy ตั้งแต่ 0 ถึง 8 ขึ้นไป และสิ่งที่ผู้ดูแลต้องทำในแต่ละกรณี
รหัส 0 ถึง 7 คือสำเร็จ รหัส 8 ขึ้นไปต้องตรวจ log ก่อนย้ายผู้ใช้

ปัญหาที่พบบ่อยเกี่ยวกับ Robocopy

ใช้ /MIR แล้วไฟล์ปลายทางหายไป เกิดจากอะไร?

/MIR ลบทุกอย่างที่ปลายทางซึ่งไม่มีที่ต้นทาง สาเหตุที่พบบ่อยคือสลับลำดับต้นทางกับปลายทาง ชี้ปลายทางเป็นโฟลเดอร์ที่มีข้อมูลอื่นอยู่ หรือต้นทางเข้าถึงไม่ได้ชั่วขณะแล้วถูกมองว่าว่าง ป้องกันด้วยการรัน /L ก่อนเสมอ และอย่ารัน /MIR ย้อนกลับไปที่เครื่องเดิม ถ้าไฟล์หายแล้วต้องกู้จากข้อมูลสำรองเท่านั้น

log ขึ้น ERROR 32 ไฟล์ถูกใช้งานโดยโปรเซสอื่น ต้องทำอย่างไร?

ไฟล์ถูกเปิดค้างอยู่ เช่นไฟล์ PST หรือฐานข้อมูล Access รอบแรกปล่อยข้ามไปได้เพราะตั้ง /R:1 /W:1 ไว้แล้ว ไฟล์เหล่านี้จะถูกคัดลอกในรอบสุดท้ายหลังปิด Share และตัด session ผู้ใช้ ตรวจไฟล์ที่ยังเปิดอยู่ได้ด้วย Get-SmbOpenFile บนเครื่องเดิม

สิทธิ์บนเครื่องใหม่แสดงเป็น SID ยาว ๆ แทนชื่อ ทำไม?

SID เหล่านั้นคือบัญชีหรือกลุ่มภายในของเครื่องเดิม ซึ่งเครื่องใหม่ไม่รู้จัก ให้เพิ่มสิทธิ์ให้กลุ่มโดเมนที่ทำหน้าที่เดียวกันแล้วลบ SID เดิมด้วย icacls D:\Shares\Accounting /remove *S-1-5-21-... และแก้ต้นเหตุตามขั้นตอนที่ 1 ก่อนรอบสุดท้าย

ตั้ง Robocopy ใน Task Scheduler แล้วงานขึ้นว่าล้มเหลวทั้งที่คัดลอกสำเร็จ ทำไม?

Task Scheduler มองรหัสที่ไม่ใช่ 0 ว่าล้มเหลว แต่รหัส 1 ถึง 7 คือคัดลอกสำเร็จ ให้เรียกผ่านสคริปต์ PowerShell แล้วปิดท้ายด้วย if ($LASTEXITCODE -lt 8) { exit 0 } else { exit $LASTEXITCODE } ดูวิธีตั้งงานได้ใน คู่มือ Task Scheduler

ถ้าต้องการย้าย File Server ขนาดใหญ่ขึ้นคลาวด์โดยไม่กระทบการทำงาน ติดต่อทีมงาน THAI DATA CLOUD เพื่อวางแผนร่วมกัน หรือดูเครื่องปลายทางที่ Cloud Windows Server รายละเอียดสวิตช์ทั้งหมดอ่านได้จาก เอกสาร robocopy บน Microsoft Learn

สรุปขั้นตอน Robocopy

ทบทวน Robocopy ทั้งหมดตามลำดับ ก่อนนำไปใช้กับระบบจริง

  1. สำรวจเครื่องเดิมและบันทึกการตั้งค่า Share
  2. ทดลองรันด้วย /L ก่อนคัดลอกจริง
  3. คัดลอกรอบแรกขณะผู้ใช้ยังทำงาน
  4. รันซ้ำเก็บส่วนต่างและอ่านผลลัพธ์
  5. ปิด Share เดิมและคัดลอกรอบสุดท้าย
  6. สร้าง Share บนเครื่องใหม่และย้ายผู้ใช้

เมื่อทำครบทุกข้อแล้ว Robocopy จะพร้อมใช้งาน หากผลลัพธ์ไม่เป็นไปตามที่คาด ให้ย้อนกลับไปดูหัวข้อปัญหาที่พบบ่อยด้านบน ซึ่งรวบรวมกรณีที่พบจริงจากการใช้งาน Robocopy ไว้แล้ว

อ่านเพิ่มเติมเกี่ยวกับ Robocopy

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน