ACLを変更する - すべてのディレクトリを再帰Powershell

私は困惑している!

ここで私は何をする必要があります。私たちは新しいドメインに移行しました。基本的には、それぞれのACLを見ているすべてのディレクトリとファイルを再抑制するサーバー上で実行できるスクリプトが必要です。 OLDDOMAIN \ USERなどのACLを検索し、見つかった場合は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

ありがとう

4

1 答え

$ ar =新規オブジェクトSystem.security.accesscontrol.filesystemaccessrule $ perm

FileSystemAccessRuleのコンストラクタには3つの引数があり、分割とforeachの後に $ perm には引数が1つしかなく、構築自体が失敗します。

分割などを避けてください。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:セキュリティ識別子がこのオブジェクトの所有者であることは許可されていません。任意のアイデア、私はとても近いです:P
追加された 著者 Chris Day,
完璧な私はそれが働いてもう一つのことは、新しいアクセスルールを追加するが、古いドメインのために残してどのように私はそれを削除するのですか?
追加された 著者 Chris Day,
すべてのあなたの助けをありがとう!
追加された 著者 Chris Day,