2011-10-27 12 views
3

私は困惑しています!ACLを変更 - 再帰すべてのディレクトリPowershell

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

は、私がこれまで

$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

おかげ

答えて

3

$ar = New-Object 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 
} 
+0

感謝の男、本当にPowerShellの –

+0

は今 セットの次のエラーを取得するに多くを見てする必要があります-Acl:セキュリティ識別子がこのオブジェクトの所有者であることは許可されていません。 すべてのアイデア、私はとても近いです:P –

+0

完璧な仕事を得ました もう一つ、新しいアクセスルールを追加しましたが、古いドメインのものを残してください どうすれば削除できますか? –

関連する問題