我很难过!
这是我需要做的。我们已经迁移到一个新域,我基本上需要一个脚本,我们可以在服务器上运行,它将重新诅咒所有目录和文件,查看每个目录的ACL。如果发现将ACL更改为NEWDOMAIN \ USER但仍保留所有权限,它将搜索ACL以查找OLDDOMAIN \ 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
由于
答案 0 :(得分: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
}