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


18

每次我们重新安装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权限,也不能删除旧用户的权限,因为新安装中不存在旧用户,也无法旧用户的权限复制到新用户。

那么,我们可以在新安装的Windows上简单地将旧用户的SID绑定到新用户吗?

样品测试批次

@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 !

您为什么反对仅拥​​有文件所有权?
Ramhound 2012年

如果仅拥有所有权,则某些文件将无法访问,因为该权限仍设置为旧用户的SID。
刘岩刘研

@LiuYan刘研但是,在您拥有所有权之后,您应该可以编辑所有权限。
Iszi 2012年

1
@IsziRoryorIsznti,如果文件很少且所有权限均从父级继承,则为true。但是当文件很多,并且几乎每个文件都有单独的权限设置(例如Cygwin下的文件)时,我不能简单地将它们替换为相同的权限。
刘岩刘研

Answers:


11

您可以使用setacl用新的替换孤立的SID。例如,使用以下命令将旧的SID替换为新的SID:

setacl.exe -on C:\ 
           -ot file 
           -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst" 
           -rec cont

不错的工具!那就是我想要的(尽管它并没有改变用户的SID)!现在在我的必备清单中!但是,有一个意外的行为:当我在测试批处理后尝试执行此操作(不删除目录和文件)时,该目录将继承其父目录的权限,这是不必要的。注意:目录的ACL通过cacls命令更改,但其继承标志未更改。
刘岩刘研2013年

我认为根据SetACL文档,该目录必须为C:\\。
cdmckay

@cdmckay:不确定。它说:“如果对象名称以反斜杠结尾,并且将其括在引号中,请确保使用另一个反斜杠转义最后一个反斜杠”。但是我没有将其用引号引起来。
Daniel Gehriger 2013年

1
从2016年1月8日起,有必要为受托人操作指定一个内容,或者未设置所有者。该行需要是。即使这样,它也无法正确设置cygwin为该组选择的内容(仍在中显示为“ unknown” )。-actn trustee-actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst;w:d,s,o,g"/bin/ls -l
Makyen

1
@Makyen:cygwin遇到了同样的问题,并用cygwin进行了修复,-rec cont_obj因为它也对文件应用了更改。
丹尼斯·巴哈列夫'18

3
  1. 没有支持的方法来更改计算机的SID或更改本地帐户的SID,以使其与计算机的SID不匹配。

  2. 问题的措辞意味着您将频繁地重新安装操作系统,而无需这样做。如果您遇到了需要重新安装的重复问题,那么值得找出导致它们的原因,而不是每次都重新安装。

  3. 某些组使用众所周知的SID,这意味着在重新安装计算机时它们不会更改。因此,可以通过提前选择权限以使他们使用这些组来简化问题。其中一些有用的组包括管理员,高级用户,用户,已验证用户和交互。

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

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

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

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

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

因此,如果我以管理员身份进行操作并将文件从旧用户位置复制到新用户位置,是否会将每个文件的tge SUD设置为tge新用户?
trusktr 2014年

@trusktr:取决于您的意思;文件的所有权分配给执行复制的admin用户,但权限是从父文件夹继承的。通常,只有权限才重要。
哈里·约翰斯顿

好吧,基本上我想做的是将所有文件从旧的Windows C:\ Users \ username位置复制到新的Windows C:\ Users \ username位置,以便这些文件都属于新用户(只需迁移到新的Windows基本安装,并希望保留以前用户的文件)。新旧用户名相同。将文件以管理员的方式从一个地方复制到另一个地方会成功吗?我很想知道文件的SID是否将更改为新用户的SID,因为我正在使用NTFS-3G将文件SID映射到我的Linux用户。
trusktr 2014年

@trusktr:在这种情况下,所有权不会有问题,但是用户配置文件包含无法以这种方式迁移的内容(最值得注意的是用户的注册表配置单元)。Robocopy就权限而言是可以的,但是我建议复制每个单独的文件夹(例如,Documents,Desktop等),而不是复制整个<username>文件夹。忽略诸如AppData之类的隐藏文件夹-确保保留副本,但不要将其复制到新帐户的顶部。
哈里·约翰斯顿

理想情况下,我只想将<username>文件夹保留在单独的分区(旧的Windows分区)上,并将该<username>文件夹作为新Windows的用户<username>的主文件夹。
trusktr 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.