Инсталляция / удаление сервисов под NT
01.01.2007
{ **** UBPFD *********** by kladovka.net.ru **** >> Инсталляция/удаление сервисов под НТ. Функции для создавания и удаления NT Services. Можно создать NT Service от текущее приложение. Параметры: 1. CreateNTService(ExecutablePath,ServiceName: String) ExecutablePath - Полный путь к изполнимого файла от которого создавается NT Service ServiceName - Имя сервиза которое отобразится в Service Control Manager Результат: true - если операциая завершена успешно false - если есть ошибка. Можно произвести call то GetLastError чтобы информироваться об естество ошибки 2. DeleteNTService(ServiceName: String):boolean; ServiceName - имя сервиза подлежающии удаления Результат: true - если операциая завершена успешно false - если есть ошибка. Можно произвести call то GetLastError чтобы информироваться об естество ошибки Зависимости: WinSVC, Windows Автор: Alex Kantchev, stoma@bitex.bg Copyright: Собственное написание Дата: 19 июня 2002 г. ********************************************** } // CreateNTService(ExecutablePath,ServiceName: String) // ExecutablePath - Полный путь к изполнимого файла от // которого создавается NT Service // ServiceName - Имя сервиза которое отобразится // в Service Control Manager Результат: //Результат: // true - если операциая завершена успешно // false - если есть ошибка. Можно произвести // call то GetLastError чтобы информироваться об // естество ошибки function CreateNTService(ExecutablePath,ServiceName: String):boolean; var hNewService,hSCMgr: SC_HANDLE; // Rights: DWORD; FuncRetVal: Boolean; begin FuncRetVal := False; hSCMgr := OpenSCManager(nil,nil,SC_MANAGER_CREATE_SERVICE); if (hSCMgr <> 0 ) then begin //Custom service access rights may be built here //we use GENERIC_EXECUTE which is combination of //STANDARD_RIGHTS_EXECUTE, SERVICE_START, SERVICE_STOP, //SERVICE_PAUSE_CONTINUE, and SERVICE_USER_DEFINED_CONTROL //You can create own rights and use them as shown in the //commented line below. //Rights := STANDARD_RIGHTS_REQUIRED or SERVICE_START or SERVICE_STOP // or SERVICE_QUERY_STATUS or SERVICE_PAUSE_CONTINUE or // SERVICE_INTERROGATE; hNewService := CreateService(hSCMgr,PChar(ServiceName),PChar(ServiceName), STANDARD_RIGHTS_REQUIRED,SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL, PChar(ExecutablePath),nil,nil,nil,nil,nil); CloseServiceHandle(hSCMgr); if (hNewService <> 0) then FuncRetVal := true else FuncRetVal := false; end; CreateNTService := FuncRetVal; end; // *** //DeleteNTService(ServiceName: String):boolean; // ServiceName - имя сервиза подлежающии удаления //Результат: // true - если операциая завершена успешно // false - если есть ошибка. Можно произвести call то GetLastError чтобы // информироваться об естество ошибки function DeleteNTService(ServiceName: String):boolean; var hServiceToDelete,hSCMgr: SC_HANDLE; RetVal: LongBool; FunctRetVal: Boolean; begin FunctRetVal := false; hSCMgr := OpenSCManager(nil,nil,SC_MANAGER_CREATE_SERVICE); if (hSCMgr <> 0 ) then begin hServiceToDelete := OpenService(hSCMgr, PChar(ServiceName), SERVICE_ALL_ACCESS); RetVal := DeleteService(hServiceToDelete); CloseServiceHandle(hSCMgr); FunctRetVal := RetVal; end; DeleteNTService := FunctRetVal; end;
Пример использования:
procedure TForm1.Button1Click(Sender: TObject); var tmpS: String; begin tmpS := 'Delphi_Service_'+Application.Title; if (CreateNTService(Application.ExeName,tmpS)) then MessageDlg('Service '+tmpS+' has been successfully created!',mtInformation,[mbOK],0) else MessageDlg('Unable to create service '+tmpS+' Win32 Error code: '+IntToStr(GetLastError),mtWarning,[mbOK],0); end; procedure TForm1.Button2Click(Sender: TObject); var tmpS: String; begin tmpS := 'Delphi_Service_'+Application.Title+'1'; if (DeleteNTService(tmpS)) then MessageDlg('Service '+tmpS+' has been successfully deleted!',mtInformation,[mbOK],0) else MessageDlg('Unable to delete service '+tmpS+' Win32 Error code: '+IntToStr(GetLastError),mtWarning,[mbOK],0); end;