ขณะนี้ฉันกำลังช่วยเพื่อนร่วมงานสร้างสคริปต์ที่แสดงการตั้งค่า 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 กลับมาที่นี่ ใครช่วยอธิบายเรื่องนี้ได้บ้าง?
(gi HKLM:\SOFTWARE\).GetAccessControl()
จะให้ผลลัพธ์บางอย่าง แต่เมื่อคุณทำแบบเดียวกันกับคีย์ทั้งสองที่ฉันพูดถึงในคำถาม มันก็จะล้มเหลว - person Chavez   schedule 21.04.2017$Output.GetEnumerator() | % { $stream.WriteLine("
$($_.Key)";
$($_.Value)"") }
- person Chavez   schedule 24.04.2017