Изменить ACL - Переписать все каталоги Powershell - PullRequest
4 голосов
/ 27 октября 2011

Я в тупике!

Вот что мне нужно сделать.Мы мигрировали в новый домен, мне в основном нужен сценарий, который мы можем запустить на сервере, который будет прокручивать все каталоги и файлы, просматривая ACL для каждого.Он будет искать ACL для OLDDOMAIN \ USER и т. Д., Если найден, измените ACL на NEWDOMAIN \ USER, но сохраните все разрешения

Вот что у меня есть

$access = ""
$accessarray = @()
$filesarray = @()
$permarray = @()
$filesarray = Get-ChildItem C:\Users -Recurse
ForEach($path in $filesarray) {
  $pathcheck = $path.fullname
  $access = get-acl $pathcheck
  $accessarray = $access.AccessToString.Split(",")

  foreach ($item in $accessarray) {
    if ($item -match "OLDDOMAIN") {
      Write-Host $pathcheck
      Write-Host $item
      $item = $item -replace ("OLDDOMAIN","NEWDOMAIN")
      $permarray = $item.split(” “) | where-object {$_ -ne ”“}

      foreach($perm in $permarray) {
        $ar = New-Object system.security.accesscontrol.filesystemaccessrule $perm
        $acl.SetAccessRule($ar)
        $acl | Set-Acl $pathcheck
      }
    }
  }
}

Работает вродеиз, но проблема в том, что при повторном применении разрешений массив находится не в правильном порядке, и он завершается с ошибкой по команде set-acl

Есть идеи?Потянув меня за волосы сюда: P

Спасибо

1 Ответ

3 голосов
/ 28 октября 2011

$ar = New-Object system.security.accesscontrol.filesystemaccessrule $perm

Конструктор для FileSystemAccessRule принимает 3 аргумента, и после всех ваших расщеплений и foreach у $perm будет только один аргумент, и сама конструкция завершится неудачей.

ИзбегатьPowershell предоставляет вам объекты.Действуй на них.Не получайте строки, затем разделяйте и т. Д.

Вы можете делать то, что вы хотите, с чем-то вроде этого:

gci c:\users -recurse | %{
    $acl = get-acl $_.fullname

    $acl.Access | ?{$_.IdentityReference.Value.StartsWith("OLDDOMAIN")} | %{

        $identity = $_.IdentityReference.Value -replace "OLDDOMAIN", "NEWDOMAIN"
        $permission = $identity,$_.FileSystemRights,$_.AccessControlType
        $ar = New-Object system.security.accesscontrol.filesystemaccessrule $permission
        $acl.SetAccessRule($ar)

    }

    $acl | set-acl $_.fullname
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...