Saya pikir saya cukup bagus di PowerShell, tetapi saya tidak pernah harus bekerja dengan kredensial pengguna. Namun, sekarang saya sedang dalam pencarian kerja dan di salah satu wawancara saya diberi tugas tes untuk menulis naskah yang seharusnya:
- Periksa ketersediaan dan status (diaktifkan / dinonaktifkan) dari akun pengguna.
- Periksa apakah akun tersebut termasuk dalam grup Administrator
- Jika tidak ada akun, maka buat akun dan tambahkan ke grup administrator, centang kotak “Larang perubahan kata sandi pengguna” dan “Kata sandi tidak kedaluwarsa”
- Jika akun itu ada, tetapi dinonaktifkan atau tidak termasuk dalam grup Administrators, maka aktifkan akun dan tambahkan ke grup Administrators, centang kotak di sebelah "Tolak mengubah kata sandi oleh pengguna" dan "Kata sandi tidak kedaluwarsa"
- Skrip tidak boleh tergantung pada bahasa sistem operasi.
Saya pikir tidak ada yang rumit, dan hal pertama yang saya putuskan untuk periksa adalah pengguna Admin di komputer saya. Tanpa berpikir dua kali, saya mengendarai perintah:
Get-User admin
Dan kemudian saya mendapat kesalahan
Get-User : "Get-User" , , .
Sedikit terkejut karena saya tidak mengenali perintah yang begitu berguna dan mendapati bahwa perintah
Get-User hanya berfungsi di konsol Powershell untuk Exchange. Untuk bekerja dengan pengguna lokal, Anda harus menggunakan
Get-Localuser , dan untuk
pengguna domain
Get-Aduser . Menyadari kesalahan saya, saya masuk:
Get-Localuser admin
Dan mendapat jawaban
Name Enabled Description
Nah, sekarang bukan masalah besar untuk memeriksa apakah pengguna ada di sana atau tidak, tapi di sini lagi saya menunggu tangkapan lain. Menggunakan pernyataan kondisi jika tidak ternyata tidak begitu mudah.
Faktanya adalah jika pengguna berada dalam sistem, maka outputnya bukan nilai yang benar, tetapi seluruh rangkaian data, dengan nama, deskripsi pengguna, apakah akun ini diaktifkan atau tidak. Dan jika tidak ada pengguna, maka PowerShell melempar kesalahan. Setelah berkeliaran di Internet, saya menemukan bahwa untuk tujuan ini lebih baik menggunakan operator
try catch .
$user = 'admin' try { Get-LocalUser $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red }
Saya menambahkan variabel $ user untuk membuatnya lebih mudah untuk mengubah nama pengguna di seluruh skrip. Stop ErrorAction diperlukan agar skrip tidak mengganggu pada langkah ini karena kesalahan. Tanda | memisahkan langkah-langkah pipa, dan Out-Null akan menyembunyikan output teks kesalahan. Saya juga menambahkan output teks dengan highlight, untuk kenyamanan memeriksa skrip.
Selanjutnya, saya ingin memeriksa apakah akun diaktifkan atau dinonaktifkan. Seperti yang sudah saya katakan, perintah Get-LocalUser menghasilkan seluruh set data dan untuk verifikasi, saya hanya perlu memilih satu parameter Diaktifkan dengan nilai true atau false. Untuk melakukan ini, saya menggunakan perintah berikut:
(Get-LocalUser $user).enabled
Setelah memastikan itu berfungsi, saya melakukan pemeriksaan berikut dan menambahkan perintah mengaktifkan pengguna.
$user = 'admin' if ((Get-LocalUser $user).enabled -eq "True") { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red Enable-LocalUser $user write-host -foregroundcolor Green }
Untuk mengaktifkan pengguna, tentu saja diperlukan untuk menjalankan konsol di bawah hak administrator.
Dalam paragraf kedua tugas, perlu untuk menentukan apakah pengguna adalah anggota grup administrator. Untuk memeriksa apakah pengguna berada di grup tertentu, ada perintah Get-LocalGroupMember. Namun, nama grup administrator bervariasi dari bahasa sistem operasi. Karena itu, saya harus menggunakan SID standar S-1-5-32-544. Saya juga memeriksa melalui try catch.
$user = 'admin' try { Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green }
Jika pengguna bukan anggota grup, administrator akan ditambahkan ke dalamnya.
Pada tahap selanjutnya, saya memiliki tugas untuk menentukan apakah pengguna memiliki pengaturan perubahan kata sandi dinonaktifkan atau tidak. Kemudian saya menemukan perangkap lain. Faktanya adalah bahwa jika pengguna memiliki kata sandi tak terbatas, parameter PasswordExpires tidak mengembalikan nilai apa pun. Dan jika kotak centang ini dinonaktifkan, maka pengguna yang berbeda akan memiliki tanggal perubahan kata sandi yang berbeda. Saya masih menemukan jalan keluar dari situasi ini:
if ((Get-LocalUser $user).PasswordExpires -eq $null) { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red set-LocalUser $user -PasswordNeverExpires:$true write-host -foregroundcolor Green }
Selanjutnya, saya perlu membuat pengguna. Saya tidak berharap tangkapan akan menunggu saya di sini juga. Saat membuat pengguna dengan perintah
new-LocalUser -User $user -password P@ssW0rD!
Kesalahan dikembalikan:
"Password". "P@ssW0rD!" "System.String" "System.Security.SecureString".
Faktanya adalah parameter -password harus menggunakan SecureString, bukan string teks biasa. Untuk melakukan ini, saya membuat variabel $ password dan mengonversinya menjadi securestring.
$password = convertto-securestring "P@ssW0rD!" -asplaintext -force
Dan skrip itu sendiri untuk membuat pengguna dan menambahkannya ke grup administrator
new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
Skrip yang sudah selesai yang memperhitungkan semua kondisi yang saya dapatkan dengan cara ini:
$user = 'admin' $password = convertto-securestring "P@ssW0rD!" -asplaintext -force try { Get-LocalUser $user -ErrorAction Stop | Out-Null cls write-host $user -foregroundcolor Green if ((Get-LocalUser $user).enabled -eq "True") { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red Enable-LocalUser $user write-host -foregroundcolor Green } if ((Get-LocalUser $user).PasswordExpires -eq $null) { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red set-LocalUser $user -PasswordNeverExpires:$true write-host -foregroundcolor Green } try { Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green } } Catch { cls write-host $user -foregroundcolor Red new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green }
Posting scriptum
Namun, menyimpan kata sandi administrator dalam skrip bukanlah praktik keamanan terbaik. Untuk melakukan ini, Anda dapat menggunakan hash kata sandi, bukan kata sandi itu sendiri.
$user = 'admin1' $hash = "01000000d08c9ddf0115d1118c7a00c04fc297eb0100000048baf1b47a72d845b4eeda8659da9fd70000000002000000000010660000000100002000000004d2a3bf03aac92c2e172dc002d1fe8759da4655850462aface5c25f52921e05000000000e8000000002000020000000bfa652b6f7cc6845e3cee1831b54ab93dc272d0b2203024c3de8bc4789a2698a10000000923fb50dcf01125913534d0c1ba6d827400000002757df7d8a8b39c8e84b81323acff1d72419580a0022cf610926e5f081a2e895320088d482eb407f8157aad82f091abee7427b357e871d12238a8f74131238e7" $hash $password = ConvertTo-SecureString -String $hash $password new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
Untuk mendapatkan hash kata sandi, Anda dapat menggunakan skrip berikut
$Secure = Read-Host -AsSecureString $Secure $hash = ConvertFrom-SecureString -SecureString $Secure $hash
Yang meminta kata sandi dari keyboard.
Dan sedikit bonus untuk menampilkan semua catatan yang dinonaktifkan
Get-LocalUser | Where-Object {$_.enabled -eq $false}
Saya harap waktu yang saya habiskan membantu seseorang dalam pekerjaan mereka. Dan bagi Anda sendiri, akan bermanfaat untuk tidak melupakan pengalaman yang tak ternilai ini.