Назад | Перейти на главную страницу

Миграция файлового сервера Windows - без доверия

Мы собираемся перенести наш файловый сервер (Windows Server 2012) из ​​текущего домена в новый.

Из-за проблем, не зависящих от меня, не будет ни доверительных отношений между доменами, ни даже серверов пересылки DNS из нового домена обратно в старый домен. Итак, мне нужен способ заменить ACL на группы и имена пользователей из нового домена. Имена групп будут такими же, но структура имени пользователя изменилась, поэтому будет задействован файл сопоставления.

я нашел SetACL пока я искал, но по первоначальному чтению не могу сказать, нужен ли ему доступ к обоим доменам. Если ему это нужно, то мне не повезло. Я действительно надеюсь избежать ручного восстановления разрешений для всего нашего файлового сервера, поэтому, надеюсь, у кого-нибудь есть хорошее решение.

В итоге я перепробовал все, что мог придумать, и так и не смог заставить SetACL работать. Используя файл сопоставления со старыми идентификаторами безопасности, сопоставленными с учетными записями в новом домене, я смог заставить его работать без ошибок. Фактически он сказал, что применяет списки ACL. Но на самом деле он никогда не менял никаких разрешений. Были такие же результаты при выполнении вручную по одному. Я предполагаю, что это связано с тем, что он не может связаться со старым доменом, поэтому он просто переходит к следующему. В конце концов, я вернулся к старому домену и использовал сценарий PS для экспорта текущих разрешений. Затем быстро отредактировал этот CSV, чтобы изменить перечисленные учетные записи на новые, затем вернулся в новый домен и запустил другой сценарий PS для импорта и применения разрешений.

Скрипты, которые я использовал, взяты из Вот. И поскольку я перемещал данные вместо их копирования, у меня не было проблемы в связанном решении, касающейся унаследованных разрешений. Получилось безупречно.

Вот сценарий, который просили. Одно изменение, которое я внес, я переделал структуру папок (скажем, переход от N: \ share к Z: \ public), поэтому между двумя скриптами я просто отредактировал CSV, чтобы указать новое местоположение.

ExportPermissions.ps1

$sourceFolder = "E:\sourceFolder"
$exportFile = "C:\outputCSV.csv"

Get-ChildItem $sourceFolder -Recurse | ?{ $_.PsIsContainer } | %{
  $Path = $_.FullName
  # Exclude inherited rights from the report
  (Get-Acl $Path).Access | ?{ !$_.IsInherited } | Select-Object `
    @{n='Path';e={ $Path }}, IdentityReference, AccessControlType, `
    InheritanceFlags, PropagationFlags, FileSystemRights
} | Export-CSV $exportFile

importpermissions.ps1

$par = Import-Csv -Path "c:\outputCSV.csv"

foreach ( $i in $par ) { 
  $path= $i.Path
  $IdentityReference= $i.IdentityReference
  $AccessControlType=$i.AccessControlType
  $InheritanceFlags= $i.InheritanceFlags
  $PropagationFlags=$i.PropagationFlags
  $FileSystemRights=$i.FileSystemRights
  echo $path $IdentityReference
  $acl = Get-Acl $path
  $permission = $IdentityReference, $FileSystemRights, $InheritanceFlags, 
  $PropagationFlags, $AccessControlType
  $accessRule = new-object System.Security.AccessControl.FileSystemAccessRule $permission
  $acl.SetAccessRule($accessRule)
  #$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($IdentityReference, $FileSystemRights, $InheritanceFlags, $PropagationFlags, $AccessControlType)
  #$objACL.AddAccessRule($objACE)
  $acl | Set-Acl $path
}

Ты можешь использовать icacls для экспорта и импорта ваших разрешений, а также замены любой группы / пользователя.

Пример: icacls D:\Main /save Main_Perms.cfg /t /c

При необходимости сохраненный файл можно изменить и адаптировать к новым именам пользователей. Замена определенной группы имен пользователей - это просто массовое переименование в файле NTFS S-ID.

Затем вы можете импортировать их обратно: icacls D:\ /restore Main_Perms.cfg /t /c

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