¿Cómo vincular el SID del usuario anterior con el nuevo usuario para mantener la propiedad y los permisos del archivo NTFS después de reinstalar Windows nuevamente?

18

Cada vez que reinstalamos Windows, creará un nuevo SID para el usuario, incluso el nombre de usuario es el mismo que antes.

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

El problema molesto después de la reinstalación es la propiedad del archivo NTFS y los permisos en el disco duro todavía están asociados con el SID del usuario anterior.

Quiero mantener la configuración de propiedad y permisos de los archivos NTFS, luego quiero permitir que el nuevo usuario tome el SID del usuario anterior, para que pueda acceder a los archivos como antes sin problemas de permisos.

La caclsherramienta de línea de comandos no se puede utilizar en tal situación, porque el archivo pertenece a un nuevo usuario, por lo que fallará con el error de acceso denegado . y no puede cambiar la propiedad.

Incluso si puedo cambiar la propiedad a través de la SubInACLherramienta, caclsno puedo eliminar el permiso del usuario anterior porque el usuario anterior no existe en una nueva instalación y no puedo copiar el permiso del usuario anterior al nuevo usuario.

Entonces, ¿podemos simplemente vincular el SID del antiguo usuario al nuevo usuario en el Windows recién instalado?

Lote de prueba de muestra

@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 刘 研
fuente
¿Por qué estás en contra de simplemente tomar posesión del archivo?
Ramhound
Si solo se toma la propiedad, algunos archivos aún no son accesibles porque el permiso todavía está configurado para el SID del usuario anterior.
LiuYan 刘 研
@LiuYan 刘 研 Pero después de tomar posesión, deberías poder editar todos los permisos.
Iszi
1
@IsziRoryorIsznti, es cierto si hay pocos archivos y todos los permisos son heredados de los padres. pero cuando hay muchos archivos, y casi cada archivo tiene una configuración de permiso individual (como archivos bajo Cygwin), entonces no puedo simplemente reemplazarlos con el mismo permiso.
LiuYan 刘 研

Respuestas:

11

Puede usar setacl para reemplazar los SID huérfanos por uno nuevo. Por ejemplo, use lo siguiente para reemplazar su SID anterior por el nuevo:

setacl.exe -on C:\ 
           -ot file 
           -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst" 
           -rec cont
Daniel Gehriger
fuente
Buena herramienta! ¡Eso es lo que quería (aunque no cambió el SID del usuario)! ¡Está en mi lista imprescindible ahora! Sin embargo, hay un comportamiento inesperado: cuando intenté esto después de mi lote de prueba (sin eliminar el directorio y el archivo), el directorio heredará los permisos de su padre, eso es algo no deseado. Nota: La ACL del directorio se cambia mediante un caclscomando, pero su bandera de herencia no se cambia.
LiuYan 刘 研
Creo que debe ser C: \\ según los documentos de SetACL.
cdmckay
@cdmckay: no estoy seguro. Dice: "Si el nombre del objeto termina con una barra diagonal inversa y lo encierra entre comillas, asegúrese de escapar de la última barra diagonal inversa con otra barra diagonal inversa". Pero no lo incluyo entre comillas.
Daniel Gehriger
1
A partir del 2016-01-08, es necesario especificar un qué para la acción del administrador o el propietario no está configurado. La -actn trusteelínea necesita ser -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst;w:d,s,o,g". Incluso entonces, no establece correctamente lo que Cygwin recoge para el grupo (las imágenes fijas se muestran como "desconocidas" en /bin/ls -l).
Makyen
1
@Makyen: tuve el mismo problema con cygwin y lo solucioné -rec cont_objporque también aplica cambios en los archivos.
Denis Bakharev
3
  1. No hay una forma compatible de cambiar el SID de la computadora o cambiar el SID de una cuenta local para que no coincida con el de la computadora.

  2. La redacción de su pregunta implica que está reinstalando el sistema operativo con frecuencia, lo que no debería necesitar hacer. Si tiene problemas repetidos que requieren una reinstalación, puede valer la pena averiguar qué los está causando en lugar de simplemente reinstalar cada vez.

  3. Ciertos grupos usan SID conocidos, lo que significa que no cambian cuando se reinstala la computadora. Por lo tanto, puede simplificar su problema eligiendo los permisos con anticipación para que usen estos grupos. Algunos de estos grupos que pueden ser útiles incluyen Administradores, Usuarios avanzados, Usuarios, Usuarios autenticados e INTERACTIVOS.

  4. Una forma lenta pero fácil de restablecer los permisos para un árbol de carpetas completo es copiarlo:

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

    Esto debe ejecutarse desde un símbolo del sistema elevado. El uso de la opción / b hace que robocopy use el privilegio de restauración para eludir la seguridad de los archivos. Cree c:\new-copyantes de comenzar y establezca los permisos como desee.

    Puede usar este comando para eliminar la carpeta original después de haberla copiado:

    robocopy /e /b c:\empty-folder c:\original-folder
    
Harry Johnston
fuente
Entonces, si hago esto como administrador y copio archivos de una ubicación de usuario anterior a la nueva ubicación de usuario, ¿establece tud SUD de cada archivo para tge nuevo usuario?
trusktr
@trusktr: depende de lo que quieras decir; la propiedad de los archivos se asigna al usuario administrador que está haciendo la copia, pero los permisos se heredan de la carpeta principal. Por lo general, solo importan los permisos.
Harry Johnston
Básicamente, lo que quiero hacer es copiar todos los archivos de una ubicación anterior de Windows C: \ Users \ username a una nueva ubicación de Windows C: \ Users \ username para que todos esos archivos pertenezcan al nuevo usuario (solo migrar a un Windows nuevo instalar básicamente, y querer mantener los archivos de mi usuario anterior). Es el mismo nombre de usuario tanto en el antiguo como en el nuevo. ¿Una simple copia de los archivos de un lugar a otro como administrador hará el truco? Tengo curiosidad por saber si los SID de los archivos cambiarán al SID del nuevo usuario porque estoy usando NTFS-3G para asignar los SID de archivo a mi usuario de Linux.
trusktr
@trusktr: la propiedad no será un problema en ese caso, pero el perfil de usuario contiene cosas (especialmente la sección de registro del usuario) que no se pueden migrar de esa manera. Robocopy estará bien en lo que respecta a los permisos, pero recomiendo copiar cada carpeta individual (por ejemplo, Documentos, Escritorio, etc.) en lugar de la carpeta completa <nombre de usuario>. Deje las carpetas ocultas como AppData; asegúrese de guardar una copia, pero no las copie sobre la parte superior de la nueva cuenta.
Harry Johnston
Idealmente, me gustaría mantener mi carpeta <username> en una partición separada (la antigua partición de Windows) y hacer que esa carpeta <username> sea la carpeta de inicio para mi usuario <username> de mi nuevo Windows.
trusktr