![重新安装 Windows 后,如何将旧用户的 SID 绑定到新用户以保留 NTFS 文件所有权和权限?](https://linux22.com/image/1319360/%E9%87%8D%E6%96%B0%E5%AE%89%E8%A3%85%20Windows%20%E5%90%8E%EF%BC%8C%E5%A6%82%E4%BD%95%E5%B0%86%E6%97%A7%E7%94%A8%E6%88%B7%E7%9A%84%20SID%20%E7%BB%91%E5%AE%9A%E5%88%B0%E6%96%B0%E7%94%A8%E6%88%B7%E4%BB%A5%E4%BF%9D%E7%95%99%20NTFS%20%E6%96%87%E4%BB%B6%E6%89%80%E6%9C%89%E6%9D%83%E5%92%8C%E6%9D%83%E9%99%90%EF%BC%9F.png)
每次我们重新安装 Windows 时,它都会为用户创建一个新的 SID,即使用户名是相同的像之前一样。
// example (not real SID format, just show the problem)
user SID
--------------------
liuyan S-old-501 // old SID before reinstall
liuyan S-new-501 // new SID after reinstall
重新安装后令人烦恼的问题是 NTFS 文件所有权和硬盘驱动器上的权限仍然与旧用户的 SID 相关联。
我想保留NTFS文件的所有权和权限设置,然后想让新用户使用旧用户的SID,以便我可以在没有许可问题的情况下像以前一样访问文件。
这cacls
在这种情况下,命令行工具无法使用,因为该文件确实属于新用户,因此它将失败访问被拒绝错误。并且它无法改变所有权。
即使我可以通过以下方式改变所有权SubInACL
工具,cacls
无法删除旧用户的权限,因为旧用户在新安装中不存在,并且无法复制老用户对新用户的权限。
那么,我们可以简单地将旧用户的 SID 绑定到新安装的 Windows 上的新用户吗?
样品测试批次
@echo off
REM Additional tools used in this script
REM PsGetSid http://technet.microsoft.com/en-us/sysinternals/bb897417
REM SubInACL http://www.microsoft.com/en-us/download/details.aspx?id=23510
REM
REM make sure these tools are added into PATH
set account=MyUserAccount
set password=long-password
set dir=test
set file=test.txt
echo Creating user [%account%] with password [%password%]...
pause
net user %account% %password% /add
psgetsid %account%
echo Done !
echo Making directory [%dir%] ...
pause
mkdir %dir%
dir %dir%* /q
echo Done !
echo Changing permissions of directory [%dir%]: only [%account%] and [%UserDomain%\%UserName%] has full access permission...
pause
cacls %dir% /G %account%:F
cacls %dir% /E /G %UserDomain%\%UserName%:F
dir %dir%* /q
cacls %dir%
echo Done !
echo Changing ownership of directory [%dir%] to [%account%]...
pause
subinacl /file %dir% /setowner=%account%
dir %dir%* /q
echo Done !
echo RunAs [%account%] user to write a file [%file%] in directory [%dir%]...
pause
runas /noprofile /env /user:%account% "cmd /k echo some text %DATE% %TIME% > %dir%\%file%"
dir %dir% /q
echo Done !
echo Deleting and Recreating user [%account%] (reinstall simulation) ...
pause
net user %account% /delete
net user %account% %password% /add
psgetsid %account%
echo Done ! %account% is recreated, it has a new SID now
echo Now, use this "same" account [%account%] to access [%dir%], it will failed with "Access is denied"
pause
runas /noprofile /env /user:%account% "cmd /k cacls %dir%"
REM runas /noprofile /env /user:%account% "cmd /k type %dir%\%file%"
echo Done !
echo Changing ownership of directory [%dir%] to NEW [%account%]...
pause
subinacl /file %dir% /setowner=%account%
dir %dir%* /q
cacls %dir%
echo Done ! As you can see, "Account Domain not found" is actually the OLD [%account%] user
echo Deleting user [%account%] ...
pause
net user %account% /delete
echo Done !
echo Deleting directory [%dir%]...
pause
rmdir %dir% /s /q
echo Done !
答案1
你可以使用设置为了用新的SID代替孤立的SID,请使用以下方式将您的旧SID替换为新的SID:
setacl.exe -on C:\
-ot file
-actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst"
-rec cont
答案2
不支持更改计算机的 SID 或更改本地帐户的 SID 以使其与计算机的 SID 不匹配。
您的问题措辞暗示您经常重新安装操作系统,但其实您并不需要这样做。如果您反复遇到需要重新安装的问题,那么最好找出导致问题的原因,而不是每次都重新安装。
某些团体使用知名 SID这意味着当计算机重新安装时它们不会改变。因此,您可以通过提前选择权限以便他们使用这些组来简化您的问题。其中一些可能有用的组包括管理员、高级用户、用户、经过身份验证的用户和 INTERACTIVE。
重置整个文件夹树的权限的一种缓慢但简单的方法是复制它:
robocopy /e /b c:\original-folder c:\new-copy
这必须从提升的命令提示符运行。使用 /b 选项可使 robocopy 使用恢复权限来绕过文件的安全性。
c:\new-copy
在开始之前创建并根据需要设置权限。复制后,您可以使用以下命令删除原始文件夹:
robocopy /e /b c:\empty-folder c:\original-folder