【前言】
最近有以前一起做项目的同事过来问我,文件服务器如何一起迁移NTFS权限+共享权限,当时脑海里闪过好几种解决方案,但是没办法第一时间给出确切的回答,我相信很多朋友也有遇见过和我一样的问题,Windows文件服务器如何迁移NTFS权限,如何迁移共享权限,如何迁移共享+NTFS权限,故本文将详细去验证介绍这几个需求如何进行迁移,微软有哪些工具可以使用,以及这些工具的优缺点,希望为广大IT朋友起到一个指引的作用。
【环境介绍】
2008dc.contoso.comDC角色 IP 192.168.1.2
2003FS.contoso.com2003文件服务器角色 IP 192.168.1.3
2012FS.contoso.com2012文件服务器角色 IP 192.168.1.4
本文将使用以上三台服务器进行同一域内文件服务器迁移验证
NTFS权限迁移验证
在一些场景下,例如,服务器本机更换磁盘,将原文件夹由D盘迁移至E盘,或者跨服务器迁移,将老服务器上面D盘文件夹,迁移至新服务器上面E盘文件夹,可能服务器上面配置了很多文件夹权限,希望一起迁移过去,这时就需要执行文件内容+权限的迁移
本文将通过以下工具:Xcopy,Robocopy,WSMT,icals来实践验证NTFS权限迁移,并对各工具进行点评。
工具:Xcopy
- 工具简介:
Xcopy命令在Windows NT时代作为Resouce Kit其中的一个内容被引入,到Windows 2003系统已经内置支持xcopy命令,Xcopy的出现主要是为了解决Windows默认图形化拷贝与copy命令的不足而生,xcopy可以实现更加灵活的拷贝控制,例如控制,只拷贝某些类型的文件,只拷贝某日期后修改过的文件,只拷贝文件目录结构,可拷贝文件夹及子文件夹内容,拷贝文件属性及权限,重启模式拷贝,基于标记进行筛选过滤,结合bat实现文件增量复制等,
Xcopy对比图形界面copy,在性能上面已经有了一定的优化,在03时代,使用Xcopy拷贝大文件可以比资源管理器拷贝速度提升百分之三十左右。同时对比默认的copy命令,Xcopy在灵活性上面已经做了大量改进。
【迁移步骤】
- 在2003FS D盘上面创建父共享文件夹ShareFloder,共享权限为Everyone读取
( 用于测试迁移目录使用 )
- 再建立子共享文件夹IT,设置Info.MG组对于共享文件夹具备更改权限,但是NTFS权限添加IT组内mike具备完全控制权限,Jack具备只读权限
- 目标服务器2012R2上面E盘为空,一会要使用xcopy命令将03FS文件夹内容+权限复制过来
- 首先在2012FS服务器上面执行命令,将远程共享目录映射为本地网盘(非必须)
net use Z: \\192.168.1.3\sharefloder password /user:contoso\mike
- 运行Xcopy迁移命令
xcopy Z:\it E:\it /O /X /E /H /K
命令说明
Xcopy 源文件或源文件夹 目标文件或目标文件夹,目标文件夹是否存在皆可
注 : 实测X copy可以接受映射为网盘的路径,也直接接受UNC路径
/O 复制文件所有权和ACL 信息
/X 复制文件审核设置(隐含 /O)。
/E 复制目录和子目录,包括空目录。与 /S /E 相同。可以用来修改 /T
/H 也复制隐藏文件和系统文件
/K 复制属性
本文主要测试验证各种迁移工具效果,并对迁移工具做简要介绍,如需查看更多参数,请参考technet https://technet.microsoft.com/en-us/library/bb491035.aspx
- 命令执行效果如下,如果Xcopy检测到目标文件夹尚未创建,会自动进行创建
- 迁移效果,NTFS权限可以完整无缝权限过来,目标文件夹的安全设置将被继承,共享状态会丢失
- 文件内容时间戳保持不变
- 顶级文件目录时间戳不能被迁移,但是it文件夹下面如果有子文件夹,子文件夹时间戳可以得到保留
- 源文件夹内加密文件无法迁移,只读属性文件可以被迁移过来
/C 即使有错误,也继续复制
/G 允许将加密文件复制到不支持加密的目标
实测效果即使加了/G参数,加密文件依然不能被迁移,如需使用xcopy,请先将文件解密在进行迁移
注:实测/Z参数,不能与/O /X参数在一起使用,/Z参数为使用重启模式进行复制迁移,即断点续传功能,例如服务器复制过程中断电开机可以接着上次上传位置继续传输。
【点评】
功能实现: ★★★★
专业性: ★★★★★
性能: ★★★★
易用性: ★★★
通过以上验证大家可以看出,Xcopy命令可以实现我们迁移文件内容+NTFS权限的需求,笔者又额外验证了一下属性方面的迁移,发现Xcopy在属性迁移,时间戳迁移处理上面做的并不够完美,所以给了四星,实测Xcopy对比资源管理器确实会有性能提升,关于笔者介绍中提到的几个Xcopy功能,各位朋友感兴趣的话在网上就可以查找到
工具:RoboCopy
RoboCopy和Xcopy一样,最开始在NT时代都是ResourceKit里面一个扩展命令,只不过RoboCopy在后来的03时代,08时代做了更多完善,成为了Xcopy的 “替代升级版” ,兼备Xcopy的功能之下,RoboCopy做到了比Xcopy更好的性能,更灵活的管理。
比如:RoboCopy从2008开始可以使用多个线程进行复制,在重试逻辑上面,Robocopy除了可以做到重启模式,还可以做到在一定时间内,默认30秒,出现网络中断,不会导致复制中断,复制会在这个时间内继续次数尝试,直到成功复制。
之前Xcopy对于复制时间筛选只能做到,复制指定修改时间之后的文档 ,而Robocopy可以做到监视达到指定修改次数,或修改文件多长时间后再进行复制,复制时可以对来源或目标的文件夹层级,属性,时间做更多灵活的筛选和控制,达到指定需求在进行复制
通过笔者的了解与实践,Robocopy对于自动化增量复制的处理也更加强大和方便,RoboCopy默认情况下复制,如果检测到目录已复制过,下次复制则会仅复制增量部分,可以支持将编写的Robocpy命令生成任务计划 多次运行,可以输出详细的日志,复制过程可以显示复制进度。
Robocopy编写自动化复制脚本也比Xcopy更加容易, 内置的增量复制逻辑比Xcopy更加完善,针对Robocopy也有很多GUI界面的第三方工具
关于Robocopy笔者这里只做简单介绍,如果对其感兴趣可以上网去搜索相关文章
【迁移步骤】
- 使用共享文件夹IT,设置Info.MG组对于共享文件夹具备更改权限,但是NTFS权限添加IT组内mike具备完全控制权限,Jack具备只读权限
- 目标服务器2012R2上面E盘为空,一会要使用RoboCopy命令将03FS文件夹内容+权限复制过来
- 运行Robocopy迁移命令
robocopy \\192.168.1.3\it e:\it /e /efsraw /copyall
命令说明
robocopy源文件或源文件夹 目标文件或目标文件夹,目标文件夹是否存在皆可
/COPY:复制标记: 要复制的文件内容(默认为 /COPY:DAT)。 (复制标记: D=数据,A=属性,T=时间戳,S=安全=NTFS ACL,O=所有者信息,U=审核信息 )
/COPYALL : 复制所有文件信息(等同于 /COPY:DATSOU)
/E : 复制子目录,包括空的子目录
/S : 复制子目录,但不复制空的子目录
/EFSRAW : 在 EFS RAW 模式下复制所有加密的文件
注:
如不添加/E 或/S参数,默认robocopy不会去复制源文件子目录及子目录内容
实测如果希望复制加密属性,请一定要添加/EFSRAW参数,如不添加,RoboCopy会陷入重试状态 实测Robocopy可以接受映射为网盘的路径,也直接接受UNC路径
- 命令执行效果如下,如果Robocopy检测到目标文件夹尚未创建,会自动进行创建,也可通过命令配置详细的选项
- 迁移效果,NTFS权限可以完整无缝权限过来,共享状态会丢失
注:
Robocopy与Xcopy不同,Robocopy拷贝过来的文件不会继承目标文件父文件夹的权限,而是会原封不动的保持源端的权限设置。
例外情况,假设执行robocopy的当前账户,对源端文件夹不具备管理权限,可以添加/B参数,添加/B参数之后,对于执行账户没有权限的文件夹复制过来之后会继承目标父文件夹的权限。
正常情况下建议执行robocopy或者xcopy的账户,至少要对 源端文件夹NTFS权限以及共享权限 具备更改权限,对于目标文件夹具备写入权限,建议最好临时将迁移账户加成NTFS完全控制权限,迁移完成再将权限去掉。
- 文件内容时间戳保持不变
- 文件目录时间戳保持不变
- 加密属性保持不变
- 只读属性保持不变
- RoboCopy其它有用命令介绍
/MT[:n] 使用n个线程进行多线程复制,默认值为 8,至少为 1,至多128,实测不兼容/IPG 与/EFSRAW参数
/MIR 镜像目录树(= /E 与 /PURGE)
/MOV 移动文件(复制后从源中删除)
/MON:n 监视源:发现多于n个更改时再次运行
/MOT:m 监视源:如果更改,在m分钟时间内再次运行
/MOVE 移动文件和目录(复制后从源中删除)
/Z 在可重新启动模式下复制文件,实测在RoboCopy中,/Z参数可以和/e /efsraw /copyall 参数混合使用,但是复制速度会有下降
/b 在备份模式下复制文件
/IPG:n 程序包间的间距(ms),以释放低速线路上的带宽
/A+:[RASHCNET] 将给定的属性添加到复制文件
/A-:[RASHCNET] 从复制文件中删除给定的属性
/256 关闭超长路径(> 256 字符)支持,默认情况下使用资源管理复制存在256字符限制,路径超过256字符将无法复制,默认情况下使用Robocopy没有此限制
/R:n 失败副本的重试次数: 默认为 1 百万
/W:n 两次重试间的等待时间: 默认为 30 秒
/V 生成详细输出,同时显示跳过的文件
/LOG:文件 将状态输出到日志文件(覆盖现有日志),实测使用LOG参数后将不再在屏幕输出,而是直接输出结果到log文件
/SAVE 将参数保存到命名的作业文件
笔者出于好奇心又测试了一下Xcopy和robocopy复制系统文件和隐藏文件的效果,实测两个命令都可以做到,使用Xcopy 复制系统文件或隐藏文件,需要添加/H参数,否则不会复制,使用Robocopy复制系统文件或隐藏文件,需要使用如下格式,将文件名放在来源路径与目标路径后面,也可以是4*.txt这种的格式 :)
attrib c:\hello\456.txt +s +h /临时将文件标记为系统文件
Robocopy c:\hello e:\it 456.txt /e /copyall
【点评】
功能实现: ★★★★★
专业性: ★★★★★
性能: ★★★★★
易用性: ★★★★
通过以上验证大家可以看到,从技术实现角度来讲,目前为止RoboCopy算是比较完美,NTFS权限可以完整迁移,文件属性,时间戳也可以完整迁移,迁移复制性能对比资源管理器也得到大幅改进,所以功能,专业程度,性能上面给了五星,考虑到robocopy和xcopy默认都是纯命令行操作,所以易用性上面给做了适当减星,Robocopy有很多相应的GUI工具所以只减了一颗星,
广大IT pro朋友,如果有需要同时迁移复制大量文件+权限+文件属性的需求,强烈建议使用Robocopy
这项命令已内置在Vista和2008之后的os,并且客户端系统与服务端系统均支持多线程复制,如果是windows8和2012之后的server端对client拷贝,加上SMB3.0的优化相信可以得到不错的性能。
工具:WSMT
关于Windows Server Migration Tool,笔者以前专门写过博客做过介绍,请见传送门
传送门:使用Windows迁移工具迁移2003至2012R2一、工具介绍
传送门:使用Windows迁移工具迁移2003至2012R2二、IP迁移
【迁移步骤】
话不多说,我们直接开始迁移验证,迁移之前HR文件夹设置HR部门Lucy具备共享权限完全控制,IT部门mike NTFS权限为只读,如下图
- 在2003FS服务器上打开Windows ServerMigration tools PS执行命令
Send-SmigServerData -ComputerName 12FS -DestinationPath e:\HR-Include All -SourcePath E:\ShareFloder\HR -force –recurse
命令说明
Send-SmigServerData 发起SMIG数据传输
-ComputerName 目标计算机名称,一定要可以ping通,同时确保来源计算机与目标计算机之间7000端口已打通
-DestinationPath 目标文件夹名称
-SourcePath 来源文件夹名称
-Include 指定的内容要复制到目标服务器的类型
可以接受 share,data,all参数
Share参数用于仅迁移文件夹及文件夹 NTFS权限+共享权限,及部分文件夹属性
Data 参数用于复制由SOURCEPATH参数由-DestinationPath参数指定的文件夹指定的文件夹中的文件。子文件夹及其内容不会被复制,除非添加Recurse参数。
All参数包含share与data内容
-Recurse 用于复制包含在sourcepath里面的子目录及子文件夹内容,如果不使用此参数,SOURCEPATH的子文件夹不会被复制
-Force 自动覆盖目标文件夹中现有文件及属性,如果你是从源服务器迁移的文件比较新可以选择直接进行覆盖
-Password 可选参数,用于直接在发起迁移命令一起键入迁移密码
-Verbose 可选参数,用于显示命令的行动和进展的全部细节
- 命令运行效果如下,提示输入迁移密码,此密码仅用于此次迁移过程来源端与目的端使用
- 输入密码后之后源服务器进入等待过程,迁移申请已发起,等待目标计算机响应我的迁移发起并建立迁移通道,默认情况下,来源计算机只会等待四分钟,四分钟内,目标计算机没有连接进来,则此次迁移失败,此时间可通过修改WSMT配置文件进行更改
- 来到目标计算机12FS,运行命令 Receive-SmigServerData响应迁移发起请求
命令执行如下,输入来源端设置的迁移密码
- 密码输入正确后,来到来源端计算机可以看到,本次迁移发起已经成功建立起通道,来源计算机正在验证文件并且通过安全加密的通道,将文件推送至目标计算机,此时在来源端计算机可以看到整个文件迁移的进度图,如果迁移时加了Verbose参数,可以看到非常细致的信息
- 同时目的端计算机也会看到进度,不过目的端这里不会显示过多信息,只是数据迁移启动,源端推送完毕,这里迁移过程结束。
- 当文件迁移完成之后,来源端计算机会在命令提示符或PS中显示此次迁移的历史状态
- 目的端显示如下
- 迁移效果,NTFS权限可以完整无缝权限过来,共享权限也会完整的迁移过来!!!!
- 使用mike用户测试通过\\192.168.1.4\it访问2012FS共享内容,完全没有问题
- 文件内容时间戳保持不变
- 顶级父文件目录HR时间戳丢失,HR文件夹里面的子文件夹时间戳不会丢失
- 实测,凡是文件具备加密属性,则该文件无法被WSMT迁移,只读文件及属性可以被WSMT迁移,隐藏文件&系统属性文件及属性也可以被WSMT迁移
- 如图 ,WSMT迁移过程中如果发现加密文件会提示加密文件警告,然后继续迁移其它文件
【点评】
功能实现: ★★★★★
专业性: ★★★★★
性能: ★★★★
易用性: ★★★
在写到这个点评的时候,笔者的心情还是比激动的,之前2015年的时候笔者曾经做过WSMT的测试研发,当时看了一篇外文文档,依稀记得好像是说到可以迁移NTFS权限+共享权限,然而近期在国外看到一些文章又说WSMT只能迁移NTFS权限,有一篇国内的文章也提到了WSMT迁移文件服务器,但是他的共享权限只是everyone,不能更好的看出效果。考虑之后笔者还是决定亲自尝试下,把最真实的结果告诉大家,结果让我很惊喜,WSMT是可以做到迁移NTFS权限+共享权限的。
由于WSMT设计的应用场景和Xcopy,Robocopy不同,WSMT主要强调的是将旧的平台,例如2003上面的各种服务角色,用户,迁移至新的平台上,所以在具体的文件迁移过程,可能控制的不像Robocopy那么灵活,迁移的时候筛选条件,迁移性能,迁移配置也没有什么更多的优化参数,对于文件目录时间戳,加密文件不能被迁移,其实也在意料之中,还是设计面向的场景不同吧
WSMT更加适用于,单纯迁移文件内容+NTFS权限+共享权限,同时需要对迁移过程数据传输有加密要求的场景。
如果希望对迁移复制过程做更加灵活的控制,更好的性能,基于块level的复制,实现自动化增量复制等高级需求,还是建议采用Robocopy方案实现。
工具:ICACLS
Ok,AnyWay,我们看过了Xocpy,Robocopy的复制方案,看过了WSMT的迁移方案,可谓各有千秋,在NTFS权限迁移验证的最后,我们不妨来讨论下,畅所欲言,大胆猜想下,当我们在迁移或复制文件及权限的时候背后其实发生的是什么,首先文件就不用说了,可以都是数据传输,只不过可以基于文件或者基于块进行传输,那么关于权限,到底是如何做到迁移的
大家有没有去猜想过,这个NTFS上面的权限,到底是存在哪里的,有朋友说域环境下NTFS权限会存在与AD数据库,笔者其实并不太认同这个想法
根据笔者的基础学习 认为AD数据库应该只存储的是和用户对象相关的信息,例如用户和组的SID,用户的right信息,当用户在计算机登录域之后LSA生成Access token给当前用户,用户拿着这个token去启动应用或者访问共享,当访问一个共享或者访问一个本机的文件夹时,文件夹会去对比资深文件夹NTFS上面的ACL,与用户token中是否有相匹配的,如果有,则允许访问,按照ACL执行。
所以,笔者是属于坚持NTFS ACL权限是存在于NTFS文件系统上面的一派,姑且先这样认为,如果有对这方面做过深入研究的朋友,欢迎批评指正。
假定NTFSACL权限存放于NTFS文件系统,那么笔者猜想,迁移过程中,除了迁移文件内容,相应的迁移工具也会从NTFS文件系统读取NTFS ACL,download下来,当文件迁移完成后,将ACL直接restore给文件目录和文件,或者是复制文件的时候直接把ACL打包一起复制过去。
说了这么多,Icacls到底是做什么的
Icacls就是负责完成 将NTFS ACL backup 下来,当文件迁移完成后,将ACL直接restore给文件目录和文件 这份工作的,同时用Icacls可以完成对于acl的管理操作,例如授予权限,更改权限等操作
- 话不多说,来一起看下效果吧,使用文件夹GR,设置mike对于文件夹具备更改权限,设置Jack对于目录下文件具备读取权限。
目标服务器2012R2上面E盘为我们直接手动复制了文件夹GA过来,之后再通过icacls命令还原ACL
- 在来源端运行icacls命令,将GA文件夹及其子目录+子文件ACL全部备份下来
icaclse:\ShareFloder\GA\* /save e:\acl.txt /T
命令说明
Icacls+原路径或源文件
\* 代表备份原路径下文件+子目录+子目录文件权限 /此命令有说法,后面说明,我们先不加\*参数
/Save 要将acl文件保存到的文件,可以是txt文件
/ T 遍历所有子文件夹,以匹配文件/目录。这将适用权限的改变,在非常大的目录结构这可能需要一些时间,因为该命令必须遍历整个树
- 命令执行效果如下
- 打开E盘根目录生成的acl.txt文件可以看到文件内容,可以看到里面包括了SID,以及安全级别的参数
- 来到目标服务器12FS上面,将ACL文件拷贝至E盘根目录,执行命令
icacls e: /restore e:\acl.txt
- 命令执行效果如下
- 还原效果如下,文件目录及子目录,子文件NTFS权限,均可跨计算机被还原过来
- 文件内容时间戳保持不变
- 文件目录时间戳会丢失,应该是和笔者复制方式有关,当时笔者是直接通过资源管理器复制到12FS上面,如果使用robocopy复制,则会保证文件目录时间戳记得到保存
- 实测icacls可以将系统文件属性,隐藏文件属性,只读文件属性也一起备份还原过来,针对加密文件的加密属性则不能被还原( 有时使用资源管理器也可以跨服务器复制加密属性,如果复制过程中带有加密属性了,则不存在此问题,如果复制过程没有复制过去加密属性,则icacls不能帮助完成加密文件,加密属性的还原 )
在进行点评之前,笔者发现Icacls这个命令比较有意思的地方,来和大家分享下
如果运行的命令是这种icacls e:\ShareFloder\GA /save e:\acl.txt /T
那你还原时就一定要用这种格式还原icacls e: /restore e:\acl.txt
要说明的是,如果备份的时候\GA后面没有加\*,那么还原的时候,就要指定上级目录而不能指定下级,例如你在E盘根目录创建了GA文件夹,那么还原的时候就要用 icacls e: /restore,icals会自动去根目录寻找下级文件夹,并还原权限,这种情况下,如果你不指定上级路径,还原权限是肯定不会成功的。
如果运行的命令是这种icacls e:\ShareFloder\GA\* /save e:\acl.txt /T
那你还原时就一定要用这种格式还原icacls e:\GA /restore e:\acl.txt
说明的是,如果备份的时候\GA后面加\了*,那么还原的时候,就一定要指定具体路径,而不能是上级目录,例如你在E盘根目录创建了GA文件夹,那么还原的时候就要用icacls e:\GA /restore,这种情况下,如果你指定了上级路径,还原权限会仅还原GA目录下面文件和子目录的权限,而不会还原GA父目录的权限。
由此我们可以得出结论,如果运行命令icacls e:\ShareFloder\GA /save e:\acl.txt /T
生成ACL文件时,目录路径后面不加\*,生成的是目录+子目录+目录下文件权限的ACL+子目录下文件的ACL,如果加\*,生成的只是子目录+目录下文件权限的ACL+子目录下文件的ACL
【点评】
功能实现: ★★★★
专业性: ★★★★★
性能: ★★★★
易用性: ★★★★
很高兴可以在这一个章节和大家分享关于ICACLS的使用部分,一起探索NTFS ACL备份恢复的奥秘,通过验证我们可以发现,ICACLS是可以做到,跨服务器将NTFS ACL及部分文件属性进行备份还原的,特地去测了下文件属性部分,还是比较精细,看来说是ACL,也不仅仅是ACL,虽然ICACLS在加密属性和时间戳还原上面并不是特别完美,不过对于ACL的备份恢复还是很强大的。如果有需求的话,可以考虑用robocopy去复制文件+时间戳+加密属性,剩余的ACL还原部分用icacls完成。
笔者认为ICACLS主要应用场景在于
1. 文件服务器很多有权限设置的文件夹,需要定期进行备份权限列表,防止权限出现问题
2. 文件服务器需要替换操作系统重做,可以事先将ACL文件权限备份,重做之后还原
3. 文件服务器需要跨服务器还原NTFS权限ACL,仅还原ACL,对属性无更多要求
在下篇中,我将继续为大家实践微软共享权限+NTFS权限的内容,敬请期待~