Jak powiązać identyfikator SID starego użytkownika z nowym użytkownikiem, aby zachować własność i uprawnienia do plików NTFS po ponownej instalacji systemu Windows?

18

Za każdym razem, gdy ponownie instalujemy system Windows, tworzy on nowy identyfikator SID dla użytkownika, nawet nazwa użytkownika jest taka sama jak poprzednio.

// 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

Irytującym problemem po ponownej instalacji jest zarządzanie plikami NTFS, a uprawnienia na dysku twardym są nadal powiązane z identyfikatorem SID starego użytkownika.

Chcę zachować własność i ustawienia uprawnień do plików NTFS, a następnie pozwolić nowemu użytkownikowi pobrać identyfikator SID starego użytkownika, aby móc uzyskać dostęp do plików jak poprzednio bez problemu z uprawnieniami.

W caclstakim przypadku nie można użyć narzędzia wiersza poleceń, ponieważ plik należy do nowego użytkownika, więc nie powiedzie się z powodu błędu odmowy dostępu . i nie może zmienić właściciela.

Nawet jeśli mogę zmienić uprawnienia za pomocą SubInACLnarzędzia, caclsnie mogę usunąć uprawnienia starego użytkownika, ponieważ stary użytkownik nie istnieje podczas nowej instalacji, i nie mogę skopiować uprawnienia starego użytkownika do nowego użytkownika.

Czy możemy po prostu powiązać identyfikator SID starego użytkownika z nowym użytkownikiem w świeżo zainstalowanym systemie Windows?

Próbka partii testowej

@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 !
LiuYan 刘 研
źródło
Dlaczego jesteś przeciwny przejęciu pliku na własność?
Ramhound
Jeśli zostanie przejęta tylko własność, niektóre pliki nie będą dostępne, ponieważ uprawnienia są nadal ustawione na identyfikator SID starego użytkownika.
LiuYan
@LiuYan 刘 研 Ale po przejęciu własności powinieneś być w stanie edytować wszystkie uprawnienia.
Iszi
1
@IsziRoryorIsznti, prawda, jeśli plików jest niewiele, a wszystkie uprawnienia są dziedziczone od rodziców. ale gdy jest wiele plików i prawie każdy plik ma indywidualne ustawienie uprawnień (np. pliki w Cygwin), nie mogę po prostu zastąpić ich tym samym uprawnieniem.
LiuYan 刘 研

Odpowiedzi:

11

Możesz użyć setacl, aby zastąpić osierocone identyfikatory SID nowymi. Na przykład użyj następujących, aby zastąpić stary identyfikator SID nowym:

setacl.exe -on C:\ 
           -ot file 
           -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst" 
           -rec cont
