Скопировать папку с правами доступа

В данной статье попытаюсь описать свое решение такой достаточно распространенной задачи, как синхронизация содержимого двух папок, расположенных на разных серверах. Допустим, у вас есть 2 сервера: buh1 и buh2, в конце дня все измененные файлы должны копироваться с одного сервера на другой, кроме того все права доступа NTFS должны остаться теми же самыми, что и у исходных файлов.

Мое решение основываемся на использовании утилиты robocopy. Как я уже писал ее можно использовать для организации системы резервного копирования и синхронизации файлов.

Сначала необходимо убедиться, что на обоих серверах программа robocopy.exe находится по одному и тому же пути (обычно это каталог C:Windowssystem32).

Для осуществления схемы синхронизации каталогов, на первом шаге мы мапим (диск Z:) на первый сервер папку с другого файлового сервера (предварительно необходимо убедиться, что буква диска не занята). Далее вызываем robocopy, которая осуществляет синхронизацию файлов. Параметр команды “/sec” – говорит о том, что необходимо копировать и права доступа NTFS на файлы. Кроме того, скрипт создает лог, который можно использовать для дальнейшего разбора полетов.

Скрипт выглядит следующим образом:

Осталось создать bat файл и новое задание в планировщике Windows.

Вот и все, так просто и быстро без использования сторонних утилит (ведь в Windows 2008 Server уже включена по-умолчанию утилита robocopy), мы реализовали систему синхронизации двух папок с сохранением прав доступа NTFS.

Файловая система NTFS с помощью списка контроля доступа (Access Control List, ACL) позволяет гибко организовывать и контролировать доступ к файлам и папкам в системе, раздавать разрешения пользователям или другим объектам. Однако при простом копировании или перемещении объектов ACL разрешения теряются.

Заново выставлять все права вручную в сложной файловой системе с кучей пользователей. занятие для человека с железными яйцами нервами или кому просто больше не чем заняться.

Самый простой способ сохранить права доступа при копировании – воспользоваться Total Commander. Если вы не любите или боитесь работать в командной строке, то это ваш вариант. При копировании/переносе просто отметьте галочкой чекбокс «Copy NTFS permissions».

Возможности командной строки всегда выше, нежели возможности настройки через интерфейс. Более универсальный способ, воспользоваться командой xcopy.

Читайте также:  Программа найти айфон через компьютер

Команда XCOPY

XCOPY более продвинутый вариант команды COPY, но в отличие от последней умеет работать с сетевыми путями и копировать сведения о владельце и данные ACL объекта, то есть права доступа к файлам и папкам в системе NTFS. Синтаксис команды предельно простой:

xcopy источник [назначение] параметры

Допустим нам необходимо сделать резервную копию каталога баз данных 1С D:ases1C на сетевой накопитель NAS с сохранением списков доступа. Вот как будет выглядеть соответствующая команда:

xcopy D:ases1C \NASackup1c /E /O

  • параметр /Е – копирует каталоги с подкаталогами, включая пустые
  • параметр /О – копирует сведения о владельце и ACL

В большинстве случаев этих двух параметров достаточно, полный список можно посмотреть xcopy /?

ICACLS

Утилита ICACLS пришла на смену CACLS из Windows XP. Позволяет отображать и изменять списки управления доступом (Access Control Lists (ACLs) ) к файлам и папкам файловой системы, сохранять список доступа указанного объекта в файл и затем применить этот список к указанному объекту, то есть делать резервную копию прав доступа к объекту.

Приведу наиболее интересный пример использования ICACLS:

icacls c:каталог /save name /t icacls c:другой_каталог /restore name

Итак, первой командой ICACLS создаем резервную копию прав доступа указанного объекта и сохраняем его в файл с именем name. Второй командой применяем резервную копию для другого объекта. Таким образом можно существенно упростить процесс переноса прав доступа с одного каталога на другой.

Стоит отметить, что файл с правами доступа по умолчанию сохраняется в корневую папку активного пользователя. С полным списком возможностей утилиты можно ознакомиться введя команду icacls /?

Если считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.

