--------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
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



Odpowiedź z Cytatem