Daniel Gehriger
źródło
Ładne narzędzie! Właśnie tego chciałem (chociaż nie zmieniło to identyfikatora SID użytkownika)! Teraz jest na mojej liście must have! Występuje jednak nieoczekiwane zachowanie: gdy próbowałem tego po mojej partii testowej (bez usuwania katalogu i pliku), katalog odziedziczy uprawnienia po rodzicu, co jest niepożądane. Uwaga: ACL katalogu jest zmieniana za pomocą caclspolecenia, ale jego flaga dziedziczenia nie jest zmieniana.
LiuYan
Myślę, że musi to być C: \\ zgodnie z dokumentacją SetACL.
cdmckay
@cdmckay: nie jestem pewien. Mówi: „Jeśli nazwa obiektu kończy się ukośnikiem odwrotnym i ujęłeś ją w cudzysłów, pamiętaj, aby uciec przed ostatnim ukośnikiem odwrotnym”. Ale nie ujmuję tego w cytaty.
Daniel Gehriger
1
Od 1 stycznia 2016 r. Konieczne jest określenie, co dla powiernika lub właściciel nie jest ustawiony. -actn trusteeLinia musi być -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst;w:d,s,o,g". Nawet wtedy nie ustawia poprawnie tego, co cygwin wybiera dla grupy (zdjęcia są wyświetlane jako „nieznane” w /bin/ls -l).
Makyen
1
@Makyen: Miałem ten sam problem z cygwin i naprawiłem go, -rec cont_objponieważ dotyczy on również zmian w plikach.
Denis Bakharev
3
  1. Nie ma obsługiwanego sposobu zmiany identyfikatora SID komputera lub zmiany identyfikatora SID konta lokalnego, aby nie był zgodny z identyfikatorem komputera.

  2. Treść pytania sugeruje, że często instalujesz system operacyjny, co nie powinno być konieczne. Jeśli masz powtarzające się problemy, które wymagają ponownej instalacji, może warto dowiedzieć się, co je powoduje, niż tylko ponowna instalacja za każdym razem.

  3. Niektóre grupy używają dobrze znanych identyfikatorów SID, co oznacza, że ​​nie zmieniają się one podczas ponownej instalacji komputera. Możesz więc uprościć swój problem, wybierając wcześniej uprawnienia, aby korzystały z tych grup. Niektóre z tych grup, które mogą być przydatne, to Administratorzy, Użytkownicy zaawansowani, Użytkownicy, Użytkownicy uwierzytelnieni i INTERAKTYWNY.

  4. Jednym z powolnych, ale łatwych sposobów resetowania uprawnień dla całego drzewa folderów jest jego skopiowanie:

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

    Należy to uruchomić z wiersza polecenia z podwyższonym poziomem uprawnień. Użycie opcji / b powoduje, że robocopy korzysta z przywileju przywracania, aby ominąć zabezpieczenia plików. Utwórz c:\new-copyprzed rozpoczęciem i ustaw odpowiednie uprawnienia.

    Możesz użyć tego polecenia, aby usunąć oryginalny folder po skopiowaniu:

    robocopy /e /b c:\empty-folder c:\original-folder
    
Harry Johnston
źródło
Więc jeśli zrobię to jako administrator i skopiuję pliki ze starej lokalizacji użytkownika do nowej lokalizacji użytkownika, czy ustawi SUD każdego pliku na tge nowego użytkownika ?.
trusktr
@trusktr: zależy, co masz na myśli; własność plików jest przypisana do administratora, który wykonuje kopię, ale uprawnienia są dziedziczone z folderu nadrzędnego. Zazwyczaj tylko uprawnienia mają znaczenie.
Harry Johnston,
Cóż, w zasadzie to, co chcę zrobić, to skopiować wszystkie pliki ze starej lokalizacji Windows C: \ Users \ nazwa użytkownika do nowej lokalizacji Windows C: \ Users \ nazwa użytkownika, aby wszystkie te pliki należały do ​​nowego użytkownika (migracja do nowego systemu Windows zainstalować w zasadzie i chcę zachować pliki mojego poprzedniego użytkownika). To ta sama nazwa użytkownika zarówno w starym, jak i nowym. Czy prosta kopia plików z jednego miejsca do drugiego jako administrator zrobi to samo? Jestem ciekawy, czy identyfikatory SID plików zmienią się na identyfikatory SID nowego użytkownika, ponieważ używam NTFS-3G do mapowania identyfikatorów SID plików na mojego użytkownika Linux.
trusktr
@trusktr: własność nie będzie w takim przypadku problemem, ale profil użytkownika zawiera elementy (przede wszystkim gałąź rejestru użytkownika), których nie można migrować w ten sposób. Robocopy będzie dobrze, jeśli chodzi o uprawnienia, ale zalecam kopiowanie każdego pojedynczego folderu (np. Dokumenty, Pulpit itp.) Zamiast całego folderu <nazwa użytkownika>. Pomiń ukryte foldery, takie jak AppData - pamiętaj, aby zachować kopię, ale nie kopiuj jej nad nowym kontem.
Harry Johnston,
Idealnie chciałbym po prostu przechowywać folder <nazwa użytkownika> na osobnej partycji (stara partycja Windows) i ustawić ten folder <nazwa użytkownika> na folder domowy dla mojego użytkownika <nazwa użytkownika> mojego nowego systemu Windows.
trusktr