В настоящее время я помогаю коллеге создать сценарий, который отображает все настройки ACL в реестре, поэтому я написал код, который проходит через реестр с несколькими потоками и создает отчет в CSV.
Это довольно просто. В реестре много ключей, поэтому я тщательно протестировал каждый командлет и метод .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