คำตอบสั้น ๆ: ใช้ Robocopy ย้ายข้อมูล File Server ไป Windows Server เครื่องใหม่ พร้อมสิทธิ์ NTFS เจ้าของไฟล์ และวันที่เดิม ด้วยการคัดลอกสองรอบให้ผู้ใช้หยุดงานสั้นที่สุด
คู่มือนี้อธิบาย Robocopy ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Robocopy (Robust File Copy) เป็นเครื่องมือคัดลอกไฟล์ที่มากับ Windows Server ทุกรุ่น และเป็นวิธีมาตรฐานในการย้ายข้อมูล File Server ไปเครื่องใหม่ เพราะพาสิทธิ์ NTFS เจ้าของไฟล์ และวันที่เดิมไปได้ครบ รันซ้ำได้โดยคัดลอกเฉพาะไฟล์ที่เปลี่ยน และทำงานหลายเธรดพร้อมกันได้ ต่างจากการลากวางใน Explorer ที่ไฟล์ปลายทางจะรับสิทธิ์ของโฟลเดอร์ใหม่แทนสิทธิ์เดิม
คู่มือนี้ใช้วิธีคัดลอกสองช่วง ช่วงแรกคัดลอกข้อมูลทั้งหมดขณะผู้ใช้ยังทำงานตามปกติ ช่วงสุดท้ายเก็บเฉพาะส่วนต่างในเวลาปิดระบบสั้น ๆ ผลลัพธ์คือ File Server ใหม่ที่ข้อมูลและสิทธิ์ตรงกับเครื่องเดิม โดยผู้ใช้หยุดงานเพียงไม่กี่นาทีถึงไม่กี่สิบนาที
สิ่งที่ต้องเตรียม (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 ก็ได้
ขั้นตอนที่ 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
รหัสต่ำกว่า 8 ถือว่าสำเร็จ รหัส 8 ขึ้นไปแปลว่ามีไฟล์ที่คัดลอกไม่ได้ ให้ดูบรรทัด ERROR ใน log ซึ่งบอกทั้งชื่อไฟล์และสาเหตุ เช่นไฟล์ถูกเปิดค้างหรือสิทธิ์ไม่พอ