Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen vkamadan »

Normalde bir hizmet dosyasını

Kod: Tümünü seç

c:\hizmet.exe /install
Şeklinde yükleyebiliyoruz, ancak benim istediğim bu hizmetin otomatikmi başlıcak yoksa şimdilik devre dışı olarakmı yüklenecek gibi başlangıç parametrelerinide geçebilmek.
Bunu kodla yapmak istiyorum.
Yeni bir hizmeti yüklediğimde regsitry de oluşan değişiklikleri gözlemledim ve aynısını ben farklı bir servis için yapmaya çalıştım fakat başarılı olamadım sanırım Securty anahtarına gönderilen binary değerlerin her hizmet için windows tarafından üretilmesi grerekiyor , muhtemelen bir API felan vardır ama bulamadım.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba,
Olayı çözdüm,
Şöyle bir örnek üzerinden yola çıktım ,

Kod: Tümünü seç

uses
  SysUtils, NTServiceMan, WinSvc;

var
  ServiceMan: TNTServiceManager;
begin
  ServiceMan := TNTServiceManager.Create(nil);
  try
    // uncomment this block if configuring service on a remote host.
    // Connection.LogonAs.UserName := 'MyDomain\MyUser'; 
    // Connection.LogonAs.Password := 'MyPassword'; 
    // vServiceMan.MachineName := '\\10.8.26.54'; 
    // if (ServiceMan.ConnectIPC <> 0) then 
    //   writeln('Warning: could not use the provided credentials.'); 

    try
      ServiceMan.ManagerAccess := SC_MANAGER_CREATE_SERVICE;
      ServiceMan.ActiveManager := true;
      ServiceMan.ServiceName   := 'MyNewService1';
      ServiceMan.DisplayName   := 'The test service app 1';
      ServiceMan.BinaryPathName := 'c:\temp\dummy_service.exe';
      ServiceMan.ServiceType   := [WIN32_OWN_PROCESS];
      ServiceMan.StartType     := DEMAND_START;
      // assign more paremeters here as needed. 

      ServiceMan.Createservice;
      writeln('Service configured OK');
    except
      on E: Exception do
        writeln('Error: ' + E.Message);
    end;
  finally
    ServiceMan.ActiveManager := false;
    ServiceMan.Free;
  end;
end.
Fakat NT Specific adında bir bileşen seti yüklemek durumunda kaldım,
http://www.sam-solutions.net/download/nts1-14-d7.exe

Şimdi sorumun yönünü değiştiriyorum bu bileşen setini yükledim kullanıyorum kendi sitesinden indirdim , kayıtlı kullanıcı olmak 99USD kurulumda herhangi bir limit yok source dosyaları haric herşey var, zaten kurulumda gelen dosyada diyorki,


1. WHAT REGISTERED USERS GET.

- Sources of all components;
- No-time-limit technical support;
- Availability of free upgrades.


Yani yanlışmı anlıyorum komponenti böyle kullanabilirisin fakat 99 dolar verip kayıtlı kullanıcı olursan sadece kaynakları,güncellemeleri ve sınırsız teknik desteği de alırsın.
Doğru anladım inşalalh.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba,
Sitesinde download bölümündeki açıklamalarda gözümden kaçmış 30 gün sonra bileşen çalışmıyormuş :lol:
Bu demek oluyorki sorunum devam ediyor , Bir windows hizmetini kodla nasıl install edebilirim?
Kolay gelsin.
Volkan KAMADAN
www.polisoft.com.tr
apex06
Üye
Mesajlar: 58
Kayıt: 19 Nis 2012 12:21

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen apex06 »

Merhaba,

Bahsettiğiniz sorununuzu çözüme kavuşturabildiniz mi acaba? Bende exe'mi servislere ekleyip çalıştırmak istiyorum da.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen vkamadan »

merhaba ,
ShellExecute API si yardımıyla servis programınızın kendi Install yordamını çalıştırarak programınız içinden hizmeti yükletebilirsiniz.

Kod: Tümünü seç


//pbService.exe  servis uygulamasının dosya adı.

ShellExecute(
    Application.Handle,
    nil,
    PChar( ExtractFilePath (Application.ExeName) + 'pbService.exe'),
    PChar('/install'),
    PChar(ExtractFilePath (Application.ExeName)),
    SW_SHOWMINIMIZED);
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SHURZAN
Üye
Mesajlar: 73
Kayıt: 06 Eki 2007 05:34
Konum: İstanbul

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen SHURZAN »

