รายการสิทธิ์การเข้าถึงโฟลเดอร์ของผู้ใช้


14

ฉันมีผู้ใช้ในโดเมนที่สามารถเข้าถึงโฟลเดอร์ย่อยหลายโฟลเดอร์ในหลาย ๆ โฟลเดอร์ สิทธิของเขาถูกนิยามไว้อย่างละเอียด ตอนนี้เขากำลังลาออกจาก บริษัท แต่จะยังคงทำงานเพื่อ บริษัท ในฐานะทรัพยากรที่มีสัญญา

ฉันต้องการค้นหาโฟลเดอร์ทั้งหมดที่เขาสามารถเข้าถึงและเพิกถอนสิทธิ์ของเขาจากนั้นตั้งค่าเขาด้วยสิทธิ์การเข้าถึงชุดอื่น

มีเครื่องมือใด ๆ (ฟรีแวร์ควรเป็นอย่างยิ่ง) ที่แสดงรายการสิทธิ์ NTFS ทั้งหมดสำหรับผู้ใช้ที่ให้หรือไม่ ฉันได้ลองใช้ AccessEnum จาก Sysinternals แต่ไม่สามารถกรองรายการด้วยชื่อผู้ใช้และไม่มีประโยชน์สำหรับฉัน ฉันดูที่ CACLS ด้วย แต่เท่าที่ฉันสามารถบอกได้ว่ามันแสดงการอนุญาตที่เรียงลำดับตามไฟล์ไม่ใช่โดยผู้ใช้

ความคิดใด ๆ


1
นี่คือเหตุผลที่คุณควรให้สิทธิ์การเป็นสมาชิกตามกลุ่มเสมอแม้ว่าจะมีผู้ใช้เพียงคนเดียวในกลุ่ม คุณอาจลบเขาออกจากกลุ่ม ในระหว่างที่คุณรอคำตอบคุณสามารถปิดการใช้งานบัญชีของเขาใน AD
MDMarra

คุณลองใช้เครื่องมือนี้: AccessChk v5.0 หรือไม่ ในฐานะส่วนหนึ่งของการสร้างความมั่นใจว่าพวกเขาได้สร้างสภาพแวดล้อมที่ปลอดภัยผู้ดูแลระบบ Windows มักจำเป็นต้องรู้ว่าผู้ใช้หรือกลุ่มเฉพาะที่มีการเข้าถึงทรัพยากร ได้แก่ ไฟล์ไดเรกทอรีคีย์รีจิสตรีคีย์ออบเจ็กต์ทั่วโลกและบริการ Windows AccessChk ตอบคำถามเหล่านี้อย่างรวดเร็วด้วยอินเทอร์เฟซและเอาท์พุทที่ใช้งานง่าย พบได้ที่นี่: technet.microsoft.com/en-us/sysinternals/bb664922.aspx
Luke99

@MarkM: จริง ... แค่นั้นเมื่อผู้ใช้ต้องการเข้าถึงโฟลเดอร์เดียวคุณเพิ่มเขา จากนั้นในเวลาไม่กี่เดือนเขาต้องการการเข้าถึงอื่นบนส่วนแบ่งที่ต่างกัน และในไม่กี่เดือนอีกครั้งใน 2 หรือ 3 โฟลเดอร์ คุณจะสร้างกลุ่มที่มีชื่อที่มีความหมายสำหรับผู้ใช้ดังกล่าวได้อย่างไร? "Username_granular_access_group"? นี่อาจเป็นการหลอกลวง @ Luke99: เครื่องมือที่น่าสนใจจาก Sysinternals ฉันจะคิดถึงมันได้อย่างไร อย่างไรก็ตามฉันเห็นว่ามันแสดงโฟลเดอร์ทั้งหมดที่ผู้ใช้มีการเข้าถึงโดยตรงหรือโดยอ้อม มีวิธีการแสดงเฉพาะโฟลเดอร์ที่ผู้ใช้อยู่ในรายการอย่างชัดเจนใน ACL (ไม่รวม acces ผ่านกลุ่ม)?
imagodei

คำตอบ:


13

สิ่งนี้ดูเหมือนจะทำเคล็ดลับ (อาจจะเป็นข้อแม้) เพื่อค้นหาโฟลเดอร์ทั้งหมดที่ผู้ใช้ "someuser" มีการเข้าถึงในตัวอย่างนี้ในไดรฟ์ C โดยใช้คำสั่ง icacls Windows ในตัว:

icacls c:\*. /findsid someuser /t /c /l

