Mỗi lần chúng tôi cài đặt lại Windows, nó sẽ tạo ra một SID mới cho người dùng thậm chí tên người dùng là như nhau như trước đây.
// 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
Vấn đề gây phiền nhiễu sau khi cài đặt lại là quyền hạn của tệp NTFS và quyền trên ổ đĩa cứng vẫn được liên kết với SID của người dùng cũ.
Tôi muốn giữ quyền sở hữu và cài đặt quyền của các tệp NTFS, sau đó muốn cho phép người dùng mới lấy SID của người dùng cũ, để tôi có thể truy cập các tệp như trước mà không gặp sự cố về quyền.
Công cacls
cụ dòng lệnh không thể được sử dụng trong tình huống như vậy, vì tệp không thuộc về người dùng mới, do đó, nó sẽ bị lỗi với Access bị từ chối . và nó không thể thay đổi quyền sở hữu.
Ngay cả khi tôi có thể thay đổi quyền hạn thông qua SubInACL
công cụ, cacls
không thể xóa quyền của người dùng cũ vì người dùng cũ không tồn tại trên bản cài đặt mới và không thể sao chép quyền của người dùng cũ sang người dùng mới.
Vì vậy, chúng ta có thể liên kết đơn giản SID của người dùng cũ với người dùng mới trên Windows mới cài đặt không?
Lô thử nghiệm mẫu
@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 !