Como vincular o SID do usuário antigo ao novo usuário para permanecer com a propriedade e as permissões do arquivo NTFS após a reinstalação recente do Windows?

18

Cada vez que reinstalamos o Windows, ele cria um novo SID para o usuário, mesmo que o nome de usuário seja o mesmo de 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

O problema irritante após a reinstalação é a propriedade do arquivo NTFS e as permissões no disco rígido ainda estão associadas ao SID do usuário antigo.

Desejo manter a propriedade e a configuração de permissão dos arquivos NTFS e depois permitir que o novo usuário tome o SID do usuário antigo, para que eu possa acessar os arquivos como antes sem problemas de permissão.

A caclsferramenta de linha de comando não pode ser usada nessa situação, porque o arquivo pertence a um novo usuário, portanto falhará com o erro de acesso negado . e não pode mudar de propriedade.

Mesmo que eu possa alterar a autoridade por meio da SubInACLferramenta, caclsnão consigo remover a permissão do usuário antigo porque o usuário antigo não existe na nova instalação e não consigo copiar a permissão do usuário antigo para o novo usuário.

Então, podemos simplesmente vincular o SID do usuário antigo ao novo usuário no Windows recém-instalado?

Lote de teste de amostra

@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 刘 研
fonte
Por que você é contra apenas tomar posse do arquivo?
Ramhound
Se apenas a propriedade for tomada, alguns arquivos ainda não poderão ser acessados ​​porque a permissão ainda está definida como o SID do usuário antigo.
Liuyan刘研
@LiuYan 研 研 Mas depois de se apropriar, você poderá editar todas as permissões.
Iszi
1
@IsziRoryorIsznti, true se houver poucos arquivos e todas as permissões forem herdadas dos pais. mas quando há muitos arquivos e quase todos os arquivos têm configurações de permissão individuais (como arquivos no Cygwin), não posso simplesmente substituí-los pela mesma permissão.
Liuyan刘研

Respostas:

11

Você pode usar o setacl para substituir os SIDs órfãos por um novo. Por exemplo, use o seguinte para substituir seu antigo SID pelo novo:

setacl.exe -on C:\ 
           -ot file 
           -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst" 
           -rec cont
Daniel Gehriger
fonte
Nice tool! Era isso que eu queria (embora não tenha alterado o SID do usuário)! Está na minha lista obrigatória agora! No entanto, há um comportamento inesperado: quando eu tentei isso após o lote de teste (sem excluir o diretório e o arquivo), o diretório herdará permissões do pai, isso é algo indesejável. Nota: A ACL do diretório é alterada via caclscomando, mas seu sinalizador de herança não é alterado.
LiuYan #
Eu acho que precisa ser C: \\ de acordo com os documentos do SetACL.
Cdmckay
@cdmckay: não tenho certeza. Ele diz: "Se o nome do objeto terminar com uma barra invertida e você o incluir entre aspas, certifique-se de escapar da última barra invertida com outra barra invertida". Mas não estou entre aspas.
Daniel Gehriger,
1
A partir de 08-01-2016, é necessário especificar um quê para a ação do trustee ou o proprietário não está definido. A -actn trusteelinha precisa ser -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst;w:d,s,o,g". Mesmo assim, ele não define corretamente o que o cygwin seleciona para o grupo (as imagens estáticas são exibidas como "desconhecidas" /bin/ls -l).
Makyen 8/01/16
1
@ Makyen: Eu tive o mesmo problema com o cygwin e o corrigi -rec cont_objporque também aplica alterações nos arquivos.
Denis Bakharev
3
  1. Não há como suportar o SID do computador ou o SID de uma conta local para que não corresponda ao do computador.

  2. A redação da sua pergunta implica que você está reinstalando o sistema operacional com freqüência, o que não deve ser necessário. Se você estiver tendo problemas repetidos que exijam uma reinstalação, pode valer a pena descobrir o que os está causando, em vez de apenas reinstalar a cada vez.

  3. Certos grupos usam SIDs conhecidos, o que significa que eles não são alterados quando o computador é reinstalado. Portanto, você pode simplificar seu problema escolhendo permissões com antecedência para que eles usem esses grupos. Alguns desses grupos que podem ser úteis incluem Administradores, Usuários avançados, Usuários, Usuários autenticados e INTERATIVO.

  4. Uma maneira lenta, porém fácil, de redefinir as permissões para uma árvore de pastas inteira é copiá-la:

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

    Isso deve ser executado em um prompt de comando elevado. O uso da opção / b faz com que a robocopy use o privilégio de restauração para ignorar a segurança nos arquivos. Crie c:\new-copyantes de iniciar e defina as permissões conforme desejado.

    Você pode usar este comando para excluir a pasta original após copiá-la:

    robocopy /e /b c:\empty-folder c:\original-folder
    
Harry Johnston
fonte
Portanto, se eu fizer isso como administrador e copiar arquivos de um local antigo para o novo local, ele definirá o SUD de cada arquivo para o novo usuário ?.
trusktr 21/06
@trusktr: depende do que você quer dizer; a propriedade dos arquivos é atribuída ao usuário administrador que está fazendo a cópia, mas as permissões são herdadas da pasta pai. Normalmente, apenas as permissões são importantes.
Harry Johnston,
Bem, basicamente, o que eu quero fazer é copiar todos os arquivos de um local antigo do Windows C: \ Users \ nome de usuário para um novo local do Windows C: \ Users \ nome de usuário para que todos esses arquivos pertençam ao novo usuário (apenas migrando para um novo Windows instalar basicamente, e querendo manter os arquivos dos meus usuários anteriores). É o mesmo nome de usuário no antigo e no novo. Uma cópia simples dos arquivos de um lugar para outro como administrador fará o truque? Estou curioso para saber se os SIDs dos arquivos mudarão para o SID do novo usuário porque estou usando o NTFS-3G para mapear os SIDs de arquivo para o meu usuário Linux.
trusktr
@trusktr: a propriedade não será um problema nesse caso, mas o perfil do usuário contém coisas (principalmente a seção de registro do usuário) que não podem ser migradas dessa maneira. A robocópia será boa no que diz respeito às permissões, mas eu recomendo copiar cada pasta individual (por exemplo, Documentos, Área de Trabalho etc.) em vez de toda a pasta <username>. Deixe de fora as pastas ocultas, como AppData - mantenha uma cópia, mas não as copie por cima da nova conta.
Harry Johnston,
Idealmente, gostaria de manter minha pasta <username> em uma partição separada (a antiga partição do Windows) e tornar essa pasta a pasta inicial do meu usuário <username> do meu novo Windows.
trusktr