วิธีการผูก SID ของผู้ใช้เก่ากับผู้ใช้ใหม่เพื่อให้ยังคงความเป็นเจ้าของไฟล์ NTFS และการอนุญาตหลังจากติดตั้ง Windows ใหม่ได้อย่างไร


18

ทุกครั้งที่เราติดตั้ง 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 !

ทำไมคุณถึงต่อต้านการเป็นเจ้าของไฟล์?
Ramhound

หากมีการเป็นเจ้าของเท่านั้นไฟล์บางไฟล์นั้นไม่สามารถเข้าถึงได้เพราะสิทธิ์ยังคงถูกตั้งค่าเป็น SID ของผู้ใช้เก่า
LiuYan 刘研

@LiuYan 刘研 แต่หลังจากที่คุณเป็นเจ้าของคุณควรจะสามารถแก้ไขสิทธิ์ทั้งหมด
Iszi

1
@IsziRoryorIsznti จริงถ้ามีไฟล์ไม่กี่ไฟล์และสิทธิ์ทั้งหมดได้รับมาจากผู้ปกครอง แต่เมื่อมีไฟล์จำนวนมากและเกือบแต่ละไฟล์มีการตั้งค่าการอนุญาตแยกต่างหาก (เช่นไฟล์ภายใต้ Cygwin) ฉันก็ไม่สามารถแทนที่พวกเขาด้วยการอนุญาตแบบเดียวกัน
LiuYan 刘研

คำตอบ:


11

คุณสามารถใช้setaclเพื่อแทนที่ SID ที่ถูกโยงถึงด้วยอันใหม่ ตัวอย่างเช่นใช้สิ่งต่อไปนี้เพื่อแทนที่ SID เก่าของคุณด้วยอันใหม่:

setacl.exe -on C:\ 
           -ot file 
           -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst" 
           -rec cont

เครื่องมือที่ดี! นั่นคือสิ่งที่ฉันต้องการ (แม้ว่ามันจะไม่เปลี่ยนผู้ใช้ SID)! มันอยู่ในรายการต้องห้ามของฉันตอนนี้! อย่างไรก็ตามมีพฤติกรรมที่ไม่คาดคิด: เมื่อฉันลองทำสิ่งนี้หลังจากชุดการทดสอบของฉัน (โดยไม่ลบไดเรกทอรีและไฟล์) ไดเรกทอรีจะสืบทอดสิทธิ์จาก parent ของมันนั่นเป็นสิ่งที่ไม่ต้องการ หมายเหตุ: ACL ของไดเรกทอรีมีการเปลี่ยนแปลงผ่านcaclsคำสั่ง แต่การตั้งค่าสถานะการสืบทอดจะไม่เปลี่ยนแปลง
LiuYan 刘研

ฉันคิดว่าต้องเป็น C: \\ ตามเอกสารของ SetACL
cdmckay

@cdmckay: ไม่แน่ใจ มันบอกว่า: "ถ้าชื่อวัตถุลงท้ายด้วยแบ็กสแลชและคุณใส่ไว้ในเครื่องหมายคำพูดให้แน่ใจว่าได้หนีแบ็กสแลชสุดท้ายด้วยแบ็กสแลชอื่น" แต่ฉันไม่ได้ใส่ไว้ในเครื่องหมายคำพูด
Daniel Gehriger

1
ตั้งแต่วันที่ 2016-01-08 มีความจำเป็นต้องระบุสิ่งที่จะดำเนินการกับผู้ดูแลผลประโยชน์หรือไม่ได้ตั้งค่าเจ้าของ เส้นจะต้องมีการ-actn trustee -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst;w:d,s,o,g"ถึงอย่างนั้นมันก็ไม่ได้ตั้งค่าอย่างถูกต้องตามที่ cygwin เลือกสำหรับกลุ่ม (ภาพนิ่งแสดงเป็น "unknown" ใน/bin/ls -l)
Makyen

1
@Makyen: ฉันมีปัญหาเดียวกันกับ cygwin และแก้ไขด้วย-rec cont_objเพราะมันยังใช้การเปลี่ยนแปลงในไฟล์
เดนิสบาคาเรฟ

