2011-10-27 79 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

完美的我得到它的工作 还有一件事,它增加了一个新的访问规则,但离开旧域的一个 我将如何删除它? –