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
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
Jeslibysmy chcielibyśmy zatrzymac nasza usluge i ja usunac wystarczy posluzyc sie ponizszym kodem
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
powodzenia!!!
//jak sie spodoba to prosze o przeniesienie do tutkow
Edit Vandervir:
Przeniesione
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
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
powodzenia!!!
//jak sie spodoba to prosze o przeniesienie do tutkow
Edit Vandervir:
Przeniesione