Mega Code Archive

 
Categories / Delphi / System
 

Nt servislerini sistemden kaldırmak, yeni servis yüklemek, servisi uygulama içerisinden çalıştırmak

uses ShellApi, WinSvc; // ServiceName isimli servisi sistemden kaldırır. function RemoveService(const ServiceName: string): Boolean; var SCM: SC_HANDLE; ServiceHandle: SC_HANDLE; begin Result := False; SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if SCM = 0 then raise Exception.Create('Servis Kontrol Yöneticisi açılamadı.'); ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS); if ServiceHandle = 0 then begin CloseServiceHandle(SCM); raise Exception.Create(ServiceName + ' isimli servis açılamadı. Hata: ' + SysErrorMessage(getLastError)); end; if not DeleteService(ServiceHandle) then raise Exception.Create(ServiceName + ' isimli servis silinemedi. Hata: ' + SysErrorMessage(getLastError)); CloseServiceHandle(SCM); end; // Sisteme yeni servis yükler function InstallService(const ServiceName, DisplayName, BinaryFile: string; dwStartType: DWord): Boolean; var SCM: SC_HANDLE; ServiceHandle: SC_HANDLE; begin Result := False; SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if SCM = 0 then raise Exception.Create('Servis Kontrol Yöneticisi açılamadı.'); ServiceHandle := CreateService(SCM, PChar(ServiceName), PChar(DisplayName), SERVICE_CHANGE_CONFIG, SERVICE_WIN32_OWN_PROCESS, dwStartType, SERVICE_ERROR_NORMAL, PChar(BinaryFile), nil, nil, nil, nil, nil); if ServiceHandle = 0 then begin CloseServiceHandle(SCM); raise Exception.Create(ServiceName + ' isimli servis yüklemesi başarısız. Sistem hatası: ' + SysErrorMessage(GetLastError)); end; CloseServiceHandle(SCM); CloseServiceHandle(ServiceHandle); Result := True; end; // Servisi başlatır function StartNTService(const ServiceName: string): Boolean; var SCM: SC_HANDLE; ServiceHandle: SC_HANDLE; Res: Boolean; Temp: PChar; Status: SERVICE_STATUS; Err: Integer; begin Result := False; SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if SCM = 0 then raise Exception.Create('Servis Kontrol Yöneticisi açılamadı. Hata: ' + SysErrorMessage(getLastError)); ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS); if ServiceHandle = 0 then begin CloseServiceHandle(SCM); raise Exception.Create(ServiceName + ' isimli servis açılamadı. Hata: ' + SysErrorMessage(getLastError)); end; Res := StartService(ServiceHandle, 0, Temp); if Res then begin Res := QueryServiceStatus(ServiceHandle, Status); while (Res) do begin if Status.dwCurrentState = SERVICE_RUNNING then begin Result := True; Break; end else if Status.dwCurrentState = SERVICE_STOPPED then begin Result := False; Break; end; QueryServiceStatus(ServiceHandle, Status); end; end else begin Err := GetLastError; if Err <> ERROR_SERVICE_ALREADY_RUNNING then raise Exception.Create(ServiceName + ' isimli servis başlatılamadı. Hata:' + SysErrorMessage(Err)); end; CloseServiceHandle(SCM); if not Result then raise Exception.Create(ServiceName + ' isimli servis başlatılamadı'); end; // Servisi durdurur function StopNTService(const ServiceName: string): Boolean; var SCM: SC_HANDLE; ServiceHandle: SC_HANDLE; Res: Boolean; Status: SERVICE_STATUS; begin Result := False; SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if SCM = 0 then raise Exception.Create('Servis Kontrol Yöneticisi açılamadı'); ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS); if ServiceHandle = 0 then begin CloseServiceHandle(SCM); raise Exception.Create(ServiceName + ' isimli servis açılamadı. Hata: ' + SysErrorMessage(getLastError)); end; Res := ControlService(ServiceHandle, SERVICE_CONTROL_STOP, Status); if not Res then begin if GetLastError <> ERROR_SERVICE_NOT_ACTIVE then raise Exception.Create('Servis durdurulamadı'); end else Result := True; end; // Servis durumu hakkında bilgi verir. y.n. çalışıyor, durdurulmuş vb. function GetServiceStatus( const ServiceName: string): SERVICE_STATUS; var SCM: SC_HANDLE; ServiceHandle: SC_HANDLE; begin SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if SCM = 0 then raise Exception.Create('HATA'); ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS); if ServiceHandle = 0 then begin CloseServiceHandle(SCM); case GetLastError of ERROR_ACCESS_DENIED: raise Exception.Create('Yetersiz ayrıcalıklar'); ERROR_INVALID_HANDLE: raise Exception.Create('Geçersiz Handle'); ERROR_INVALID_NAME:raise Exception.Create('Servis Bulunamadı'); ERROR_SERVICE_DOES_NOT_EXIST: raise Exception.Create('Servis bulunamadı'); end; end; if not QueryServiceStatus(ServiceHandle, Result) then raise Exception.Create('Durum Alınamadı'); end;