Возникла необходимость перенести файлы из одной сетевой шары на линуксе на другой сервер. Оба сервера включены в домен AD. Казалась бы простая задача, бери да копируй. Права доступа должны сохраниться, ведь обе машины в одном и то же домене. Но все оказалось не так просто.

Для меня было большим удивлением, что при простом копировании через windows машину права доступа не сохранялись. На обоих серверах была файловая система с поддержкой ACL. Установить потом права вручную можно было. То есть функционал весь был, но права доступа не сохранялись. Отмечу сразу, что сервер, с которого забирал информацию был QNAP, копировал на CentOS 7.

Читайте также:  Сколько стоит gt 240

Вторым этапом была попытка примонтировать сразу на сервер приемник файловую шару через cifs. Но при этом права доступа ACL тоже не копировались. Стал искать информацию на эту тему в интернете и нашел, что действительно, через cifs acl права не переносятся. Там есть свои утилиты для проверки и назначения прав: getcifsacl и setcifsacl. Вручную ковыряться с этим не захотелось.

Следующим этапом была попытка использовать утилиту от Microsoft — Robocopy. Понравился ее функционал, она действительно все копирует с сохранением прав доступа и другой информации о файлах. Но вот незадача. После копирования данных с одной файловой шары на другую, появлялись права доступа в виде неизвестных SID и не переводились в группы и пользователи. Ну и доступ, соответственно, не работал. Не понимаю, почему так получалось.

Я крепко призадумался, как же быть. У меня не было времени разбираться подробно, нужно было быстро что-то придумать. Возможно я где-то ошибся или невнимательно смотрел и этот процесс все же можно провести быстро. Был бы рад совету на эту тему. Раньше мне не приходилось заниматься переносом данных с samba шар с сохранением доступа. А данные с виндовых шар без проблем переносятся с сохранением прав доступа. Даже не знал, что могут возникнуть такие проблемы при переносе информации с шар на samba.

В итоге для переноса данных с сохранением прав доступа ACL я поступил следующим образом. На первом сервере, где лежали данные выполнил команду:

Команда рекурсивно собрала права доступа со всех каталогов и файлов и записала в текстовый файл. Если шара очень большая, то файл будет внушительных размеров. У меня на шаре с 80 000 каталогов и 500 000 файлов такой файл занимал 240мб. Дальше было бы здорово сделать на сервере приемнике команду:

Читайте также:  Программа для преобразования фотографий

И на этом закончить. Но все не так просто. Во-первых, в полученном файле были указаны пути в следующем формате:

Почему-то в начале пути не стоял слеш. Команда setfacl сразу на это ругнулась. Плюс на сервере приемнике был другой путь, значит, его нужно отредактировать для всех описываемых объектов прав доступа во всем 240мб файле. Просто открыть его в текстовом редакторе и сделать замену затруднительно. Пришлось искать другое решение. На помощь пришла утилита sed:

С помощью этой команды я заменил фразу share/MD1_DATA на /shares и получил теперь правильный путь /shares/soft/Player.

Но это было не все. Дальше в файле с правами доступа встречались не доменные пользователи, а локальные того сервера, с которого переезжали. Нужно было их тоже всех удалить, иначе команда не отрабатывала, вылетала с ошибкой. В моем случае это были пользователи: admin, guest, everyone. Я опять же с помощью sed просто удалил все строки, где встречались эти фразы. Делал это на всякий случай поэтапно с проверкой на каждом этапе. Получилось вот так:

Можно было все в одной команде сделать, но я не очень силен в построении регулярных выражений, не было времени разбираться, сделал так. Утилита на удивление быстро работает. Буквально 2-3 секунды и строки удалены из файла.

После этого на сервере приемнике запустил команду:

И все доменные права доступа благополучно установились. Утилита работала достаточно долго, минут 15.

Надеюсь, мой опыт покажется кому-то полезным. А еще лучше, если бы мне кто-нибудь подсказал, как ту же самую операцию сделать проще и быстрее. Я почему-то убежден, что есть более простой способ. Возможно проблемы были из-за того, что один из серверов был QNAP. По идее это линукс, есть доступ по ssh, внутри samba. Но как там все подробно устроено не знаю, возможно что-то изменено.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>