Memahami System.DirectoryServices.ResultPropertyCollection dalam PowerShell

Saat bekerja dengan PowerShell dan melakukan kueri Active Directory, Anda mungkin menemui perilaku yang membingungkan saat mencoba mengakses properti dari System.DirectoryServices.ResultPropertyCollection. Dalam pos ini, kita akan mengungkap masalah umum yang dihadapi ketika mengambil informasi melalui DirectorySearcher—khususnya, mengapa dua keluaran yang berbeda menghasilkan hasil yang tidak terduga. Mari kita telusuri masalah tersebut, akar permasalahannya, dan bagaimana Anda dapat mengatasinya secara efektif.

Masalah

Anda telah mengatur skrip PowerShell yang menggunakan kelas DirectorySearcher untuk menemukan objek komputer di Active Directory, tetapi Anda mengalami ketidaksesuaian dalam keluaran Anda. Berikut adalah replikasi yang disederhanakan dari kode Anda:

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher  
$objSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry  
$objSearcher.Filter = ("(objectclass=computer)")  
$computers = $objSearcher.findall()  

Ketika Anda mencoba mencetak nama-nama komputer, Anda mengamati dua keluaran berikut:

$computers | %{
    "Nama server dalam kutipan $_.properties.name" 
    "Nama server tidak dalam kutipan " + $_.properties.name 
}

Dan kemudian:

$computers[0] | %{"$_.properties.name"; $_.properties.name}

Hasilnya menunjukkan nama tipe untuk properti saat disertakan dalam kutipan (System.DirectoryServices.SearchResult.properties.name) tetapi nilai saat tidak. Memahami nuansa ini adalah kunci untuk menguasai pengambilan properti dalam PowerShell.

Mengapa Keluaran Berbeda?

Perbedaan ini muncul dari bagaimana PowerShell mengevaluasi variabel dan properti dalam string. Ketika Anda menyertakan $_ dalam sebuah string, PowerShell melihatnya sebagai objek keseluruhan:

  • Konteks Kutipan: Saat menggunakan ";" dalam string, seperti dalam "Nama server dalam kutipan $_.properties.name", PowerShell tidak mengevaluasi properti tetapi merujuk pada metode ToString dari objek, yang dalam hal ini, secara default menjadi nama tipe dari properti tersebut.

  • Konteks Tanpa Kutipan: Sebaliknya, ketika Anda menggunakannya tanpa kutipan, seperti dalam "Nama server tidak dalam kutipan " + $_.properties.name, PowerShell mengevaluasi properti terlebih dahulu dan kemudian menggabungkannya ke dalam string. Dengan demikian, ia mengambil nilai aktual yang disimpan dalam properti tersebut daripada nama tipe.

Memperbaiki Keluaran

Untuk mengambil nilai properti yang dimaksud saat berada dalam string yang terkutip, Anda bisa secara eksplisit memanggil evaluasi menggunakan sintaks subekspresi:

"Nama server dalam kutipan $($_.properties.name)"  

Penggunaan $() ini memberi tahu PowerShell untuk mengevaluasi apa yang ada di dalamnya sebelum melanjutkan dengan sisa string, menghasilkan keluaran yang tepat seperti yang Anda harapkan.

Menjelajahi Koleksi Properti Hasil

Ingat, saat bekerja dengan ResultPropertyCollection, Anda sedang berurusan dengan koleksi properti. Anda selalu dapat menjelajahi model objek langsung dari command line PowerShell. Misalnya, mengalirkan $computers[0].properties ke Get-Member mengungkapkan informasi tentang anggota dan properti yang tersedia:

$computers[0].properties | Get-Member

Anda dapat melihat properti Values, yang mengambil ICollection dari nilai-nilai properti tersebut. Penjelajahan ini meningkatkan pemahaman Anda dan memungkinkan Anda menavigasi melalui properti dengan lebih efektif.

Kesimpulan

Saat bekerja dengan PowerShell dan System.DirectoryServices Active Directory, penting untuk memahami bagaimana evaluasi string beraksi pada objek dan properti mereka. Dengan mengenali konteks berbeda di mana properti ini diakses, Anda dapat menghindari kebingungan dan mengambil informasi yang Anda butuhkan dalam format yang Anda harapkan.

Menavigasi konstruksi PowerShell yang kompleks seperti ResultPropertyCollection mungkin terlihat menakutkan pada awalnya, tetapi dengan latihan dan pemahaman yang lebih mendalam, Anda akan menemukan bahwa ini menjadi naluri kedua dalam perjalanan skrip Anda.