จำเป็นต้องใช้ / t เพื่อบอกให้รีไดเร็กตอรีไดเรกทอรี จำเป็นต้องใช้ / c เพื่อบอกให้ดำเนินต่อไปแม้ว่าจะพบข้อผิดพลาด / l ทำให้การทำงานกับลิงก์สัญลักษณ์ (ถ้ามี) (อันสุดท้ายคือ L และแฟล็กเหล่านี้สามารถเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก)

*.จะได้รับการยอมรับจาก DOS เก่านับเป็นวิธีการที่จะบอกว่า "ดูไดเรกทอรีไม่ไฟล์" แน่นอนถ้าคุณต้องการค้นหาไฟล์และไม่ใช่โฟลเดอร์เปลี่ยนเป็น*.*และแน่นอนคุณสามารถชี้ไปที่ไดรฟ์ใด ๆ หรือเรียกใช้จากโฟลเดอร์ใด ๆ และออกจากเส้นทางไดรฟ์ / โฟลเดอร์และปล่อยให้มันค้นหาเทียบกับที่ โฟลเดอร์เท่านั้น

ฉันค้นหาคำตอบเดียวกับ OP และพบรายการนี้ แต่รู้สึกผิดที่เห็นเฉพาะข้อเสนอจากเครื่องมือที่ดาวน์โหลดได้ เช่นเดียวกับคนอื่น ๆ ฉันชอบที่จะใช้บางสิ่งในตัวและฉันพบมันในเครื่องมือ icacls นี้

และฉันได้ยืนยันว่ามันใช้งานได้บน Windows Server 2012, 2008 และ Windows 7 ดังนั้นฉันสงสัยว่ามันจะทำงานได้ดีใน Server 2003, Windows 8 และอื่น ๆ

รายการผลลัพธ์จะเป็นโฟลเดอร์ที่ระบุบรรทัดต่อจากบรรทัดเช่น:

SID พบ: c: \ somedir \ somesubdir

โปรดทราบว่าหากคุณเรียกใช้สิ่งนี้ในฐานะผู้ใช้ที่ไม่มีสิทธิ์ในการเข้าถึงบางไดเรกทอรีคุณจะได้รับข้อผิดพลาดในผลลัพธ์เช่น:

c: \ System Volume Information: การเข้าถึงถูกปฏิเสธ

และหากคุณกำลังค้นหาไดรฟ์ทั้งหมดนั่นอาจส่งผลให้เกิดข้อผิดพลาดหลายร้อยอย่างทำให้ยากต่อการค้นหาผลลัพธ์

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

ตอนนี้หากคุณสนใจที่จะซ่อนข้อผิดพลาดเหล่านั้นคุณจะไม่สามารถใช้คำสั่ง find เพื่อไพพ์ผลลัพธ์ที่ทำสำเร็จเท่านั้น (ข้อผิดพลาดที่อ้างถึง "พบ SID") เนื่องจากข้อผิดพลาดจะไม่ถูกกรองออก โดยไพพ์ไปยังคำสั่ง find แต่ถ้าคุณต้องการที่จะลบข้อผิดพลาดทั้งหมดที่คุณจำเป็นต้องใช้เคล็ดลับที่ค่อนข้างคลุมเครือของการเปลี่ยนเส้นทางกระแสข้อผิดพลาด (stderr) กับ "ถังบิต" 2>nul:โดยใช้ ดังนั้นตัวอย่างข้างต้นจะกลายเป็น:

icacls c:\*. /findsid someuser /t /c /l 2>nul:

เพียงแค่ระวังว่าบางโฟลเดอร์ที่สร้างข้อผิดพลาดซึ่งตอนนี้ข้อผิดพลาดถูกซ่อนอยู่อาจเป็นโฟลเดอร์ที่ชื่อ "someuser" มีการเข้าถึง แต่ที่คุณทำไม่ได้ ดังนั้นคุณอาจต้องคิดสองครั้งเกี่ยวกับการละเว้นข้อผิดพลาดเหล่านี้ แต่ถ้าคุณต้องการนั่นคือวิธีที่คุณสามารถทำได้

ความเป็นไปได้นั้นอาจ จำกัด ค่าของคำตอบนี้ หากใครที่มีความคุ้นเคยกับสิ่งต่าง ๆ ต้องการที่จะขยายหรือแก้ไขคำตอบของฉันฉันยินดีต้อนรับ


ดูเหมือนว่ามันควรจะชัดเจน แต่หมีชี้: ค้นหา * ไม่เท่ากับไดเรกทอรีการค้นหาเท่านั้นหรือไดเรกทอรีทั้งหมด ชื่อไดเรกทอรีสามารถมีส่วนขยายและไฟล์ไม่จำเป็นต้องมีส่วนขยาย หากคุณต้องการที่จะละเอียดปล่อยให้มันค้นหาทุกอย่าง
Scott E

