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

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

我们位于圣安东尼奥的一个共置 RackSpace 设施中,有一个名为“SAT”的活动目录。

我们将转移到他们的达拉斯/沃斯堡设施,并有一个名为“DFW”的活动目录。

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

机器已使用 DoubleTake 软件克隆到新设施,总体运行良好。然而,在移动机器后,我们被迫开始使用在 DFW Active Directory 中建立的新用户帐户登录。

我花了很长时间让我们的原始服务器在跨服务器的文件权限方面正常运行,并希望有人可以分享一些编程方式,无论是使用现有软件,还是一些自定义的.NET 代码,我们都可以“翻译”所有这些权限。

例如,我想要某种方式来指定要更新的驱动器,“之前”的用户名,例如 SAT\User,以及“之后”的用户名,例如“DFW\User”,然后让它撕掉...有什么想法吗?

答案1

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

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

我假设 SAT 和 DFW 之间不存在任何信任关系,并且 SAT\USER1 的 SID 可能与 DFW\USER1 大不相同。NTFS 中的权限均按 SID 存储,而不是用户名。这可能会使事情变得复杂。

首先学习备份和恢复命令,并将所有服务器上的权限备份到安全的地方。您可能需要想出自己的解决方案,将现有权限备份到 SDDL 文件,搜索并替换域名或 SID,然后在新域中恢复。

答案2

由于域是受信任的,因此让 Rackspace 使用 AD 迁移工具将帐户迁移到新的 DFW 域。这样,所有 SID 将保持不变,新帐户将仅具有正确的权限。

答案3

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

事实证明,RackSpace 无法迁移具有相同 SID 的帐户,因为这需要进行“切换”,我们的旧系统将不再可用。我们需要两个环境同时在线,以便在迁移期间进行测试。

所以我转向了 SetACL.exe 的想法,并且成功了。以下就是我所做的。

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

    SetACL.exe -on C:\ -ot 文件 -actn 列表 -lst "f:sddl;w:d,s,o,g" -rec cont -bckp "c:\acl-backup.txt"

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

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

    use charnames qw( :full );
    
    # e.g. 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 恢复命令(要小心,如果你在新的 replaced.txt 文件中犯了一个错误,你可能会完全破坏你的 ACL……尽管理论上你应该有一个可以从步骤 2 恢复的原始备份):

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

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

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

不知道为什么,但就我而言,我能够从 replaced.txt 文件中删除这些行(以及上面已由 setacl.exe 完成的行),然后继续。然后稍后再返回并手动检查失败区域的权限。

相关内容