ทุกครั้งที่เราติดตั้ง Windows ก็จะสร้าง SID ใหม่สำหรับผู้ใช้แม้กระทั่งชื่อผู้ใช้จะเป็นแบบเดียวกันกับก่อนที่จะ
// 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
ปัญหาที่น่ารำคาญหลังจากติดตั้งใหม่คือไฟล์ NTFS owership และการอนุญาตบนฮาร์ดดิสก์ไดรฟ์ยังคงเชื่อมโยงกับ SID ของผู้ใช้เก่า
ฉันต้องการรักษาความเป็นเจ้าของและการตั้งค่าสิทธิ์ของไฟล์ NTFS จากนั้นต้องการให้ผู้ใช้ใหม่ใช้ SID ของผู้ใช้เก่าเพื่อให้ฉันสามารถเข้าถึงไฟล์ได้เหมือน แต่ก่อนโดยไม่มีปัญหาสิทธิ์
cacls
เครื่องมือบรรทัดคำสั่งไม่สามารถใช้ในสถานการณ์เช่นนี้เพราะไฟล์ไม่เป็นผู้ใช้ใหม่จึงจะล้มเหลวด้วยการเข้าถึงถูกปฏิเสธข้อผิดพลาด และมันไม่สามารถเปลี่ยนความเป็นเจ้าของได้
แม้ว่าฉันจะสามารถเปลี่ยน owership ผ่านSubInACL
เครื่องมือcacls
ไม่สามารถลบสิทธิ์ผู้ใช้เก่าได้เนื่องจากผู้ใช้เก่าไม่มีอยู่ในการติดตั้งใหม่และไม่สามารถคัดลอกสิทธิ์ของผู้ใช้เก่าไปยังผู้ใช้ใหม่
ดังนั้นเราสามารถผูก SID ของผู้ใช้เก่ากับผู้ใช้ใหม่บน Windows ที่ติดตั้งใหม่ได้หรือไม่?
ชุดทดสอบตัวอย่าง
@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 !