Benim daha önce böyle bir c++ çalışmam var, eğer istersen bileşen kullanmadan C++ dili ile yazmış olduğum kodu paylaşabilirim.
Kullanıcı avatarı
SHURZAN
Üye
Mesajlar: 73
Kayıt: 06 Eki 2007 05:34
Konum: İstanbul

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen SHURZAN »

Bu yazdığım fonksiyon ile sisteme servis yükleyebilirsin.
"InstallSrvc" fonksiyonun parametrelerine bakarsan servisi yükleme seçeneklerini de ayarlaman mümkün.
Gerisi Bu kodu Delphi diline dönüştürmek, Sanırım forumda bunu yapacak bir forumdaş vardır.

Kolay gelsin
Yaşar

Kod: Tümünü seç


#include "Winsvc.h"
//----------------------------------------------------------------------------------------------------------------------------------------
BOOL InstallSrvc(wchar_t* pPath,
				 wchar_t* pDisplayName,
				 wchar_t* pSrvcName,
				 wchar_t* pDescription,
                                 int StratType,
				 LPCWSTR DependOnService=NULL,
                 		 int Delay=0 )
{  

   SC_HANDLE schSCManager = OpenSCManagerW( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
    BOOL result = false;
    if (schSCManager==NULL)
    {
        ErrorMsg(-10L,Lng["Svc8"]);
    }
    else
    {
		SC_HANDLE schService = CreateServiceW
        (
            schSCManager,               /* SCManager database      */
            pSrvcName,                  /* name of service         */
            pDisplayName,               /* service name to display */
            SERVICE_ALL_ACCESS,         /* desired access          */
            SERVICE_WIN32_OWN_PROCESS|  /* service type            */
            SERVICE_INTERACTIVE_PROCESS,
            StratType,                  /* start type              */
            SERVICE_ERROR_IGNORE,       /* error control type      */
            pPath,                      /* service's binary        */
            NULL,                       /* no load ordering group  */
            NULL,                       /* no tag identifier       */
            DependOnService,            /* no dependencies         */
            NULL,                       /* LocalSystem account     */
            NULL                        /* no password             */
        );
        if (schService==0)
        {
            ErrorMsg(-10L,Format((Lng["Svc9"]) ,OPENARRAY(TVarRec, (pSrvcName))));
        }
        else
        {
          //Servisin tanı mı.
		  SERVICE_DESCRIPTIONW sd;
         if(pDescription != NULL)
          {
           sd.lpDescription = pDescription;

           if(!ChangeServiceConfig2W(schService, SERVICE_CONFIG_DESCRIPTION, &sd) )
           {
            MessageBoxW(NULL,WStr(Format(Lng["Svc10"] ,
			OPENARRAY(TVarRec, (pSrvcName)))), pSrvcName, 4096+16);
           }
          }

		  //Servisi geciktirme ile başlat
          if(Delay != 0 )
           {
            SERVICE_FAILURE_ACTIONSW sdBuf={0};
            sdBuf.lpRebootMsg=NULL;
            sdBuf.dwResetPeriod=3600*24;

            SC_ACTION action[3];

            action[0].Delay=Delay*60000;
            action[0].Type =SC_ACTION_RESTART;

            action[1].Delay=action[0].Delay;
            action[1].Type=SC_ACTION_REBOOT;

            action[2].Delay=0;
            action[2].Type=SC_ACTION_NONE;

            sdBuf.cActions=3;
            sdBuf.lpsaActions=action;
            sdBuf.lpCommand=NULL;
            ChangeServiceConfig2W(schService, SERVICE_CONFIG_FAILURE_ACTIONS, &sdBuf);

            //Gecikmeli başlatmayı aktif et
            SERVICE_DELAYED_AUTO_START_INFO info = { true };
            ChangeServiceConfig2(schService, SERVICE_CONFIG_DELAYED_AUTO_START_INFO, &info);
           }

         result = true;
         CloseServiceHandle(schService);
        }
        CloseServiceHandle(schSCManager);
    }
    return result;
}
//--------------------------------------------------------------------------

apex06
Üye
Mesajlar: 58
Kayıt: 19 Nis 2012 12:21

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen apex06 »

vkamadan yazdı:merhaba ,
ShellExecute API si yardımıyla servis programınızın kendi Install yordamını çalıştırarak programınız içinden hizmeti yükletebilirsiniz.

Kod: Tümünü seç


//pbService.exe  servis uygulamasının dosya adı.

ShellExecute(
    Application.Handle,
    nil,
    PChar( ExtractFilePath (Application.ExeName) + 'pbService.exe'),
    PChar('/install'),
    PChar(ExtractFilePath (Application.ExeName)),
    SW_SHOWMINIMIZED);


Merhaba,

Geç geribildirm içn özür dilerim, hizmetlere ekleme yapamadım. Kod hata vermiyor ama hizmetlerde exe'mi göremedim. Ek olarak birşeyler yapmam gerekiyor mu?

Teşekkür ederim.
apex06
Üye
Mesajlar: 58
Kayıt: 19 Nis 2012 12:21

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen apex06 »

SHURZAN yazdı:Bu yazdığım fonksiyon ile sisteme servis yükleyebilirsin.
"InstallSrvc" fonksiyonun parametrelerine bakarsan servisi yükleme seçeneklerini de ayarlaman mümkün.
Gerisi Bu kodu Delphi diline dönüştürmek, Sanırım forumda bunu yapacak bir forumdaş vardır.

Kolay gelsin
Yaşar

Kod: Tümünü seç


#include "Winsvc.h"
//----------------------------------------------------------------------------------------------------------------------------------------
BOOL InstallSrvc(wchar_t* pPath,
				 wchar_t* pDisplayName,
				 wchar_t* pSrvcName,
				 wchar_t* pDescription,
                                 int StratType,
				 LPCWSTR DependOnService=NULL,
                 		 int Delay=0 )
{  

   SC_HANDLE schSCManager = OpenSCManagerW( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
    BOOL result = false;
    if (schSCManager==NULL)
    {
        ErrorMsg(-10L,Lng["Svc8"]);
    }
    else
    {
		SC_HANDLE schService = CreateServiceW
        (
            schSCManager,               /* SCManager database      */
            pSrvcName,                  /* name of service         */
            pDisplayName,               /* service name to display */
            SERVICE_ALL_ACCESS,         /* desired access          */
            SERVICE_WIN32_OWN_PROCESS|  /* service type            */
            SERVICE_INTERACTIVE_PROCESS,
            StratType,                  /* start type              */
            SERVICE_ERROR_IGNORE,       /* error control type      */
            pPath,                      /* service's binary        */
            NULL,                       /* no load ordering group  */
            NULL,                       /* no tag identifier       */
            DependOnService,            /* no dependencies         */
            NULL,                       /* LocalSystem account     */
            NULL                        /* no password             */
        );
        if (schService==0)
        {
            ErrorMsg(-10L,Format((Lng["Svc9"]) ,OPENARRAY(TVarRec, (pSrvcName))));
        }
        else
        {
          //Servisin tanı mı.
		  SERVICE_DESCRIPTIONW sd;
         if(pDescription != NULL)
          {
           sd.lpDescription = pDescription;

           if(!ChangeServiceConfig2W(schService, SERVICE_CONFIG_DESCRIPTION, &sd) )
           {
            MessageBoxW(NULL,WStr(Format(Lng["Svc10"] ,
			OPENARRAY(TVarRec, (pSrvcName)))), pSrvcName, 4096+16);
           }
          }

		  //Servisi geciktirme ile başlat
          if(Delay != 0 )
           {
            SERVICE_FAILURE_ACTIONSW sdBuf={0};
            sdBuf.lpRebootMsg=NULL;
            sdBuf.dwResetPeriod=3600*24;

            SC_ACTION action[3];

            action[0].Delay=Delay*60000;
            action[0].Type =SC_ACTION_RESTART;

            action[1].Delay=action[0].Delay;
            action[1].Type=SC_ACTION_REBOOT;

            action[2].Delay=0;
            action[2].Type=SC_ACTION_NONE;

            sdBuf.cActions=3;
            sdBuf.lpsaActions=action;
            sdBuf.lpCommand=NULL;
            ChangeServiceConfig2W(schService, SERVICE_CONFIG_FAILURE_ACTIONS, &sdBuf);

            //Gecikmeli başlatmayı aktif et
            SERVICE_DELAYED_AUTO_START_INFO info = { true };
            ChangeServiceConfig2(schService, SERVICE_CONFIG_DELAYED_AUTO_START_INFO, &info);
           }

         result = true;
         CloseServiceHandle(schService);
        }
        CloseServiceHandle(schSCManager);
    }
    return result;
}
//--------------------------------------------------------------------------


Cevabınız için teşekkür ederim. Bu kodlar C dilinde yazılmış sanırım. Şimdilik Delphi'ye çevirebileceğimi zannetmiyorum. :)
Kullanıcı avatarı
SHURZAN
Üye
Mesajlar: 73
Kayıt: 06 Eki 2007 05:34
Konum: İstanbul

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen SHURZAN »

Merhaba,
Evet bu bir C++ kodu bunu delphi diline çevirmek zor değil, yardımcı olacak bir olacaktır.
Bu fonksiyonda servis tanımı, başlatma şekli(otomatik, elle, devre dışı) , ve win7 ile gelen otomatik başlatmada geciktirme süresi belirleyebiliyorsun.
Bu C++ dili ile yazılmış Win32 uygulamasıdır. Win API olarak kullanılan fonksiyon "CreateServiceW" dır, ancak unutma yazacağın uygulaman admin hakları ile başlatılmalıdır.

Buna benzer bir tartışma şurada yapılmış inceleyerek karşılaştırıp geliştirebilirsin. viewtopic.php?f=2&t=5646&hilit=CreateService

Kolay gelsin
Yaşar
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen vkamadan »

apex06 yazdı:
vkamadan yazdı:merhaba ,
ShellExecute API si yardımıyla servis programınızın kendi Install yordamını çalıştırarak programınız içinden hizmeti yükletebilirsiniz.

Kod: Tümünü seç


//pbService.exe  servis uygulamasının dosya adı.

ShellExecute(
    Application.Handle,
    nil,
    PChar( ExtractFilePath (Application.ExeName) + 'pbService.exe'),
    PChar('/install'),
    PChar(ExtractFilePath (Application.ExeName)),
    SW_SHOWMINIMIZED);


Merhaba,

Geç geribildirm içn özür dilerim, hizmetlere ekleme yapamadım. Kod hata vermiyor ama hizmetlerde exe'mi göremedim. Ek olarak birşeyler yapmam gerekiyor mu?

Teşekkür ederim.
Merhaba sizin program windows hizmet uygulamasi dimi? Bir ihtimalde olsa normal desktop uygulamasini hizmetlere yuklemek istemedinizden emin olmak istedim
Volkan KAMADAN
www.polisoft.com.tr
apex06
Üye
Mesajlar: 58
Kayıt: 19 Nis 2012 12:21

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen apex06 »

vkamadan yazdı:
apex06 yazdı:
vkamadan yazdı:merhaba ,
ShellExecute API si yardımıyla servis programınızın kendi Install yordamını çalıştırarak programınız içinden hizmeti yükletebilirsiniz.

Kod: Tümünü seç


//pbService.exe  servis uygulamasının dosya adı.

ShellExecute(
    Application.Handle,
    nil,
    PChar( ExtractFilePath (Application.ExeName) + 'pbService.exe'),
    PChar('/install'),
    PChar(ExtractFilePath (Application.ExeName)),
    SW_SHOWMINIMIZED);


Merhaba,

Geç geribildirm içn özür dilerim, hizmetlere ekleme yapamadım. Kod hata vermiyor ama hizmetlerde exe'mi göremedim. Ek olarak birşeyler yapmam gerekiyor mu?

Teşekkür ederim.
Merhaba sizin program windows hizmet uygulamasi dimi? Bir ihtimalde olsa normal desktop uygulamasini hizmetlere yuklemek istemedinizden emin olmak istedim
Bir cihaza bağlanıp log soran varsa çeken veritabanı bağlantısı olan bir desktop uygulaması.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen vkamadan »

hizmetlerde çalışabilmesi için uygulamayı "Service application" olarak yazmanız gerekir ,
aşağıdaki makalelerle olaya giriş yapabilirsiniz ,

http://www.devarticles.com/c/a/Delphi-K ... -Delphi/1/
http://delphi.about.com/gi/o.htm?zi=1/X ... 50538.html
Volkan KAMADAN
www.polisoft.com.tr
apex06
Üye
Mesajlar: 58
Kayıt: 19 Nis 2012 12:21

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen apex06 »

vkamadan yazdı:hizmetlerde çalışabilmesi için uygulamayı "Service application" olarak yazmanız gerekir ,
aşağıdaki makalelerle olaya giriş yapabilirsiniz ,

http://www.devarticles.com/c/a/Delphi-K ... -Delphi/1/
http://delphi.about.com/gi/o.htm?zi=1/X ... 50538.html

çok teşekkür ederim, yeni bir şey daha öğrenmiş oldum.
iyi çalışmalar diliyorum..
Kullanıcı avatarı
SHURZAN
Üye
Mesajlar: 73
Kayıt: 06 Eki 2007 05:34
Konum: İstanbul

Re: Yeni Windows Hizmeti Uygulama içinden nasıl yükletilir?

Mesaj gönderen SHURZAN »

Uygulamanın kendisini servis olarak projelendireceksen "Service Application" olarak yazman gerekir fakat uygulaman başka bir uygulamayı servis olarak yüklemesi için yukarıda yazdığım fonksiyona ihtiyacın var.
Cevapla