Robocopy bị từ chối


11

Robocopy được cài đặt sẵn với Windows 7. Tôi đã sử dụng nó nhiều lần trong quá khứ. Tôi đã cố gắng sao chép một thư mục vào một chia sẻ từ xa với

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

Kết quả là tôi được phép từ chối. Sử dụng explorer tôi có thể sao chép các tập tin vào chia sẻ này. Tôi đã mở một dấu nhắc lệnh với quyền của quản trị viên với cùng kết quả. Chia sẻ là đọc / viết cho công chúng.

EDIT Tôi đã lập bản đồ thành công cho một người lái xe để chia sẻ, nhưng việc sao chép vẫn thất bại

EDIT Tôi đã thêm công tắc / B mà không thành công. Lỗi chính xác là:

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

Bạn đã thử ánh xạ thư mục chia sẻ vào một ký tự ổ đĩa?
CGA

Có tôi đã thử nó đầu tiên. Kết quả tương tự
Edosoft

Bạn đã thử sở hữu thư mục dùng chung chưa? Bạn đang ở trong một nhóm làm việc hoặc một miền thư mục hoạt động?
CGA

Tôi đang sử dụng một nhóm làm việc. Tôi đã có quyền sở hữu.
Edosoft

Nếu bạn sử dụng tham số / V, chế độ Verbose có cung cấp cho bạn bất kỳ thông tin nào khác không? Lỗi 5 thường là một tin nhắn bị từ chối truy cập. Từ một dấu nhắc lệnh, bạn có thể sử dụng lệnh COPY không? Điều này có hoạt động với các UNC khác hay là Dropbo là người duy nhất thất bại? Nếu vậy, người dân Dropbo có thể là nơi tốt nhất để tìm câu trả lời.
Jeffery Hicks

Câu trả lời:


12

Trích dẫn từ đây :

Trong trường hợp của tôi, tôi bắt đầu với toàn quyền kiểm soát cả cổ phiếu nguồn và cổ phiếu đích. Vấn đề là Robocopy đã đặt lại ACL trên chia sẻ đích thành giá trị null (không ai có quyền) trước khi nó bắt đầu đệ quy các thư mục con. Sau một số thử nghiệm nhanh, kết luận của tôi là Robocopy không xử lý các quyền được kế thừa. Giả sử bạn đang sao chép C: \ Share1 sang D: \ và C: \ Share1 đang kế thừa các quyền của nó từ thư mục gốc C: \, nó thực sự không có ACL rõ ràng. Do đó, khi bạn sao chép ACL của nó, bạn thực sự đang sao chép ... không có gì. Bằng cách sao chép một ACL trống vào đích của bạn, các quyền của bạn sẽ bị xóa trong bước đầu tiên của bản sao và tất cả các lần ghi tiếp theo vào chia sẻ đều thất bại với Lỗi 5.

Đây chỉ là một vấn đề khi bạn đang sao chép từ một nguồn mà bạn đang truy cập VỚI quyền được thừa kế và đích mà bạn đang truy cập mà KHÔNG có quyền được thừa kế. Nếu bạn sao chép C: \ (có rõ ràng trong ACL của nó), sang D: \, không có vấn đề gì. Nếu đây thực sự là vấn đề của bạn, bạn có thể giải quyết nó bằng cách thêm chính mình vào ACL nguồn với toàn quyền kiểm soát. Khi bản sao chạy, mục nhập ACL của bạn được sao chép đến đích và các bản sao tệp tiếp theo có thể được viết. Bạn có thể hoàn tác các thay đổi của mình (trên cả nguồn và đích) sau khi bản sao hoàn tất.

Nếu bạn tiếp tục gặp sự cố bất chấp những điều trên, bạn có thể muốn xem xét thử chuyển đổi / B, cố gắng sao lưu tệp bằng các đặc quyền của bạn làm Toán tử dự phòng. Điều này sẽ cho phép bạn sao chép các tệp mà bạn không thể, ví dụ, nếu bạn không ở trên ACL trên chia sẻ đích của mình. Robocopy mặc định để thử một bản sao có thể khởi động lại. Bằng cách từ bỏ các bản sao có thể khởi động lại, trường hợp xấu nhất là bạn mất tập tin hiện đang được chuyển trong trường hợp bị gián đoạn. Pass tiếp theo sẽ khởi động lại tập tin đó từ đầu thay vì giữa chừng.

Mong rằng sẽ giúp. Đây là một trích dẫn từ tài liệu Robocopy của Microsoft về chuyển đổi / B:

Trích dẫn:

Nếu bạn sao chép thông tin bảo mật NTFS (ACL) cùng với dữ liệu tệp, có thể sao chép các tệp mà bạn có quyền truy cập đọc, nhưng không thể truy cập ghi. Sau khi một tệp như vậy được sao chép một lần và các ACL được áp dụng, bạn có thể thấy rằng để nhận được một lỗi Truy cập bị từ chối khi bạn cố gắng sao chép lại tệp. Trong tình huống này, bạn nên sử dụng công tắc / B hoặc / ZB để sao chép các tệp trong Chế độ sao lưu.

/ B sao chép tất cả các tệp với ngữ nghĩa sao lưu (Chế độ sao lưu). / ZB trước tiên cố gắng sao chép các tệp ở chế độ có thể khởi động lại (để có khả năng phục hồi cao hơn) nhưng nếu lỗi đó không xảy ra với lỗi Truy cập từ chối, thì nó sẽ tự động thử lại bản sao bằng Chế độ sao lưu.



2

Ngoài các câu trả lời trước, tôi có thể mở rộng với bản sửa lỗi phù hợp với mình. Trong trường hợp của tôi, tôi có các thư mục và tệp cục bộ là quyền sở hữu đã được yêu cầu bởi một người dùng khác trên hệ thống. Tôi chỉ đơn giản tuyên bố quyền sở hữu của tất cả các thư mục và thư mục con và mọi thứ đều hoạt động tốt mà không cần chuyển đổi dự phòng.

Yêu cầu quyền sở hữu một thư mục và các thư mục phụ của nó: http://technet.microsoft.com/en-us/magazine/ff404240.aspx


Vì vậy, trong trường hợp này, thư mục phải được xác nhận quyền sở hữu bởi tài khoản người dùng tập lệnh bó?
Kỹ sư hệ thống cao cấp

1

Bạn cũng có thể viết một kịch bản để sửa lỗi này tự động

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

}

Điều đáng chú ý là tập lệnh này được sử dụng với Windows Powershell.
Kevin Fegan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.