Registry ACL โดยใช้ .NET GetAccessControl() เอาต์พุตฟลัด

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

นี่ค่อนข้างตรงไปตรงมา มีคีย์จำนวนมากในรีจิสทรี ดังนั้นฉันจึงได้ทดสอบวิธี cmdlet และ .NET ทุกวิธีอย่างกว้างขวางสำหรับเวลาในการดำเนินการ และจากผลลัพธ์เหล่านั้น ฉันก็หันมาใช้ .NET เป็นส่วนใหญ่เพื่อให้มีประสิทธิภาพมากที่สุดเท่าที่จะเป็นไปได้ ในบริบทของคำถามเฉพาะนี้: ฉันดำเนินการ Get-Item กับทุกคีย์ที่จัดทำดัชนีและเรียก .GetAccessControl() กับคีย์เหล่านั้น

วิธีนี้ใช้งานได้ดี แต่คีย์สองคีย์ที่เฉพาะเจาะจงทำให้ฉันปวดหัว:

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\ HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell

ทำไมคุณอาจถาม? ดูนี่สิ:

PS C:\Users\StackOverflow> (gi HKLM:\SOFTWARE\Classes\*\).GetAccessControl().Count
4124
PS C:\Users\StackOverflow> (gi HKLM:\SOFTWARE\Classes\*\shell).GetAccessControl().Count
175

นั่นเป็นรายการมากมายสำหรับ ACL!

ฉันใช้ StreamWriter เพื่อเขียน CSV ของตัวเอง ซึ่งก็ใช้ได้ดีเช่นกันจนกว่าจะถึงสองคีย์นี้ เมื่อเปิดไฟล์ในโปรแกรมแก้ไขข้อความ เนื้อหาเป็นไปตามที่คาดไว้ แต่ Microsoft Excel หยุดทำงานโดยสิ้นเชิงขณะพยายามอ่านข้อความนี้

ฉันไม่รู้ว่าทำไมสิ่งนี้จึงเกิดขึ้น เมื่อฉันเปิดคีย์เหล่านี้ใน regedit ดูเหมือนจะไม่มีคำจำกัดความการเข้าถึงมากนักเนื่องจาก PowerShell กลับมาที่นี่ ใครช่วยอธิบายเรื่องนี้ได้บ้าง?


person Chavez    schedule 20.04.2017    source แหล่งที่มา
comment
โพสต์โค้ดเกี่ยวกับวิธีการดึงข้อมูล แยกวิเคราะห์ และผนวกเข้ากับ csv ด้วย   -  person Ranadip Dutta    schedule 20.04.2017
comment
ฉันไม่สามารถโพสต์แหล่งที่มาทั้งหมดได้ นโยบายบริษัท ส่วนที่เกี่ยวข้องอยู่ที่นี่ คุณสามารถสร้างพฤติกรรมที่เป็นปัญหาขึ้นมาใหม่ได้ด้วยโค้ดในคำถามของฉัน ตัวอย่างเช่น (gi HKLM:\SOFTWARE\).GetAccessControl() จะให้ผลลัพธ์บางอย่าง แต่เมื่อคุณทำแบบเดียวกันกับคีย์ทั้งสองที่ฉันพูดถึงในคำถาม มันก็จะล้มเหลว   -  person Chavez    schedule 21.04.2017
comment
ส่วนนี้ชัดเจน แสดงวิธีการต่อท้ายข้อมูลในไฟล์ csv คุณกำลังพิจารณาส่วนหัวอะไรเป็นหลัก อย่างน้อยตัวอย่างก็ควรจะใช้ได้   -  person Ranadip Dutta    schedule 21.04.2017
comment
แต่ละเธรดจะได้รับ (หรือรอ) mutex และเขียนเอาต์พุตไปยังไฟล์ csv ผ่าน StreamWriter: $Output.GetEnumerator() | % { $stream.WriteLine("$($_.Key)";$($_.Value)"") }   -  person Chavez    schedule 24.04.2017


คำตอบ (1)


คำตอบนั้นตรงไปตรงมาเหมือนกับคำถามอย่างเห็นได้ชัด การใช้ -LiteralPath สำหรับ Get-Item จะช่วยแก้ปัญหานี้ได้เนื่องจากเส้นทางมีอักขระตัวแทน

person Chavez    schedule 24.04.2017
comment
ใช่. นี่จะเป็นสถานะตามการออกแบบ ดีใจที่คุณจัดการได้แล้ว - person Matt; 27.04.2017