重新安装 Windows 后,如何将旧用户的 SID 绑定到新用户以保留 NTFS 文件所有权和权限?

重新安装 Windows 后,如何将旧用户的 SID 绑定到新用户以保留 NTFS 文件所有权和权限?

每次我们重新安装 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

  1. 不支持更改计算机的 SID 或更改本地帐户的 SID 以使其与计算机的 SID 不匹配。

  2. 您的问题措辞暗示您经常重新安装操作系统,但其实您并不需要这样做。如果您反复遇到需要重新安装的问题,那么最好找出导致问题的原因,而不是每次都重新安装。

  3. 某些团体使用知名 SID这意味着当计算机重新安装时它们不会改变。因此,您可以通过提前选择权限以便他们使用这些组来简化您的问题。其中一些可能有用的组包括管理员、高级用户、用户、经过身份验证的用户和 INTERACTIVE。

  4. 重置整个文件夹树的权限的一种缓慢但简单的方法是复制它:

    robocopy /e /b c:\original-folder c:\new-copy
    

    这必须从提升的命令提示符运行。使用 /b 选项可使 robocopy 使用恢复权限来绕过文件的安全性。c:\new-copy在开始之前创建并根据需要设置权限。

    复制后,您可以使用以下命令删除原始文件夹:

    robocopy /e /b c:\empty-folder c:\original-folder
    

相关内容