3
  1. ไม่มีวิธีที่รองรับในการเปลี่ยน SID ของคอมพิวเตอร์หรือเปลี่ยน SID ของบัญชีท้องถิ่นเพื่อให้ไม่ตรงกับของคอมพิวเตอร์นั้น

  2. ข้อความของคำถามของคุณบอกเป็นนัยว่าคุณกำลังติดตั้งระบบปฏิบัติการใหม่บ่อยครั้งซึ่งคุณไม่จำเป็นต้องทำ หากคุณมีปัญหาซ้ำซึ่งต้องมีการติดตั้งใหม่อาจเป็นสิ่งที่ควรพิจารณาว่าอะไรเป็นสาเหตุของปัญหาแทนที่จะติดตั้งใหม่ทุกครั้ง

  3. กลุ่มบางกลุ่มใช้SID ที่รู้จักกันดีซึ่งหมายความว่าพวกเขาจะไม่เปลี่ยนแปลงเมื่อติดตั้งคอมพิวเตอร์ใหม่ ดังนั้นคุณอาจทำให้ปัญหาของคุณง่ายขึ้นโดยเลือกการอนุญาตล่วงหน้าเพื่อให้พวกเขาใช้กลุ่มเหล่านี้ กลุ่มเหล่านี้บางกลุ่มที่อาจมีประโยชน์ ได้แก่ ผู้ดูแลระบบผู้ใช้ขั้นสูงผู้ใช้ผู้ใช้ที่ผ่านการตรวจสอบแล้วและมีการโต้ตอบ

  4. วิธีการตั้งค่าสิทธิ์ที่ช้า แต่ง่ายวิธีหนึ่งสำหรับโครงสร้างโฟลเดอร์ทั้งหมดคือการคัดลอก:

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

    นี้จะต้องเรียกใช้จากพรอมต์คำสั่งยกระดับ การใช้ตัวเลือก / b ทำให้ robocopy ใช้สิทธิ์คืนค่าเพื่อเลี่ยงผ่านการรักษาความปลอดภัยของไฟล์ สร้างc:\new-copyก่อนที่คุณจะเริ่มและตั้งค่าการอนุญาตตามที่ต้องการ

    คุณสามารถใช้คำสั่งนี้เพื่อลบโฟลเดอร์เดิมหลังจากคัดลอก:

    robocopy /e /b c:\empty-folder c:\original-folder
    

ดังนั้นถ้าฉันทำเช่นนี้ในฐานะผู้ดูแลระบบและคัดลอกไฟล์จากตำแหน่งผู้ใช้เก่าไปยังตำแหน่งผู้ใช้ใหม่มันตั้งค่า tge SUD ของแต่ละไฟล์เพื่อดึงผู้ใช้ใหม่หรือไม่
trusktr

@trusktr: ขึ้นอยู่กับว่าคุณหมายถึงอะไร ความเป็นเจ้าของของไฟล์จะถูกกำหนดให้กับผู้ใช้ผู้ดูแลระบบที่กำลังทำสำเนา แต่สิทธิ์ที่ได้รับมาจากโฟลเดอร์แม่ โดยทั่วไปแล้วสิทธิ์เท่านั้นที่มีความสำคัญ
แฮร์รี่จอห์นสตัน

โดยทั่วไปสิ่งที่ฉันต้องการทำคือคัดลอกไฟล์ทั้งหมดจากตำแหน่ง Windows C: \ Users \ ชื่อผู้ใช้เก่าไปยังตำแหน่ง Windows C: \ Users \ ชื่อผู้ใช้ใหม่เพื่อให้ไฟล์เหล่านั้นทั้งหมดเป็นของผู้ใช้ใหม่ (เพิ่งย้ายไปยัง Windows ใหม่ ติดตั้งโดยทั่วไปและต้องการเก็บไฟล์ของผู้ใช้คนก่อนหน้าไว้) เป็นชื่อผู้ใช้เดียวกันทั้งเก่าและใหม่ การคัดลอกไฟล์จากที่หนึ่งไปอีกที่หนึ่งอย่างง่ายจะเป็นผู้ดูแลระบบหรือไม่ ฉันอยากรู้ว่า SID ของไฟล์จะเปลี่ยนเป็น SID ของผู้ใช้ใหม่หรือไม่เพราะฉันใช้ NTFS-3G เพื่อแมป SID ของไฟล์กับผู้ใช้ Linux ของฉัน
trusktr

@trusktr: การเป็นเจ้าของจะไม่มีปัญหาในกรณีนั้น แต่โปรไฟล์ผู้ใช้มีเนื้อหา (ส่วนใหญ่คือกลุ่มรีจีสตรีของผู้ใช้) ที่ไม่สามารถโอนย้ายได้ Robocopy จะใช้ได้ดีตามที่ได้รับอนุญาต แต่ฉันขอแนะนำให้คัดลอกแต่ละโฟลเดอร์ (เช่นเอกสารเดสก์ท็อปและอื่น ๆ ) แทนที่จะเป็นโฟลเดอร์ <username> ทั้งหมด ออกจากโฟลเดอร์ที่ซ่อนอยู่เช่น AppData - ตรวจสอบให้แน่ใจว่าคุณเก็บสำเนาไว้ แต่อย่าคัดลอกไว้ด้านบนของบัญชีใหม่
แฮร์รี่จอห์นสตัน

โดยหลักการแล้วฉันต้องการเก็บโฟลเดอร์ <username> ของฉันไว้ในพาร์ติชันแยกต่างหาก (พาร์ติชัน Windows เก่า) และทำให้โฟลเดอร์ <username> นั้นเป็นโฟลเดอร์หลักสำหรับผู้ใช้ของฉัน <username> ของ Windows ใหม่ของฉัน
trusktr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.