Menjalankan Skrip PowerShell sebagai Layanan Windows

Dari skrip PowerShell, Anda dapat membuat layanan Windows yang berjalan di latar belakang dan mulai secara otomatis ketika server melakukan booting. Anda dapat membuat layanan Windows menggunakan utilitas srvany.exe dan instsrv.exe (termasuk dalam Windows Server Resource 2003 Kit), memungkinkan Anda untuk memulai proses powershell.exe dengan parameter dalam bentuk path ke file skrip ps1. Kelemahan utama dari metode membuat layanan ini adalah srvany.exe tidak mengontrol eksekusi aplikasi (skrip PowerShell dalam kasus kami) dan, jika aplikasi macet (macet), layanan tidak melihat ini dan terus bekerja. Pada artikel ini, kita akan menggunakan utilitas untuk membuat layanan Windows dari file dengan skrip PowerShell Nssm (Non-Sucking Service Manager - pergi tanpa terjemahan ... :)), yang tanpa kekurangan ini.

Anda dapat mengunduh dan menginstal NSSM secara manual atau melalui Chocolately. Pertama, Anda perlu menginstal Choco sendiri:

Set-ExecutionPolicy Bypass -Scope Process -Force; ''
iex ((New-Object System.Net.WebClient) .DownloadString ('https://chocolatey.org/install.ps1'))

Kemudian instal paket NSSM:

choco instal nssm

Dalam contoh ini, kami akan memantau perubahan dalam grup AD tertentu secara waktu nyata (skrip dari artikel ini) dan memberi tahu administrator keamanan dengan pemberitahuan sembulan dan surat ketika mengubah.

Jadi, kami memiliki kode yang perlu disimpan dalam file PS1. Tambahkan loop tak terbatas yang melakukan pemeriksaan satu menit sekali:

while ($ true)
# Kode PS Anda
Mulai-Tidur-Detik 60

Tentu saja, untuk mengimplementasikan skenario seperti itu, Anda dapat membuat tugas di penjadwal (Penjadwal Tugas), tetapi jika Anda perlu merespons setiap perubahan secara real time, metode dengan layanan terpisah jauh lebih benar..

Anda dapat membuat layanan dari skrip PowerShell menggunakan NSSM langsung dari PowerShell :):

$ NSSMPath = (Dapatkan-Perintah "C: \ tools \ nssm \ win64 \ nssm.exe"). Sumber
$ NewServiceName = “CheckADGroupSrv”
$ PoShPath = (Get-Command powershell) .Sumber
$ PoShScriptPath = “C: \ tools \ CheckADGroup \ checkad.ps1”
$ args = '-ExecutionPolicy Bypass -NoProfile -File "0"' -f $ PoShScriptPath
& $ NSSMPath instal $ NewServiceName $ PoShPath $ args
& $ NSSMPath status $ NewServiceName

Jalankan layanan baru:

Mulai-Layanan $ NewServiceName

Periksa status layanan menggunakan PowerShell:

Dapatkan-Layanan $ NewServiceName

Jadi, Anda telah membuat dan meluncurkan layanan Windows baru. Verifikasi bahwa itu muncul di konsol manajemen layanan services.msc

Layanan CheckADGroupSrv benar-benar muncul, dikonfigurasi untuk memulai secara otomatis dan saat ini sedang berjalan (Berjalan). Seperti yang Anda lihat, skrip PowerShell Anda berjalan di dalam proses nssm.exe.

Harap dicatat bahwa layanan ini berjalan di bawah akun Sistem. Jika Anda menggunakan modul lain dalam skrip PS Anda (dalam kasus saya, cmdlet Get-ADGroupMember dari modul Active Directory untuk Windows PowerShell digunakan untuk mendapatkan komposisi grup keamanan domain), akun ini harus memiliki akses ke file modul dan hak untuk terhubung ke AD (di saya kasing). Anda juga dapat memulai layanan ini di bawah akun yang berbeda (atau akun gMSA) dan memberikan hak kepada pengguna untuk menghentikan / memulai kembali layanan jika mereka tidak memiliki hak administrator lokal.

Agar layanan dapat menampilkan notifikasi dalam sesi pengguna (berinteraksi dengan desktop), Anda harus pada "Login"(Logon) aktifkan"Izinkan interaksi desktop"(Izinkan layanan berinteraksi dengan desktop).

Agar ini berfungsi di Windows 10 / Windows Server 2012 R2 / 2016, Anda perlu mengubah nilai DWORD dari parameter registri NoInteractiveServices di cabang HKLM \ System \ CurrentControlSet \ Control \ Windows aktif 0 dan mengaktifkan layanan browser layanan interaktif (Layanan Deteksi Layanan Interaktif):

Start-Service -Name ui0detect

Namun, di Windows 10 1803, Layanan Deteksi Layanan Interaktif sepenuhnya dihapus dari sistem, dan Anda tidak dapat lagi beralih ke sesi nol (Sesi 0), sehingga Anda tidak akan melihat jendela yang ditampilkan di bawah akun Sistem.

Anda dapat mengubah deskripsi layanan dengan perintah:

& $ NSSMPath menetapkan $ NewServiceName description “Memonitor perubahan grup AD”

Untuk menghapus layanan yang dibuat, Anda dapat menggunakan perintah sc delete atau

nssm hapus CheckADGroupSrv