Registri ACL menggunakan banjir keluaran .NET GetAccessControl()

Saat ini saya sedang membantu rekan kerja membuat skrip yang menggambarkan semua pengaturan ACL di registri, jadi saya membuat beberapa kode yang mengulang registri dengan beberapa utas dan membuat laporan dalam CSV.

Ini cukup mudah. Ada banyak kunci dalam registri jadi saya telah menguji secara ekstensif setiap cmdlet dan metode .NET untuk waktu eksekusi dan, berdasarkan hasil tersebut, sebagian besar menggunakan .NET untuk membuatnya seefisien mungkin. Dalam konteks pertanyaan khusus ini: Saya melakukan Get-Item pada setiap kunci yang diindeks dan memanggil .GetAccessControl() pada kunci tersebut.

Ini berfungsi dengan baik, tetapi ada dua kunci khusus yang membuat saya pusing:

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

Mengapa, Anda mungkin bertanya? Nah, lihat ini:

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

Itu banyak sekali item untuk ACL!

Saya menggunakan StreamWriter untuk menulis CSV saya sendiri, ini juga berfungsi dengan baik hingga mencapai kedua kunci ini. Ketika file dibuka di editor teks, isinya seperti yang diperkirakan, tetapi Microsoft Excel benar-benar rusak saat mencoba membaca ini.

Saya tidak tahu mengapa ini terjadi, ketika saya membuka kunci ini di regedit sepertinya tidak ada definisi akses sebanyak PowerShell yang kembali ke sini. Adakah yang bisa menjelaskan hal ini?


person Chavez    schedule 20.04.2017    source sumber
comment
posting juga kodenya tentang cara Anda mengambil, menguraikan, dan menambahkannya ke csv   -  person Ranadip Dutta    schedule 20.04.2017
comment
Saya tidak dapat memposting seluruh sumber, kebijakan perusahaan. Bagian yang relevan ada di sini. Anda dapat mereproduksi perilaku tersebut dengan kode di pertanyaan saya. Misalnya, (gi HKLM:\SOFTWARE\).GetAccessControl() akan menghasilkan beberapa hasil. Tetapi ketika Anda melakukan hal yang sama pada dua kunci yang saya sebutkan dalam pertanyaan saya, hasilnya buruk.   -  person Chavez    schedule 21.04.2017
comment
bagian ini jelas. Tunjukkan bagaimana Anda menambahkan data dalam file csv. Judul apa yang paling Anda pertimbangkan. Setidaknya sampel harus berfungsi.   -  person Ranadip Dutta    schedule 21.04.2017
comment
Setiap thread memperoleh (atau menunggu) mutex dan menulis output ke file csv melalui StreamWriter: $Output.GetEnumerator() | % { $stream.WriteLine("$($_.Key)";$($_.Value)"") }   -  person Chavez    schedule 24.04.2017


Jawaban (1)


Jawabannya sesederhana pertanyaannya. Menggunakan -LiteralPath untuk Get-Item akan menyelesaikan masalah ini karena jalur berisi karakter wildcard.

person Chavez    schedule 24.04.2017
comment
Ya. Ini akan menjadi status berdasarkan desain. Senang anda menyelesaikannya. - person Matt; 27.04.2017