Самый простой способ перезапустить службу на удаленном компьютере
каков самый простой программный способ перезапуска службы в удаленной системе Windows? Язык или метод не имеет значения до тех пор, пока он не требует человеческого взаимодействия.
9 ответов:
начиная с Windows XP, вы можете использовать
sc.exe
взаимодействие с локальными и удаленными сервисами. Запланируйте задачу для запуска пакетного файла, подобного этому:sc \server stop service sc \server start serviceубедитесь, что задача выполняется под учетной записью пользователя с правами доступа на целевом сервере.
psservice.exe
С Sysinternals PSTools также будет делать работу:psservice \server restart service
описание: SC-это программа командной строки, используемая для связи с NT Service Controller and services. ИСПОЛЬЗОВАНИЕ: sc [команда] [имя службы]...
The option <server> has the form "\ServerName" Further help on commands can be obtained by typing: "sc [command]" Commands: query-----------Queries the status for a service, or enumerates the status for types of services. queryex---------Queries the extended status for a service, or enumerates the status for types of services. start-----------Starts a service. pause-----------Sends a PAUSE control request to a service. interrogate-----Sends an INTERROGATE control request to a service. continue--------Sends a CONTINUE control request to a service. stop------------Sends a STOP request to a service. config----------Changes the configuration of a service (persistant). description-----Changes the description of a service. failure---------Changes the actions taken by a service upon failure. qc--------------Queries the configuration information for a service. qdescription----Queries the description for a service. qfailure--------Queries the actions taken by a service upon failure. delete----------Deletes a service (from the registry). create----------Creates a service. (adds it to the registry). control---------Sends a control to a service. sdshow----------Displays a service's security descriptor. sdset-----------Sets a service's security descriptor. GetDisplayName--Gets the DisplayName for a service. GetKeyName------Gets the ServiceKeyName for a service. EnumDepend------Enumerates Service Dependencies. The following commands don't require a service name: sc <server> <command> <option> boot------------(ok | bad) Indicates whether the last boot should be saved as the last-known-good boot configuration Lock------------Locks the Service Database QueryLock-------Queries the LockStatus for the SCManager Database
пример: sc start MyService
если он не требует человеческого взаимодействия, что означает, что не будет пользовательского интерфейса, который вызывает эту операцию, и я предполагаю, что он перезапустится через некоторый заданный интервал? Если у вас есть доступ к машине, вы можете просто установить запланированную задачу для выполнения пакетного файла, используя старые добрые NET STOP и NET START
net stop "DNS Client" net start "DNS client"
или если вы хотите получить немного более сложным, вы могли бы попробовать Powershell
будет так много случаев, когда служба войдет в "stop pending".Операционная система будет жаловаться, что она "не смогла остановить службу xyz."В случае, если вы хотите абсолютно убедиться, что служба перезапущена, вы должны убить процесс вместо этого. Вы можете сделать это, выполнив следующие действия в bat файл
taskkill /F /IM processname.exe timeout 20 sc start servicename
чтобы узнать, какой процесс связан с вашим сервисом, перейдите в Диспетчер задач -- > вкладка "службы" -- > щелкните правой кнопкой мыши на вашем сервисе--> перейти процесс.
обратите внимание, что это должно быть обойти, пока вы не выясните, почему ваш сервис должен был быть перезапущен в первую очередь. Вы должны искать утечки памяти, бесконечные циклы и другие подобные условия, чтобы ваш сервис перестал отвечать на запросы.
посмотреть sysinternals для различных инструментов, которые помогут вам достичь этой цели. например, psService перезапустит службу на удаленной машине.
Я рекомендую метод, данный doofledorfer.
Если вы действительно хотите сделать это с помощью прямого вызова API, то посмотрите на функция OpenSCManager. Ниже приведены примеры функций для получения имени машины и службы, а также их остановки или запуска.
function ServiceStart(sMachine, sService : string) : boolean; //start service, return TRUE if successful var schm, schs : SC_Handle; ss : TServiceStatus; psTemp : PChar; dwChkP : DWord; begin ss.dwCurrentState := 0; schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_CONNECT); //connect to the service control manager if(schm > 0)then begin // if successful... schs := OpenService( schm,PChar(sService),SERVICE_START or SERVICE_QUERY_STATUS); // open service handle, start and query status if(schs > 0)then begin // if successful... psTemp := nil; if (StartService(schs,0,psTemp)) and (QueryServiceStatus(schs,ss)) then while(SERVICE_RUNNING <> ss.dwCurrentState)do begin dwChkP := ss.dwCheckPoint; //dwCheckPoint contains a value incremented periodically to report progress of a long operation. Store it. Sleep(ss.dwWaitHint); //Sleep for recommended time before checking status again if(not QueryServiceStatus(schs,ss))then break; //couldn't check status if(ss.dwCheckPoint < dwChkP)then Break; //if QueryServiceStatus didn't work for some reason, avoid infinite loop end; //while not running CloseServiceHandle(schs); end; //if able to get service handle CloseServiceHandle(schm); end; //if able to get svc mgr handle Result := SERVICE_RUNNING = ss.dwCurrentState; //if we were able to start it, return true end; function ServiceStop(sMachine, sService : string) : boolean; //stop service, return TRUE if successful var schm, schs : SC_Handle; ss : TServiceStatus; dwChkP : DWord; begin schm := OpenSCManager(PChar(sMachine),nil,SC_MANAGER_CONNECT); if(schm > 0)then begin schs := OpenService(schm,PChar(sService),SERVICE_STOP or SERVICE_QUERY_STATUS); if(schs > 0)then begin if (ControlService(schs,SERVICE_CONTROL_STOP,ss)) and (QueryServiceStatus(schs,ss)) then while(SERVICE_STOPPED <> ss.dwCurrentState) do begin dwChkP := ss.dwCheckPoint; Sleep(ss.dwWaitHint); if(not QueryServiceStatus(schs,ss))then Break; if(ss.dwCheckPoint < dwChkP)then Break; end; //while CloseServiceHandle(schs); end; //if able to get svc handle CloseServiceHandle(schm); end; //if able to get svc mgr handle Result := SERVICE_STOPPED = ss.dwCurrentState; end;
- откройте базу данных Service control manager с помощью openscmanager
- получить зависимую службу с помощью EnumDependService ()
- остановите все зависимые службы с помощью ChangeConfig () отправка сигнала остановки в эту функцию, если они запущены
- остановить действительную службу
- получить все зависимости служб службы
- запустите все зависимости служб с помощью StartService (), если они остановлены
- начать фактическое сервис
таким образом, ваша служба перезапускается, заботясь обо всех зависимостях.
по состоянию на PowerShell версии 3, сеансы позволяют любой стандартный командлет должен быть запущен на удаленном компьютере
$session = New-PSsession -Computername "YourServerName" Invoke-Command -Session $Session -ScriptBlock {Restart-Service "YourServiceName"} Remove-PSSession $Session
посмотреть здесь для получения дополнительной информации