Як прив’язати 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командного рядка не може бути використаний у такій ситуації, оскільки файл належить новому користувачеві, тому він не зможе, якщо Access відхиляється помилкою. і він не може змінити право власності.

Навіть якщо я можу змінити право власності за допомогою 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 !

Чому ви проти просто взяти право власності на файл?
Рамхаунд

Якщо взято лише право власності, деякі файли підвіконня недоступні, оскільки дозвіл все ще встановлено на SID старого користувача.
Люйян 刘 研

@LiuYan 刘 研 Але після того, як ви переймете право власності, ви зможете редагувати всі дозволи.
Ізі

1
@IsziRoryorIsznti, правда, якщо файлів мало, і всі дозволи передаються у спадок від батьків. але коли файлів багато, і майже кожен файл має індивідуальні налаштування дозволу (наприклад, файли під Cygwin), я не можу просто замінити їх таким же дозволом.
LiuYan 刘 研

Відповіді:


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

Гарний інструмент! Саме цього я хотів (хоча це не змінило користувача SID)! Зараз у моєму обов’язковому списку! Однак є несподівана поведінка: коли я спробував це після моєї тестової партії (без видалення каталогу та файлу), каталог буде успадковувати дозволи від батьків, це щось небажане. Примітка: ACL каталогу змінюється за допомогою caclsкоманди, але його прапор спадкування не змінюється.
Люян 刘 研

Я думаю, що це повинно бути C: \\ згідно з документами SetACL.
cdmckay

@cdmckay: не впевнений. У ньому написано: "Якщо ім'я об'єкта закінчується зворотною косою рисою, і ви додаєте його до лапок, переконайтеся, що уникнути останньої косої риски з іншою рисою". Але я не вкладаю це в лапки.
Даніель Герігер

1
Станом на 01.08.2016, потрібно вказати, що для довіреної дії або власник не встановлено. -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. Окремі групи використовують відомі SID, що означає, що вони не змінюються під час перевстановлення комп'ютера. Тож ви можете спростити свою проблему, вибираючи дозволи достроково, щоб вони використовували ці групи. Деякі з цих груп, які можуть бути корисними, включають адміністраторів, користувачів енергії, користувачів, аутентифікованих користувачів та ІНТЕРАКТИВНИЙ.

  4. Один повільний, але простий спосіб скидання дозволів для всього дерева папок - це скопіювати його:

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

    Це потрібно виконати з підвищеного командного рядка. Використання параметра / b змушує роботокопію використовувати привілей відновлення, щоб обійти захист файлів. Створіть c:\new-copyперед початком роботи та встановіть потрібні дозволи.

    Ви можете скористатися цією командою для видалення вихідної папки після її копіювання:

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

Отже, якщо я роблю це як адміністратор і копіюю файли зі старого місцезнаходження користувача на нове місце користувача, чи встановить це значення SUD кожного файлу для нового користувача ?.
trusktr

@trusktr: залежить, що ти маєш на увазі; право власності на файли призначається користувачеві адміністратора, який виконує копію, але дозволи передаються у спадок від батьківської папки. Зазвичай значення мають лише дозволи.
Гаррі Джонстон

Ну в основному те, що я хочу зробити, - скопіювати всі файли зі старої Windows C: \ Users \ розташування імені користувача на нову Windows C: \ Users \ ім'я користувача, щоб ці файли належали новому користувачеві (просто переходимо до нової Windows встановити в основному і хочуть зберегти файли мого попереднього користувача). Це одне і те ж ім’я користувача і в старому, і в новому. Чи зробить просту копію файлів з одного місця в інше адміністратор? Мені цікаво дізнатись, чи зміняться SID-файли на SID нового користувача, оскільки я використовую NTFS-3G для зіставлення SID-файлів мого користувача Linux.
trusktr

@trusktr: право власності в цьому випадку не буде проблемою, але профіль користувача містить матеріали (особливо, вулик реєстру користувача), які неможливо перенести таким чином. Робокопія буде чудовою, що стосується дозволів, але я рекомендую скопіювати кожну окрему папку (наприклад, Документи, Робочий стіл тощо), а не всю папку <ім'я користувача>. Залиште приховані папки типу AppData - не забудьте зберегти копію, але не копіюйте їх поверх нового облікового запису.
Гаррі Джонстон

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