Comment lier le SID de l'ancien utilisateur au nouvel utilisateur pour conserver la propriété du fichier NTFS et les autorisations après une réinstallation récente de Windows?

18

Chaque fois que nous avons réinstallé Windows, il crée un nouveau SID pour l'utilisateur, même si le nom d'utilisateur est le même qu'avant.

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

Le problème gênant après la réinstallation est la propriété des fichiers NTFS et les autorisations sur le disque dur sont toujours associées au SID de l'ancien utilisateur.

Je souhaite conserver le paramètre de propriété et d'autorisation des fichiers NTFS, puis laisser le nouvel utilisateur prendre le SID de l'ancien utilisateur, afin que je puisse accéder aux fichiers comme auparavant sans problème d'autorisation.

L' caclsoutil de ligne de commande ne peut pas être utilisé dans une telle situation, car le fichier appartient au nouvel utilisateur, il échouera donc avec Access est refusé . et il ne peut pas changer de propriétaire.

Même si je peux changer la propriété via l' SubInACLoutil, je ne caclspeux pas supprimer l'autorisation de l'ancien utilisateur car l'ancien utilisateur n'existe pas sur la nouvelle installation et ne peut pas copier l'autorisation de l'ancien utilisateur vers le nouvel utilisateur.

Alors, pouvons-nous simplement lier le SID de l'ancien utilisateur au nouvel utilisateur sur Windows récemment installé?

Exemple de lot de test

@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 刘 研
la source
Pourquoi êtes-vous contre le fait de simplement prendre possession du fichier?
Ramhound
Si seule la propriété est prise, certains fichiers ne seront pas accessibles car l'autorisation est toujours définie sur le SID de l'ancien utilisateur.
LiuYan 刘 研
@LiuYan 刘 研 Mais après avoir pris possession, vous devriez pouvoir modifier toutes les autorisations.
Iszi
1
@IsziRoryorIsznti, vrai s'il y a peu de fichiers et que toutes les autorisations sont héritées des parents. mais quand il y a beaucoup de fichiers, et presque chaque fichier a un paramètre d'autorisation individuel (comme les fichiers sous Cygwin), alors je ne peux pas simplement les remplacer par la même autorisation.
LiuYan 刘 研

Réponses:

11

Vous pouvez utiliser setacl pour remplacer les SID orphelins par un nouveau. Par exemple, utilisez ce qui suit pour remplacer votre ancien SID par le nouveau:

setacl.exe -on C:\ 
           -ot file 
           -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst" 
           -rec cont
Daniel Gehriger
la source
Bel outil! C'est ce que je voulais (bien que cela ne change pas le SID utilisateur)! C'est dans ma liste incontournable maintenant! Cependant, il y a un comportement inattendu: lorsque j'ai essayé cela après mon lot de tests (sans supprimer le répertoire et le fichier), le répertoire héritera des autorisations de son parent, c'est quelque chose de indésirable. Remarque: L'ACL du répertoire est modifiée via la caclscommande, mais son indicateur d'héritage n'est pas modifié.
LiuYan 刘 研
Je pense que cela doit être C: \\ selon les documents SetACL.
cdmckay
@cdmckay: pas sûr. Il dit: "Si le nom de l'objet se termine par une barre oblique inverse et que vous le mettez entre guillemets, assurez-vous d'échapper la dernière barre oblique inverse avec une autre barre oblique inverse". Mais je ne le mets pas entre guillemets.
Daniel Gehriger
1
Depuis le 2016-01-08, il est nécessaire de spécifier quoi pour l' action du syndic ou le propriétaire n'est pas défini. La -actn trusteeligne doit être -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst;w:d,s,o,g". Même alors, il ne définit pas correctement tout ce que cygwin ramasse pour le groupe (les images fixes s'affichent comme "inconnues" dans /bin/ls -l).
Makyen
1
@Makyen: J'ai eu le même problème avec cygwin et je l'ai résolu -rec cont_objcar il applique également des modifications sur les fichiers.
Denis Bakharev
3
  1. Il n'existe aucun moyen pris en charge pour modifier le SID de l'ordinateur ou pour modifier le SID d'un compte local afin qu'il ne corresponde pas à celui de l'ordinateur.

  2. Le libellé de votre question implique que vous réinstallez fréquemment le système d'exploitation, ce que vous ne devriez pas faire. Si vous rencontrez des problèmes répétés qui nécessitent une réinstallation, il peut être utile de déterminer la cause de ces problèmes plutôt que de simplement réinstaller chaque fois.

  3. Certains groupes utilisent des SID connus, ce qui signifie qu'ils ne changent pas lors de la réinstallation de l'ordinateur. Vous pouvez donc simplifier votre problème en choisissant des autorisations à l'avance afin qu'ils utilisent ces groupes. Certains de ces groupes qui pourraient être utiles incluent les administrateurs, les utilisateurs avec pouvoir, les utilisateurs, les utilisateurs authentifiés et INTERACTIVE.

  4. Un moyen lent mais facile de réinitialiser les autorisations pour une arborescence de dossiers entière est de la copier:

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

    Cela doit être exécuté à partir d'une invite de commandes élevée. L'utilisation de l'option / b fait que robocopy utilise le privilège de restauration pour contourner la sécurité sur les fichiers. Créez c:\new-copyavant de commencer et définissez les autorisations comme vous le souhaitez.

    Vous pouvez utiliser cette commande pour supprimer le dossier d'origine après l'avoir copié:

    robocopy /e /b c:\empty-folder c:\original-folder
    
Harry Johnston
la source
Donc, si je fais cela en tant qu'administrateur et que je copie des fichiers d'un ancien emplacement utilisateur vers le nouvel emplacement utilisateur, cela définit-il le tge SUD de chaque fichier pour le tge nouvel utilisateur?.
trusktr
@trusktr: dépend de ce que vous voulez dire; la propriété des fichiers est attribuée à l'utilisateur administrateur qui effectue la copie, mais les autorisations sont héritées du dossier parent. En règle générale, seules les autorisations sont importantes.
Harry Johnston
Eh bien, fondamentalement, ce que je veux faire, c'est copier tous les fichiers d'un ancien emplacement Windows C: \ Users \ username vers un nouvel emplacement Windows C: \ Users \ username afin que ces fichiers appartiennent tous au nouvel utilisateur (simplement migrer vers un nouveau Windows installer en gros, et vouloir conserver les fichiers de mon utilisateur précédent). C'est le même nom d'utilisateur dans l'ancien et le nouveau. Est-ce qu'une simple copie des fichiers d'un endroit à l'autre en tant qu'administrateur fera l'affaire? Je suis curieux de savoir si les SID des fichiers changeront pour le SID du nouvel utilisateur car j'utilise NTFS-3G pour mapper les SID de fichier à mon utilisateur Linux.
trusktr
@trusktr: la propriété ne sera pas un problème dans ce cas, mais le profil utilisateur contient des éléments (notamment la ruche de registre de l'utilisateur) qui ne peuvent pas être migrés de cette façon. Robocopy ira bien en ce qui concerne les autorisations, mais je recommande de copier chaque dossier individuel (par exemple, Documents, Bureau, etc.) plutôt que l'ensemble du dossier <username>. Oubliez les dossiers cachés comme AppData - assurez-vous de conserver une copie, mais ne les copiez pas par-dessus le nouveau compte.
Harry Johnston
Idéalement, je voudrais simplement conserver mon dossier <username> sur une partition distincte (l'ancienne partition Windows) et faire de ce dossier <username> le dossier de base de mon utilisateur <username> de mon nouveau Windows.
trusktr