ปฏิเสธการอนุญาต Robocopy


11

Robocopy ได้รับการติดตั้งมาพร้อมกับ Windows 7 แล้วฉันเคยใช้มาแล้วหลายครั้ง ฉันพยายามคัดลอกโฟลเดอร์ไปยังการแชร์ระยะไกลด้วย

robocopy c:\source "\\server\share\path" /s /r:2 /w:2` 

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

แก้ไขฉันได้ทำการแมปตัวกระจายสัญญาณกับการแชร์เรียบร้อยแล้ว แต่ robocopy ยังคงล้มเหลว

แก้ไข ฉันได้เพิ่มสวิตช์ / B โดยไม่สำเร็จ ข้อผิดพลาดที่แน่นอนคือ:

2009/09/26 20:43:14 ERROR 5 (0x00000005) 
    Accessing Destination Directory \\drobo\Drobo\fotos\__NEW\Ericsson\

คุณได้ลองแมปโฟลเดอร์ที่แชร์ไปยังตัวอักษรชื่อไดรฟ์แล้วหรือยัง?
CGA

ใช่ฉันลองก่อน ผลลัพธ์เดียวกัน
Edosoft

คุณพยายามเป็นเจ้าของโฟลเดอร์แชร์แล้วหรือยัง คุณอยู่ในเวิร์กกรุ๊ปหรือโดเมน Active Directory หรือไม่
CGA

ฉันใช้เวิร์กกรุ๊ป ฉันเป็นเจ้าของ
Edosoft

หากคุณใช้พารามิเตอร์ / V โหมด Verbose จะให้ข้อมูลอื่นกับคุณหรือไม่? ข้อผิดพลาด 5 มักเป็นข้อความปฏิเสธการเข้าถึง จากพรอมต์คำสั่งคุณสามารถใช้คำสั่ง COPY ได้หรือไม่ สิ่งนี้ใช้ได้กับ UNC อื่น ๆ หรือ Drobo เป็นอันเดียวที่ล้มเหลวหรือไม่? ถ้าเป็นเช่นนั้นคน Drobo อาจเป็นสถานที่ที่ดีที่สุดที่จะตอบคำถาม
Jeffery Hicks

คำตอบ:


12

ยกมาจากที่นี่ :

ในกรณีของฉันฉันเริ่มต้นด้วยการควบคุมเต็มรูปแบบทั้งที่มาและที่แชร์ปลายทาง ปัญหาคือ Robocopy กำลังรีเซ็ต ACL บนการแชร์ปลายทางเป็นค่า Null (ไม่มีใครได้รับอนุญาต) ก่อนที่จะเริ่มการเรียกไดเรกทอรีย่อยซ้ำ หลังจากการทดสอบอย่างรวดเร็วข้อสรุปของฉันคือ Robocopy ไม่ได้รับการอนุญาตที่สืบทอดมา สมมติว่าคุณกำลังคัดลอก C: \ Share1 ถึง D: \, และ C: \ Share1 กำลังสืบทอดสิทธิ์จากไดเรกทอรี C: \ root จริง ๆ แล้วมันไม่มี ACL ที่ชัดเจน ดังนั้นเมื่อคุณคัดลอก ACL ของจริงคุณกำลังคัดลอก ... ไม่มีอะไร ด้วยการคัดลอก ACL ที่ว่างไปยังปลายทางของคุณการอนุญาตของคุณจะถูกลบในขั้นตอนแรกของการคัดลอกและการเขียนที่ตามมาทั้งหมดไปยังการแชร์ล้มเหลวด้วยข้อผิดพลาด 5

นี่เป็นปัญหาเมื่อคุณคัดลอกจากแหล่งที่คุณเข้าถึงด้วยสิทธิ์ที่สืบทอดมาและปลายทางที่คุณเข้าถึงโดยไม่ได้รับอนุญาต หากคุณคัดลอก C: \ (ซึ่งมีคุณอย่างชัดเจนใน ACL) ไปที่ D: \ จะไม่มีปัญหา หากนี่เป็นปัญหาของคุณคุณสามารถแก้ไขได้ด้วยการเพิ่ม ACL แหล่งที่มาด้วยการควบคุมเต็มรูปแบบ เมื่อการคัดลอกทำงานรายการ ACL ของคุณจะถูกทำซ้ำไปยังปลายทางและสามารถคัดลอกไฟล์ที่ตามมาได้ คุณสามารถยกเลิกการเปลี่ยนแปลงของคุณได้ (ทั้งต้นทางและปลายทาง) หลังจากการคัดลอกเสร็จสิ้น

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

หวังว่าจะช่วย นี่เป็นคำพูดจาก Robocopy doc ของ Microsoft เกี่ยวกับสวิตช์ / B:

อ้างถึง:

หากคุณคัดลอกข้อมูลความปลอดภัย NTFS (ACLs) พร้อมกับข้อมูลไฟล์เป็นไปได้ที่จะคัดลอกไฟล์ที่คุณมีสิทธิ์เข้าถึงแบบอ่าน แต่ไม่สามารถเข้าถึงการเขียน หลังจากไฟล์ดังกล่าวถูกคัดลอกหนึ่งครั้งและมีการใช้ ACL คุณอาจพบว่าได้รับข้อผิดพลาด“ Access Denied” เมื่อคุณพยายามคัดลอกไฟล์อีกครั้ง ในสถานการณ์นี้คุณควรใช้สวิตช์ / B หรือ / ZB เพื่อคัดลอกไฟล์ในโหมดสำรอง

/ B คัดลอกไฟล์ทั้งหมดด้วยซีแมนทิกส์สำรอง (โหมดสำรอง) / ZB พยายามคัดลอกไฟล์ในโหมดเริ่มต้นใหม่ (เพื่อความยืดหยุ่นที่มากขึ้น) แต่หากล้มเหลวด้วยข้อผิดพลาด“ Access Denied” ข้อผิดพลาดจะลองคัดลอกโดยอัตโนมัติโดยใช้โหมดสำรอง



2

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

อ้างสิทธิ์ความเป็นเจ้าของโฟลเดอร์และโฟลเดอร์ย่อย: http://technet.microsoft.com/en-us/magazine/ff404240.aspx


ดังนั้นในกรณีนี้จะต้องอ้างสิทธิ์ความเป็นเจ้าของโดยบัญชีผู้ใช้ชุดสคริปต์?
วิศวกรระบบอาวุโส

1

คุณยังสามารถเขียนสคริปต์เพื่อแก้ไขปัญหานี้โดยอัตโนมัติ

# To run robocopy with logging which logs errors
robocopy source dest /MIR /NP /TEE /R:0 /W:1 /FFT /LOG+:log.txt 

# get errors from log and use set-content so it only writes if there are errors.
get-content log.txt | select-string "0x00000005" | set-content errors.log

#if statements to check if it even had errors.  only if errors go into if statement.
if (test-path errors.log) {

    #now capture the paths exactly.  Get-unique so it writes one error only once. 
    #Will assume you're using UNCs to copy vs. drive letters, please modify as necessary
    select-string -path errors.log -pattern "\\\\.*$" | %{ $_.Matches[0].captures[0].value} | get-unique > paths.log

    #just do foreach loop for each path.
    foreach ($path in $paths) { 

        #use subinacl to take ownership and assign permissions, it is better and faster 
        #than icacls and ps ways but you can use whatever works.  Report the changes you 
        #made.  if '$path' is a folder then you will need to modify subinacl command to 
        #inherit etc.  look it up.
        .\subinacl /file "$path" /setowner="YOUR ID" >> change-perms.log
        .\subinacl "$path" /grant="your ID"=F >> change-perms.log

    }

    #run your robocopy command again to copy missed file in previous step. 
    robocopy source dest /MIR /NP /TEE /R:0 /W:1 /FFT /LOG+:log.txt 

    #Delete the error log file so it does not go in to if loop next time you run.
    remove-item error.log (use force, erroraction etc as necessary)

}

เป็นที่น่าสังเกตว่าสคริปต์นี้ใช้กับ Windows Powershell
Kevin Fegan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.