19

Каждый раз, когда мы переустанавливаем 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 !

2 ответа2

11

Вы можете использовать setacl для замены потерянных SID на новые. Например, используйте следующую команду для замены старого SID на новый:

setacl.exe -on C:\ 
           -ot file 
           -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst" 
           -rec cont
3
  1. Не поддерживается способ изменить SID компьютера или SID локальной учетной записи, чтобы он не совпадал с идентификатором компьютера.

  2. Формулировка вашего вопроса подразумевает, что вы часто переустанавливаете операционную систему, что вам не нужно делать. Если у вас возникают повторяющиеся проблемы, требующие переустановки, возможно, стоит выяснить, что их вызывает, а не просто переустанавливать каждый раз.

  3. Некоторые группы используют хорошо известные идентификаторы безопасности, что означает, что они не меняются при переустановке компьютера. Таким образом, вы можете упростить вашу проблему, выбрав разрешения заранее, чтобы они использовали эти группы. Некоторые из этих групп, которые могут быть полезны, включают в себя администраторов, опытных пользователей, пользователей, прошедших проверку пользователей и 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
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .