如何以编程方式将文件权限从一个AD域用户更改为单独的AD域用户?

我们位于圣安东尼奥的RackSpace工厂,有一个名为“SAT”的活动目录。

我们正在被搬到他们的达拉斯/英尺。 值得一提的是一个名为“DFW”的活动目录。

这些机器运行Windows 2008 Server(一些32位,一些64位)。

机器已经被克隆到使用DoubleTake软件的新设施中,并且通常工作正常。 然而,在移动机器时,我们被迫开始使用在DFW Active Directory中build立的新用户帐户login。

我花了很长时间让我们的原始服务器在服务器上的文件权限方面工作,并且希望有人能够通过现有的一些软件甚至是一些自定义的.NET代码来共享一些编程的方式,翻译“所有这些权限。

例如,我想要一些方法来指定要更新的驱动器,“用户名”,例如SAT \ User,和“AFTER”用户名,例如“DFW \ User”,并且让呃RIP …任何想法?

我强烈推荐免费的开源工具SetACL。

http://helgeklein.com/setacl/examples/managing-file-system-permissions-with-setacl-exe/#example-5-migrating-permissions-between-domains

我将假定SAT和DFW没有任何信任,SAT \ USER1可能与DFW \ USER1有很大不同的SID。 NTFS中的权限都是通过SID存储的,而不是用户名。 这可能会使事情变得复杂。

首先了解备份和恢复命令,并将所有服务器的权限备份到安全的地方。 您可能需要提出自己的解决scheme,将现有权限备份到SDDL文件,search并replace域名或SID,然后将其还原到新域中。

由于域值得信赖,因此Rackspace使用AD迁移工具将帐户迁移到新的DFW域。 这样所有的SID将保持不变,新的账户将拥有正确的权限。

使用@Jed和@mrdenny的反馈,我想我会用我用来解决问题的确切过程来回答我自己的问题。

事实certificate,RackSpace无法使用相同的SID迁移帐户,因为这需要在旧系统不再可用的情况下进行“切换”。 我们需要两个环境同时在线,以便在迁移过程中进行testing。

所以我转移到SetACL.exe的想法和工作。 这正是我所做的。

  1. http://helgeklein.com/download/下载SetACL.exe
  2. 运行此命令备份所有在C:驱动器上的服务器上的现有ACL信息:

    SetACL.exe -on C:\ -ot file -actn list -lst“f:sddl; w:d,s,o,g”-rec cont -bckp“c:\ acl-backup.txt”

  3. 获取旧的和新的活动目录域之间的所有用户和组的BEFORE和AFTER SID。

  4. 编写一个perl脚本来查找/replaceacl-backup.txt文件中的这些SID。 有一点棘手,因为在Windows版本的Perl中,Unicode 16的读/写支持是有点过分的。 我使用的脚本基本上是这样的:

    use charnames qw( :full ); # eg take acl-backup.txt and rename to acl-backup.replaced.txt my $newfilename = $ARGV[0]; $newfilename =~ s/(\..{3,4})$/.replaced$1/; if ($ARGV[0] eq $newfilename) { # Sanity Check die "Could not continue: new file would overwrite old file ($newfilename)\n"; } open my $input_fh, '<:raw:perlio:encoding(UTF-16):crlf', $ARGV[0]; or die "Could not open $ARGV[0] for reading: $!"; open my $output_fh, '>:raw:perlio:encoding(UTF-16LE):crlf', $newfilename or die "Could not open $newfilename for writing: $!"; print $output_fh "\N{BYTE ORDER MARK}"; while (my $line = <$input_fh>) { # you'll need a line like this for each SID you're replacing $line =~ s/S-1-5-21-1844237615-861567501-XXXXXXXXX-XXXX/S-1-5-21-1644697732-2861104425-YYYYYYYYY-YYYYY/g; chomp $line; print $output_fh "$line\n"; } close $output_fh; close $input_fh; exit; 
  5. 在新生成的文件上运行setacl.exe restore命令(小心,如​​果你在新的replaced.txt文件中犯了一个错误,那么你可以彻底地将你的ACL完全…尽pipe理论上你应该有一个原始的备份,你可以从步骤2恢复:

    setacl -on c:\ -ot文件-actn恢复-bckp acl-backup.replaced.txt

我遇到的唯一问题是偶尔会得到像这样的错误:

 ERROR: Writing SD to <\\?\c:\inetpub\custerr> failed with: The parameter is incorrect. 

不知道为什么,但在我的情况下,我能够从replated.txt文件(以及那些已经由setacl.exe完成的文件)删除这些行,然后继续。 然后稍后再回到手动检查那些失败区域的权限。