Mulai ulang layanan terjadwal dengan powerhshell sebagai akun layanan non-admin

11

Sebelum saya jatuh, saya tahu cara menjadwalkan tugas, memulai kembali layanan dengan PowerShell atau memberikan akun non-admin hak istimewa untuk memulai kembali layanan. Bukan itu masalahnya. Namun masalahnya adalah kombinasi dari ketiga tugas ini digabungkan.

Saya memiliki layanan windows yang perlu memproses file pada folder jaringan. Karena itu logon dengan "akun layanan" yang sebenarnya hanya akun domain biasa. Akun domain ini bukan administrator tetapi memiliki hak akses ke folder tersebut. Layanan berjalan dengan baik dan melakukan pekerjaannya.

Namun, kadang-kadang ada kesalahan dalam salah satu file yang mencegah file lain dari diproses. Biasanya butuh beberapa saat bagi seseorang untuk memperhatikan dan ada beberapa simpanan.

Jadi, saya membuat skrip pemantauan di PowerShell yang polling folder jaringan untuk file-file yang salah. Jika ditemukan, file dipindahkan ke folder sementara untuk ditinjau dan layanan perlu dimulai ulang.

Saya memberikan hak istimewa akun layanan melalui kebijakan grup untuk memulai dan menghentikan layanan.

masukkan deskripsi gambar di sini

Ketika saya masuk ke server dengan akun layanan, saya dapat memulai kembali layanan secara manual menggunakan Layanan MMC. Saya juga dapat menjalankan skrip PowerShell dan melakukan apa yang seharusnya dilakukan: polling folder, pindahkan file dan restart layanan. Bagus!

Pada fase berikutnya, saya membuat tugas terjadwal yang berjalan setiap 10 menit. Tugas menggunakan akun layanan yang sama dengan layanan untuk menjalankan skrip PowerShell. Kotak "eksekusi dengan hak istimewa tertinggi" dicentang. Seperti yang saya katakan, skrip powershell membutuhkan akses ke drive jaringan, jadi saya tidak dapat menjalankannya sebagai admin server lokal dan saya tidak ingin menggunakan kredensial admin domain untuk tugas kasar seperti ini. (Saya mencoba menerapkan prinsip privilege paling tidak sebanyak yang saya bisa.)

Saya memberi hak layanan "masuk sebagai pekerjaan batch" pada server akun menggunakan MMC Kebijakan Keamanan Lokal.

Sekarang untuk bagian yang saya tidak tahu: Pada waktu yang dijadwalkan tugas yang dijadwalkan selesai dengan sukses dan skrip PowerShell sedang dieksekusi. Script mengumpulkan folder dan file kesalahan dipindahkan. Satu-satunya hal yang tidak berhasil adalah me-restart layanan ...?! Sekali lagi, menjalankan skrip secara manual karena pengguna yang sama bekerja dengan sempurna.

Saya tidak melihat banyak di penampil acara, tetapi pencatatan pada skrip saya menyatakan kesalahan ini:

TerminatingError (Stop-Service): "Tidak dapat membuka Service Control Manager di komputer '.'. Operasi ini mungkin memerlukan hak istimewa lainnya."

Perintah yang saya gunakan untuk me-restart layanan adalah:

Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])

(Saya menggunakan windows server 2012 R2 dan PowerShell versi 4 pada 2008 R2 Domain.)

Pembaruan: Saya sama-sama mencoba mengatur izin layanan untuk pengguna menggunakan subinacl (seperti yang dijelaskan di sini ) dan mengatur string SDDL secara manual (seperti dijelaskan di sini ), sehingga bendera kontrol saya terlihat seperti ini (A ;; CCLCSWRPWPDTLOCRRC ;;; S-1- X-XX-XXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX). Saya juga mencoba mengatur hak istimewa pada layanan untuk Kontrol Penuh di GPO. Tak satu pun dari ini menyelesaikan masalah. Itu harus saya masalah dengan hak istimewa di suatu tempat yang masih saya abaikan, karena ketika saya menjadwalkan tugas dengan akun domain yang merupakan admin lokal di server, itu berfungsi dengan baik.

VolrathTheFallen
sumber
Ini mungkin dari beberapa bantuan serverfault.com/questions/357424/... tampaknya PowerShell sangat pilih-pilih tentang izin dan bukan yang jelas
Drifter104
@ Drifter104: Walaupun saya menggunakan GPO untuk mengatur izin pada layanan, bukan subinacl, saya tetap mencobanya dengan parameter STOE, tetapi masih melihat hasil yang sama. Periksa pengaturan GPO saya dan mereka memiliki opsi Enumerate Dependent Services diaktifkan.
VolrathTheFallen
@ MyronSemack-msemack Saya mencoba mengatur string SDDL untuk layanan secara manual seperti yang dijelaskan dalam artikel, tapi tetap tidak beruntung saya pikir pada akhirnya GPO dan subinacl melakukan hal yang sama, karena mereka tampaknya menimpa satu dan yang lainnya.
VolrathTheFallen
1
Bagaimana kalau mencoba Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....bukan Stop-ServiceCmdLet? Stop-Service dan Start-Service tampaknya tidak dapat melakukan remote berdasarkan jawaban ini: Tidak dapat menggunakan Get-Service –ComputerName di komputer jarak jauh dan pesan kesalahan Anda mungkin terkait dengan mencoba menyambung ke localhost "remote". ' (<== itu titik di sana.)
John aka hot2use

Jawaban:

3

Jawaban atas pertanyaan lain juga menyelesaikan masalah saya.

Langkah-langkah yang saya lakukan adalah:

  1. enable-psremoting pada server di admin PowerShell prompt
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI pada server di admin PowerShell prompt
  3. Menambahkan akun layanan (atau grup keamanan) dengan hak istimewa penuh
  4. sc sdshow scmanager di server di command prompt admin
  5. Salin output SDDL
  6. Tambahkan (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)ke SDDL sebelum bagian S :.
  7. sc sdset scmanager THE_MODIFIED_SDDL punyaku terlihat seperti ini: sc sdset scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;KA;;;S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
  8. Ubah skrip powershell saya agar menggunakan Start-ServiceCmdLet sebagai ganti Set-Service(Set-Service tidak berfungsi).

Sepertinya sesuatu yang sederhana ternyata jalan, WAY lebih rumit daripada yang seharusnya ...

VolrathTheFallen
sumber