Instal Layanan Windows dengan tindakan Pemulihan untuk Memulai Ulang

89

Saya menginstal Layanan Windows menggunakan ServiceProcessInstallerdan ServiceInstallerkelas.

Saya telah menggunakan ServiceProcessInstalleruntuk menyetel jenis awal, nama, dll. Tetapi bagaimana cara menyetel tindakan pemulihan ke Mulai ulang?

Saya tahu saya dapat melakukannya secara manual setelah layanan diinstal dengan membuka Konsol manajemen layanan dan mengubah pengaturan di tab pemulihan properti layanan, tetapi adakah cara untuk melakukannya selama penginstalan?

Tab Pemulihan Properti Layanan

sinar
sumber

Jawaban:

99

Anda dapat mengatur opsi pemulihan menggunakan sc . Berikut ini akan mengatur layanan untuk memulai kembali setelah kegagalan:

sc failure [servicename] reset= 0 actions= restart/60000

Ini dapat dengan mudah dipanggil dari C #:

static void SetRecoveryOptions(string serviceName)
{
    int exitCode;
    using (var process = new Process())
    {
        var startInfo = process.StartInfo;
        startInfo.FileName = "sc";
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        // tell Windows that the service should restart if it fails
        startInfo.Arguments = string.Format("failure \"{0}\" reset= 0 actions= restart/60000", serviceName);

        process.Start();
        process.WaitForExit();

        exitCode = process.ExitCode;
    }

    if (exitCode != 0)
        throw new InvalidOperationException();
}
Kevin
sumber
4
Perhatikan bahwa Anda perlu memasukkan nama layanan dalam tanda kutip, jika mengandung spasi.
user626528
20
Jika Anda akan memanggil ini dari pengatur pemasangan layanan [] Installer di C # ketika layanan dipasang, Anda dapat memasukkan panggilan ini ke dalam penanganan kejadian "Berkomitmen" yang akan mengeksekusinya tepat setelah layanan muncul di Manajer Kontrol Layanan. Jangan letakkan di pengelola acara "AfterInstall", karena ini tidak akan berfungsi saat pertama kali layanan diinstal di kotak.
Contango
Analisis Kode @Kevin Visual Studio menyarankan bahwa objek tidak boleh dibuang lebih dari satu kali, process.Close()baris tidak berguna.
JohnTube
1
@ JohnTube - menghapus proses. Baris Close ()
Kevin
24
Perhatikan bahwa sintaksis mungkin terlihat aneh bagi sebagian orang tetapi reset= 0benar, dan reset=0salah. Penggunaan spasi yang benar sangat penting, reset=adalah satu argumen, diikuti oleh spasi, lalu 0.
Liam
12

Setelah banyak upaya, saya menyelesaikannya menggunakan aplikasi baris perintah sc .

Saya memiliki file batch dengan installutil dan sc. File batch saya mirip dengan:

installutil.exe "path to your service.exe"
sc failure "your service name" reset= 300 command= "some exe file to execute" actions= restart/20000/run/1000/reboot/1000

Jika Anda ingin dokumentasi lengkap dari perintah sc, ikuti tautan ini: SC.exe: Berkomunikasi dengan Service Controller dan layanan yang diinstal

Catatan: Anda perlu menambahkan spasi setelah setiap simbol yang sama (=). Contoh: reset = 300

Juan Carlos Velez
sumber