我们即将把我们的文件服务器(Windows Server 2012)从当前域迁移到新域。
由于我无法控制的问题,新域与旧域之间将不存在域信任,甚至不存在 DNS 转发器。因此,我需要一种方法来用新域中的组和用户名替换 ACL。组名将保持不变,但用户名结构已发生改变,因此将涉及一个映射文件。
我发现设置ACL我在搜索时遇到了这个问题,但从最初的阅读来看,我无法判断它是否需要访问两个域。如果需要,那我就倒霉了。我真的希望避免手动重建整个文件服务器的权限,所以希望有人能有一个好的解决方案。
答案1
我最终尝试了所有能想到的方法,但 SetACL 始终无法工作。通过使用将旧 SID 映射到新域中的帐户的映射文件,我能够让它顺利运行。它实际上说它正在应用 ACL。但它从未真正改变任何权限。手动一次执行一次时得到相同的结果。我假设这是因为它无法连接到旧域,所以它只是跳到下一个。最后,我回到旧域并使用 PS 脚本导出当前权限。然后快速编辑该 CSV 以将列出的帐户更改为新帐户,然后返回新域并运行不同的 PS 脚本来导入和应用权限。
我使用的脚本来自这里。由于我是移动数据而不是复制数据,因此在链接的解决方案中没有遇到有关继承权限的问题。结果完美无缺。
这是要求的脚本。我做了一个更改,重新设计了文件夹结构(例如从 N:\share 移至 Z:\public),因此在两个脚本之间,我刚刚编辑了 CSV 以引用新位置。
ExportPermissions.ps1
$sourceFolder = "E:\sourceFolder"
$exportFile = "C:\outputCSV.csv"
Get-ChildItem $sourceFolder -Recurse | ?{ $_.PsIsContainer } | %{
$Path = $_.FullName
# Exclude inherited rights from the report
(Get-Acl $Path).Access | ?{ !$_.IsInherited } | Select-Object `
@{n='Path';e={ $Path }}, IdentityReference, AccessControlType, `
InheritanceFlags, PropagationFlags, FileSystemRights
} | Export-CSV $exportFile
importpermissions.ps1
$par = Import-Csv -Path "c:\outputCSV.csv"
foreach ( $i in $par ) {
$path= $i.Path
$IdentityReference= $i.IdentityReference
$AccessControlType=$i.AccessControlType
$InheritanceFlags= $i.InheritanceFlags
$PropagationFlags=$i.PropagationFlags
$FileSystemRights=$i.FileSystemRights
echo $path $IdentityReference
$acl = Get-Acl $path
$permission = $IdentityReference, $FileSystemRights, $InheritanceFlags,
$PropagationFlags, $AccessControlType
$accessRule = new-object System.Security.AccessControl.FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
#$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($IdentityReference, $FileSystemRights, $InheritanceFlags, $PropagationFlags, $AccessControlType)
#$objACL.AddAccessRule($objACE)
$acl | Set-Acl $path
}
答案2
您可以使用伊卡克尔斯导出和导入您的权限,同时替换任何组/用户。
例子:icacls D:\Main /save Main_Perms.cfg /t /c
如果需要,可以更改保存的文件并使其适应新的用户名。替换特定用户名组只是在 NTFS S-ID 文件中进行批量重命名。
然后你可以将它们导回来:icacls D:\ /restore Main_Perms.cfg /t /c
注意:从文件恢复权限时,您应该指定父目录的路径。