Art - Autostart programu jako usluga systemowa

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
--------Autostart programu .... w dodatku z konta SYSTEM--------

Czego bedziemy potrzebowali??
-kompilatora ja uzywam VC++ 2008 moze na dev c++ tez zadziała(powinien)
-znajomosci WinApi
-znajomości c++
-ostatecznie(choć nie polecam) stosowanie metody copiego-pasta
<



Naszym celem jest stworzenie usługi systemowej uruchamiającej się ze startem systemu
smile.gif

napewno ten sposob jest wielu osobom znany lecz wiele osob pyta sie o to na wielu forach.

Zaczynamy
na początku dołączamy plik windows.h (#include <windows.h>)

potem w funkcji main wywołujemy następujacy kod
Kod:
SC_HANDLE sh_manager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
    if(!sh_manager)
    {
return false; //nie udalo sie otworzyc SCManagera
    }

SC_HANDLE service_handle=CreateService(sh_manager,"nazwa_naszej_uslugi","nazwa_naszej_uslugi",SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERR
OR_NORMAL,"sciezka_do_pliku_exe",NULL,NULL,NULL,NULL,NULL);
if(!service_handle)
{
if(GetLastError()==ERROR_SERVICE_EXISTS)//usluga o tej nazwie juz istnieje
{
service_handle= OpenService(sh_manager,"nazwa_naszej_uslugi",SERVICE_ALL_ACCESS);
}
else
{
CloseServiceHandle(sh_manager);//zamykamy uchwyty
CloseServiceHandle(service_handle);
return false;//nie udalo sie stworzyc uslugi
}
}
else
{
if(StartService(service_handle,0,NULL)==0)//jesli nie ma zadnych bledow no to mozemy wystartowac nasza usluge :D
{
if(GetLastError()==ERROR_SERVICE_ALREADY_RUNNING)
{
return true;//zostala juz wczesniej uruchomiona
}
}
}
CloseServiceHandle(sh_manager);//zamykamy uchwyty
CloseServiceHandle(service_handle);

return true;//w tym momecie nasza usluga juz chodzi i uruchomi sie tez przy nastepnym uruchomieniu


Jeslibysmy chcielibyśmy zatrzymac nasza usluge i ja usunac wystarczy posluzyc sie ponizszym kodem

Kod:
SC_HANDLE sh_manager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
    if(!sh_manager)
    {
return false; //nie udalo sie otworzyc SCManagera
    }

SC_HANDLE service_handle= OpenService(sh_manager,"nazwa_naszej_uslugi",SERVICE_ALL_ACCESS);


SERVICE_STATUS stat;
if(ControlService(service_handle,SERVICE_CONTROL_STOP,&stat)!=0)
{
//rob cos
//zatrzymano
}
else
{
//rob cos
//nie zatrzymano - moze byc tak ze program juz skonczyl dzialanie wiec nie zawsze zwrocenie 0 oznacza ze operacja sie nie powiedzie
}
if(DeleteService(service_handle)!=0)
{
//rob cos
//usunieto
}
else
{
//rob cos
//nie udalo sie usunac
}

CloseServiceHandle(sh_manager);
CloseServiceHandle(service_handle);


Ale jest pewien problem ktorego jeszcze nie rozgryzlem ale znalazlem sposob na jego obejscie
a mianowicie program musi miec specjalna funkcje main(dla uslugi) - jest ona opisana na MSDN - chetnych zapraszam do lektury
jesli nie ma jej to po kilku sekundach sie wylaczy ale wystarczy teraz uzyc w zwyklym mainie funkcji WinExec i wystartowac inny program - on tez bedzie uruchomiony z konta SYSTEM
smile.gif



powodzenia!!!


//jak sie spodoba to prosze o przeniesienie do tutkow
smile.gif


Edit Vandervir:
Przeniesione
 

Dark Smark

Były Moderator
Dołączył
Kwiecień 29, 2006
Posty
1953
Brawo grzonu! Nie sprawdzałem poprawności kodu ale dzięki temu że bardzo ogromna część to WinApi więc łatwo przepisać na inny język. W sumie każdy sobie poradzi bo tutaj malutko jest C++.
Brawo za poświęcony czas i otwarcie źródła. Pozdrawiam.
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
pozatym wszytkie funkcje sa udokumentowane na MSDN
 
Do góry Bottom