Ogni volta che abbiamo reinstallato Windows, verrà creato un nuovo SID per l'utente, anche se il nome utente è lo stesso di prima.
// 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
Il fastidioso problema dopo la reinstallazione è la gestione dei file NTFS e le autorizzazioni sul disco rigido sono ancora associate al SID del vecchio utente.
Voglio mantenere l'impostazione di proprietà e autorizzazione dei file NTFS, quindi voglio consentire al nuovo utente di prendere il SID del vecchio utente, in modo da poter accedere ai file come prima senza problemi di autorizzazione.
Lo cacls
strumento da riga di comando non può essere utilizzato in tale situazione, perché il file appartiene a un nuovo utente, quindi fallirà con Accesso negato errore. e non può cambiare la proprietà.
Anche se posso modificare la Owerhip tramite lo SubInACL
strumento, cacls
non riesco a rimuovere l'autorizzazione del vecchio utente perché il vecchio utente non esiste nella nuova installazione e non posso copiare l' autorizzazione del vecchio utente nel nuovo utente.
Quindi, possiamo semplicemente associare il SID del vecchio utente al nuovo utente su Windows appena installato?
Lotto di prova del campione
@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 !