Как привязать SID старого пользователя к новому пользователю, чтобы сохранить право собственности на файл NTFS и разрешения после новой переустановки Windows?


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не могу удалить разрешение старого пользователя, поскольку старый пользователь не существует при новой установке, и не может скопировать разрешение старого пользователя новому пользователю.

Итак, можем ли мы просто привязать 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 !

Почему вы против того, чтобы стать владельцем файла?
Ramhound

Если взято только право собственности, некоторые файлы по-прежнему недоступны, поскольку разрешение по-прежнему установлено на SID старого пользователя.
LiuYan 研 研

@LiuYan 刘 研 Но после того, как вы вступите во владение, вы сможете редактировать все разрешения.
Изи

1
@IsziRoryorIsznti, true, если файлов мало и все разрешения унаследованы от родителей. но когда файлов много, и почти каждый файл имеет индивидуальную настройку разрешений (например, файлы в Cygwin), я не могу просто заменить их одинаковыми разрешениями.
LiuYan 研 研

Ответы:


11

Вы можете использовать setacl, чтобы заменить потерянные идентификаторы безопасности новыми. Например, используйте следующую команду для замены старого 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команды, но его флаг наследования не изменяется.
LiuYan 刘 研

Я думаю, что это должно быть C: \ в соответствии с документами SetACL.
cdmckay

@cdmckay: не уверен. В нем говорится: «Если имя объекта заканчивается обратной косой чертой, а вы заключаете его в кавычки, обязательно избегайте последней обратной косой черты с другой обратной косой чертой». Но я не заключаю это в кавычки.
Даниэль Геригер

1
По состоянию на 2016-01-08, необходимо указать, что для действия опекуна или владелец не установлен. -actn trusteeЛиния должна быть -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst;w:d,s,o,g". Даже в этом случае он неправильно устанавливает то, что cygwin подхватывает для группы (кадры отображаются как «неизвестные» /bin/ls -l).
Макьен,

1
@Makyen: у меня была та же проблема с cygwin, и я исправил ее, -rec cont_objпотому что она также применяет изменения к файлам.
Денис Бахарев

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
    

Поэтому, если я делаю это как администратор и копирую файлы из старого пользовательского местоположения в новое пользовательское местоположение, устанавливает ли tge SUD каждого файла значение tge нового пользователя ?.
trusktr

@trusktr: зависит от того, что вы имеете в виду; право собственности на файлы назначается пользователю-администратору, который делает копию, но разрешения наследуются от родительской папки. Как правило, только разрешения имеют значение.
Гарри Джонстон

Ну, в общем, что я хочу сделать, это скопировать все файлы из старого расположения Windows C: \ Users \ username в новое расположение Windows C: \ Users \ username, чтобы все эти файлы принадлежали новому пользователю (просто мигрируя на новую Windows установить в основном, и желая сохранить файлы моего предыдущего пользователя). Это одно и то же имя пользователя как в старом, так и в новом. Будет ли простая копия файлов из одного места в другое, как администратор, добьется цели? Мне любопытно узнать, изменится ли SID файлов на SID нового пользователя, потому что я использую NTFS-3G для сопоставления SID файлов с моим пользователем Linux.
trusktr

@trusktr: владение не будет проблемой в этом случае, но профиль пользователя содержит материал (особенно куст реестра пользователя), который не может быть перенесен таким образом. Robocopy будет в порядке с разрешениями, но я рекомендую копировать каждую отдельную папку (например, Documents, Desktop и т. Д.), А не всю папку <username>. Оставьте скрытые папки, такие как AppData - убедитесь, что вы сохраняете копию, но не копируйте их поверх новой учетной записи.
Гарри Джонстон

В идеале я хотел бы просто сохранить папку <username> в отдельном разделе (старый раздел Windows) и сделать эту папку <username> домашней папкой для моего пользователя <username> в моей новой Windows.
trusktr
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.