6

คุณสามารถใช้ PowerShell ได้โดยไม่จำเป็นต้องดาวน์โหลดอะไรเลย สิ่งนี้จะทำงานกับ v2.0 และใหม่กว่า:

$ReferenceAccountName = 'DOMAIN\Username'
[string[]]$SearchDirectories = @('X:\SomeDirectory', 'F:\AnotherDirectory')

foreach ($RootDir in $SearchDirectories) {
    $DirACL = Get-Acl -Path $RootDir
    foreach ($ACL in $DirACL.Access){
        if ($ACL.IdentityReference -like $ReferenceAccountName){
            Write-Output $RootDir
        }
    }
    foreach ($Directory in (Get-ChildItem -Path $RootDir -Recurse | `
                            Where-Object -FilterScript {$_.Attributes `
                            -contains 'Directory'})){
        $DirACL = Get-Acl -Path $Directory.FullName
        foreach ($ACL in $DirACL.Access){
            if ($ACL.IdentityReference -like $ReferenceAccountName){
                Write-Output $Directory.FullName
            }
        }
    }
}

ไม่สะอาดเท่าที่มีอยู่ใน PowerShell v3 และเปิด แต่จะใช้งานได้ นี่จะแสดงรายการไดเรกทอรีที่พบในรูปแบบสตริง

คุณสามารถส่งออกมันเป็นวัตถุและทำงานกับมันต่อไป (ส่งออกไปยังไฟล์ CSV ลบรายการตามที่คุณพบอัปเดตตั๋วด้วยข้อมูล ... ฯลฯ ) โดยจัดการกับวัตถุอินพุตของ Write- โทรออก


เป็นไปได้ไหมที่จะ "ยกเว้น" การอนุญาตที่สืบทอดมา? (เช่นค้นหาทุกโฟลเดอร์ที่มีการเพิ่ม "DOMAIN \ Username" อย่างชัดเจนหรือไม่
dognose

1
ใช่คุณสามารถ:if ($ACL.IdentityReference -like $ReferenceAccountName -and !$ACL.IsInherited){
dognose

3

ฉันพบวิธีแก้ปัญหาสำหรับคำถามของฉันเอง ฉันเชื่อว่าเรียบง่ายและสะอาดมาก คุณต้องติดตั้ง subinacl และเรียกใช้หนึ่งบรรทัดจากพรอมต์คำสั่ง

คุณสามารถดาวน์โหลด subinacl ที่นี่ แม้ว่าจะได้รับการสนับสนุนอย่างเป็นทางการเฉพาะใน Windows 2000, Windows XP และ Windows Server 2003 แต่ควรใช้กับ Windows Vista, Windows Server 2008 และ Windows 7 ด้วย

ถัดไปคุณเรียกใช้สิ่งต่อไปนี้จากพรอมต์คำสั่ง:

subinacl /testmode /noverbose /outputlog=c:\TEXTFILENAME.TXT /subdirectories=directoriesonly X:\*.* /findsid=DOMAIN\username

โดยที่X:เป็นไดรฟ์ที่คุณสแกนและชื่อผู้ใช้เป็นผู้ใช้ที่คุณต้องการแสดงรายการสิทธิ์ การสแกนอาจใช้เวลาสักครู่และคุณจะได้ผลลัพธ์ใน TEXTFILENAME.TXT

ถ้าคุณใช้สวิตช์/ noverboseคุณจะได้รับรายการการอนุญาตการเข้าถึงแบบกระชับ - โดยทั่วไปคุณจะเห็นว่าไดเรกทอรีใดที่ผู้ใช้มีสิทธิ์เข้าถึง (ด้วยรูปแบบการเข้าถึงและสิ่งอื่น ๆ ที่อาจมีประโยชน์)

ผมใช้ OpenOffice Calcจะนำเข้ารายการและจากนั้นใช้ตัวกรองที่กำหนดเองและกรองเฉพาะเส้นที่เริ่มต้นด้วยFILE + บรรทัดเหล่านี้มีไดเรกทอรีที่ผู้ใช้สามารถเข้าถึงได้ นี่คือวิธีการใช้เครื่องมือง่ายๆที่คุณจะได้รับเฉพาะข้อมูลที่เกี่ยวข้องเท่านั้น

เนื่องจากการสืบทอดมักเปิดใช้งานในไดเรกทอรีหลักจำนวนไดเรกทอรีจริงที่คุณอาจต้องเยี่ยมชมเพื่อปรับเปลี่ยนสิทธิ์จึงมักจะต่ำกว่ารายการอย่างมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.