Makale Özeti

Bir önceki makalede windows servislerinde olayları yönetmeyi ve windows servis uygulamamızdan olay günlüğüne kayıt eklemeyi ele almıştık, bu makalede ise geliştirdiğimiz servisi bilgisayara yüklemek için kurulum oluşturmayı, güvenlik ile ilgili tanımlamaları yapmayı ve windows servislerinin bilgisayara kurulumunu ve kaldırılmasını ele alıyor olacağız.

Makale

Installer Yapısı

.NET Framework, Windows servis uygulamalarımızı ve özel kayıtlar ve performans sayaçları gibi servis uygulamalarımız tarafından kullanılan kaynakları bilgisayara yüklememize olanak tanıyan installer yapısını sunmaktadır. Installation bileşenleri bu kaynakları, servisi yüklediğimiz anda bilgisayar otomatik olarak yükler, servisi bilgisayardan kaldırdığımız zaman ise otomatik olarak kaldırır. Standart servis uygulamaları için standart installer’ları kullanabileceğimiz için, servis uygulamalarımız için özel installer’lar da oluşturabiliriz.

Genel amaçlı installer’lar, servis uygulamasının ve ilgili kaynakların yükleneceği dizinin belirtilmesi gibi işlemleri yapmamızı sağlayan installer sınıflarını içermektedir. Ön-tanımlı kurulum bileşenleri olay günlükleri, performans sayaçları, windows servisleri ve mesaj kuyrukları gibi yapıları da yüklemek amacıyla kullanabileceğimiz sınıfları içermektedir. Servis uygulamamızda olay günlükleri, performans sayaçları ve mesaj kuyrukları kullandığımız durumlarda bu yapıları konfigure edebilmek için ön-tanımlı installer’lar kullanmamız gerekir. .NET Framework’un sunduğu ön-tanımlı installer sınıfları şunlardır:

System.Diagnostics.EventLogInstaller

Bu sınıf varsayılan Olay Günlüklerini yönetmemizi sağlar. Aynı zamanda bu sınıf ile özel olay günlükleri oluşturmamızı ve kayıt eklememizi de sağlar.

System.Diagnostics.PerformanceCounterInstaller

Bu sınıf ile sistemde yüklü olan performans sayaçlarını yönetebiliriz. Aynı zamanda özel performans sayaçları yüklememize ve konfigure etmemize olanak tanır.

System.Diagnostics.ServiceInstaller ve System.ServiceProcess.ServiceProcessInstaller

Bu iki sınıf bilgisayarlara windows servislerini yüklememizi ve sonrasında konfigure etmemizi sağlar. Servis uygulamamız için bir adet System.ServiceProcess.ServiceProcessInstaller sınıf örneği, ve servis uygulamamız içindeki her bir servis için de System.Diagnostics.ServiceInstaller sınıf örneği içermemiz gerekmektedir. ServiceProcessInstaller sınıfı tüm servis uygulamaları için registry kayıtlarının yazılması gibi ortak olan görevleri gerçekleştirir.

System.Messaging.MessageQueueInstaller

Bu sınıf servis uygulamamız tarafından mesaj gönderip almak amacıyla kullanılacak mesaj kuyruklarının oluşturulmasını ve konfigurasyonunu yapmamızı sağlar.

Installer’ların Eklenmesi

Servis uygulamamızı yüklemek için System.Configurastion.Install.Installer sınıfından türeyen bir Installer sınıfı eklememiz gerekir. Installer sınıfı servis uygulamamızın runtime sırasında kullandığı kaynakların kurulumu için bileşenler içeren Installers adında bir kolleksiyon içermektedir. EventLogInstaller’ları, PerformanceCounterInstaller’ları, Service Installer’ları, ServiceProcessInstaller’ları ve MessageQueueInstaller’ları Installers kolleksiyonuna ekleriz.

Servis uygulamamıza installer’ları Visual Studio.NET arayüzünden ekleriz. Installer eklemek için özellikler (Properties) ekranında yer alan Add Installer linkini kullanabileceğimiz gibi, design mode’dayken sağ tuş menüsünde yer alan Add Installer komutunu da kullanabiliriz.

