保存和恢复ACL

时间:2009-04-16 09:06:15

标签: security windows-server-2008

我正在将我的专用服务器移动到另一个提供商,我正在将所有内容迁移到新服务器。

我无法弄清楚的一件事是如何将ACL(访问控制列表)从现有系统保存到另一个系统。

我在IIS上使用3个不同的本地用户帐户来隔离每个网站的访问权限,IUSR_SITE1,IUSR_SITE2,IUSR_SITE3。

是否可以将ACL从这些目录保存并恢复到另一台计算机?所有文件都是相同的,我只需要移动ACL并创建相应的本地用户帐户。

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

为了回答我自己的问题,我发现了一个名为AccessEnum的程序,它列出了与父项具有不同权限的所有文件夹。

http://technet.microsoft.com/en-us/sysinternals/bb897332.aspx

这使我能够识别哪些文件夹需要写入或写入/执行权限并手动应用它们。 它并不理想,但另一种选择也很耗时且有点复杂。

答案 1 :(得分:1)

您可以使用Windows资源工具包中的XCACLS,更多信息here。这不是一个完整的解决方案,但您可以列出您感兴趣的所有权限,并使用该输出生成一个脚本,再次使用XCACLS恢复这些权限。

您还可以使用Robocopy(也在资源工具包中并在Vista上默认安装)复制包含ACL的文件。这可能仅在用户与两个服务器位于同一域中时才有效,因为ACL的SID必须存在于另一个系统上才能使用。如果他们不这样做,您最终会为目标系统上不存在的用户提供一堆ACL。

答案 2 :(得分:1)

因为您使用本地帐户只是复制ACL不起作用,因为不同机器上的SID会有所不同。

我会分几步完成这项工作:

首先:获取帐户SID(在新旧计算机上)。最快的方法是使用psgetsid(来自PSTools

PS G:\> psgetsid iusr_mymachine

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - www.sysinternals.com

SID for MYMACHINE\iusr_mymachine:
S-1-5-21-3287596715-1315679848-4222504177-1004

第二步:获取所需文件的SDDL(“安全描述符定义语言”,一种在文本中编写ACL的方法,在MSDN中描述)。 Win32和.NET有方法可以做到这一点,但最简单的路由是PowerShell(添加了换行符以使结构可见):

PS E:\Dev\Sites> (get-acl .\WebSite).sddl
O:S-1-5-21-1527045006-1366868173-4125010901-1001
G:S-1-5-21-1527045006-1366868173-4125010901-513D:AI
(A;OICI;0x1200a9;;;NS)
(A;OICI;0x1200a9;;;S-1-5-21-1527045006-1366868173-4125010901-1012)
(A;ID;FA;;;S-1-5-21-1527045006-1366868173-4125010901-1001)
(A;OICIIOID;FA;;;CO)
(A;OICIID;FA;;;SY)
(A;OICIID;FA;;;BA)
(A;OICIIOID;FA;;;S-1-5-21-1527045006-1366868173-4125010901-1001)

第三:字符串替换可以应用于此字符串上的每个{旧机器SID,新机器SID)。

第四步:在文件夹(或文件)上设置新的ACL:

$sec = get-acl newfolder
$sec.SetSecurityDescriptorSddlForm($sddl)

显然,为多个文件执行此操作的最佳途径是编写脚本,旧机器上的脚本执行1& 2,并在目标计算机上生成执行3和4的脚本(以避免远程设置具有未知SID的ACL)。