2011-10-27 77 views
3

我很難過!更改ACL - 遞歸所有目錄Powershell

這是我需要做的。我們已經遷移到一個新的域,我基本上需要一個腳本,我們可以運行在一個服務器上,它將重新審查所有目錄和文件,查看ACL的每個目錄和文件。它將搜索OLDDOMAIN \ USER等ACL如果發現變化的ACL來NEWDOMAIN \用戶,但保持所有權限

這裏是我到目前爲止

$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將只有一個參數和建築本身將失敗。

避免分裂等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

完美的我得到它的工作 還有一件事,它增加了一個新的訪問規則,但離開舊域的一個 我將如何刪除它? –