Şekil 1:1 :: Add Installer Komutu

Önceden söylediğimiz gibi, windows servis uygulamamız için bir adet ServiceProcessInstaller nesnesine, uygulama içindeki her windows servisi içinde bir adet ServiceInstaller nesnesine ihtiyacımız var.  Servis uygulamamıza installer’ları eklemek için, Add Installer komutunu çalıştırıyoruz. Bu komutu çalıştırdığımızda Visual Studio otomatik olarak bir adet ServiceProcessInstaller nesnesi ve bir adet ServiceInstaller nesnesi içeren ProjectInstaller sınıfını oluşturacaktır. Şekil 1:2, Windows servis progjemize ait ProjectInstaller sınıfını göstermektedir.

Şekil 1:2 :: Installer Sınıfları

serviceProcessInstaller, serviceInstaller, PerformanceCounterInstaller ve eventLogInstaller installer’ları, ProjectInstaller sınıfının Installers kolleksiyonuna eklenmiştir. Aşağda ProjectInstaller sınıfının kodları görüntülenmektedir.

using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;

namespace InstallerDemoCS

{

      /// <summary>

      /// Summary description for ProjectInstaller.

      /// </summary>

      [RunInstaller(true)]

     public class ProjectInstaller : System.Configuration.Install.Installer

      {

private System.ServiceProcess.ServiceProcessInstaller

            serviceProcessInstaller1;

private System.ServiceProcess.ServiceInstaller serviceInstaller1;

private System.Diagnostics.EventLogInstaller eventLogInstaller1;


private System.Diagnostics.PerformanceCounterInstaller

             performanceCounterInstaller1;

            /// <summary>

            /// Required designer variable.

            /// </summary>

private System.ComponentModel.Container components = null;

 

public ProjectInstaller()

{

      // This call is required by the Designer.

      InitializeComponent();

            // TODO: Add any initialization after the InitComponent call

}

 

#region Component Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();

      this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();

      this.eventLogInstaller1 = new System.Diagnostics.EventLogInstaller();

      this.performanceCounterInstaller1 = new System.Diagnostics.PerformanceCounterInstaller();

      //

      // serviceProcessInstaller1

      //

      this.serviceProcessInstaller1.Password = null;

      this.serviceProcessInstaller1.Username = null;

      //

      // serviceInstaller1

      //

      this.serviceInstaller1.ServiceName = "MyService";

      //

      // eventLogInstaller1

      //

      this.eventLogInstaller1.Log = "Application";

      this.eventLogInstaller1.Source = "MyService";

      //

      // performanceCounterInstaller1

      //

      this.performanceCounterInstaller1.CategoryHelp = "None";

      this.performanceCounterInstaller1.CategoryName = "MyCounters";

      this.performanceCounterInstaller1.Counters.AddRange(new System.Diagnostics.CounterCreationData[] {new System.Diagnostics.CounterCreationData("MyAppCounter", "MyAppCounter help", System.Diagnostics.PerformanceCounterType.NumberOfItems32)});

 

      //

      // ProjectInstaller

      //

      this.Installers.AddRange(new System.Configuration.Install.Installer[] {

        this.serviceProcessInstaller1,

        this.serviceInstaller1,

        this.eventLogInstaller1,

  this.performanceCounterInstaller1});

}

#endregion

 }

}

ProjectInstaller sınıfı [RunInstaller(true)] attribute’ına sahiptir. Bu attribute, ProjectInstaller sınıfını içeren assembly’i Installutil.exe aracını kullanarak yüklememizi gerektirir. Installer kullanımı, tüm bileşenlerin başarıyla kurulduğundan veya hiçbirinin kurulmadığından emin olmamızı sağlar. Kurulum sırasında bileşenlerden birinin yüklenmesi esnasında sorun çıkması halinde, installer kurulumun tamamını geri alır ve kurulmuş olan bileşenleri kaldırır.

Servis Uygulaması için Güvenlik Tanımlamalarının Yapılması

