ACL реестра с использованием выходного потока .NET GetAccessControl()

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


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
Каждый поток получает (или ожидает) мьютекс и записывает вывод в файл 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