Змінити ACL - відновити всі каталоги PowerShell

Я стомлений!

Ось що я повинен зробити. Ми перейшли до нового домену, мені в основному потрібен скрипт, який ми можемо запустити на сервері, який буде перезаписувати всі каталоги та файли, що переглядають 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

Будь-які ідеї? Витягуючи моє волосся звідси: П

Дякую

4

1 Відповіді

$ 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
}
3
додано
Спасибі людині, дійсно треба шукати більше в Powershell
додано Автор Chris Day, джерело
Отримання наступної помилки зараз Set-Acl: ідентифікатор безпеки не може бути власником цього об'єкта. У будь-яких ідеях я так близько: П.
додано Автор Chris Day, джерело
Відмінно, я отримав роботу. Ще одна річ, це додавання нового правила доступу, але залиште його для старого домену. Як я його видалив?
додано Автор Chris Day, джерело
Отримав роботу, Дякую за всю вашу допомогу!
додано Автор Chris Day, джерело