İnstaller, servis uygulamasının kurulmasına ve kaldırılmasına ek olarak, servis uygulamamızın hangi kullanıcı hesabı ile çalışacağını tanımlamamıza da izin verir. Bu tanımlamayı yapmak için, ServiceProcessInstaller sınıfının Account özelliğini kullanırız. ServiceProcessInstaller sınıfının Account özelliğini, özellikler ekranından düzenleyebiliriz.

Account özelliğine değer olarak, LocalService, NetworkService, LocalSystem veya User değerlerinden birini verebiliriz.

Metod

Açıklama

LocalService

Servisimizin yerel bilgisayar üzerinde geniş yetkilere sahip ve uzaktaki bilgisayarlara erişebilen bir account ile çalışmasını sağlar.

LocalSystem

Servisimizin yerel bilgisayar üzerinde yetkisiz ve uzaktaki bilgisayarlara anonim olarak erişebilen bir account ile çalışmasını sağlar.

NetworkService

Servisimizin yerel bilgisayar üzerinde yetkisiz ve uzaktaki bilgisayarlara erişebilen bir account ile çalışmasını sağlar.

User

Servisimizin belirtilen bir kullanıcı hesabını kullanarak çalışmasını sağlar. Bu özelliğin seçilmesi durumunda geçerli bir kullanıcı adı ve parola belirtmemiz gerekir.

Windows Servisinin Kurulması ve Kaldırılması

Servis uygulamamıza installer’ları eklediktn ve kullanıcı account bilgilerini tanımladıktan sonra, servisimiz build edilerek çalışacağı bilgisayara yüklenmeye hazır hale gelmiş demektir. Servis uygulamasını build etmek için Build menüsünden Build Solution komutunu kullanırız.

Servis uygulamamızı build ettikten sonra bir .exe dosyası oluşturulur. Oluşturulan bu .exe dosyasını doğrudan çalıştıramayız, bu nedenle .net framework tarafından sunulan ve servis uygulamalarının bilgisayara servis olarak kaydedilmesinde kullanılan installUtil.exe aracını kullanarak yüklememiz gerekir. Bu aracı komut satırından aşağıdaki sözdizimi ile çalıştırırız:

Söz Dizimi:

InstallUtil.exe <.exe dosyası>

Örnek:

InstallUtil.exe benimServisim.exe

InstallUtil aracını çalıştırdığımızda, servis uygulamamızdaki tüm installer’ları çalıştırır. Daha sonra Installer’lar servis uygulamamızı ve ilgili kaynakları bilgisayara yüklerler. ServiceProcessInstaller sınıfının Account özelliğini User olarak belirtmemiz durumunda kullanıcı adı ve parola bilgilerini belirtmemiz için şekil 1:3’teki ekran görüntülenir.


Şekil 1:3 :: Servis Uygulamamız için Kullanıcı Adı ve Parola bilgilerini belirteceğimiz ekran

Bu bilgileri girmemizin ardından InstallUtil aracı kurulum sürecini tamamlar ve komut satırında işlemin sonucuna dair bir mesaj görüntüler. Şekil 1:4, kurulum sürecinde komut satırındaki ifadeleri görüntülemektedir.

Şekil 1:4 :: InstallUtil aracı ile servisin kurulum süreci

Servis uygulamamızı daha sonra SCM aracılığıyla yönetebiliriz.

Şekil 1:5 :: SCM Aracılığıyla Windows Servisinin Görüntülenmesi ve Yönetimi

Installutil aracı aynı zamanda yüklenmiş olan bir servisin bilgisayardan kaldırılmasını da sağlar. Bu işlem için InstallUtil aracını /u parametresi ile çalıştırmamız gerekir.

Şekil 1.6 :: Windows Servisinin Bilgisayardan Kaldırılması

Yazı dizisinin bir sonraki ve son bölümünde, yerel ve uzaktaki bilgisayarlarda yer alan servislerin hem SCM aracılığıyla hem de programatik olarak yönetimini ele alıyor olacağız.

 

 

Kaynaklar:
. Microsoft Developers Network (http://msdn.microsoft.com)
. Technet (http://technet.microsoft.com/)
. Developing XML Web Services and Server Components with Microsoft Visual Basic .NET and Microsoft Visual C# .NET ()