Самый простой способ перезапустить службу на удаленном компьютере


каков самый простой программный способ перезапуска службы в удаленной системе Windows? Язык или метод не имеет значения до тех пор, пока он не требует человеческого взаимодействия.

9 52

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;
  1. откройте базу данных Service control manager с помощью openscmanager
  2. получить зависимую службу с помощью EnumDependService ()
  3. остановите все зависимые службы с помощью ChangeConfig () отправка сигнала остановки в эту функцию, если они запущены
  4. остановить действительную службу
  5. получить все зависимости служб службы
  6. запустите все зависимости служб с помощью StartService (), если они остановлены
  7. начать фактическое сервис

таким образом, ваша служба перезапускается, заботясь обо всех зависимостях.

по состоянию на PowerShell версии 3, сеансы позволяют любой стандартный командлет должен быть запущен на удаленном компьютере

$session = New-PSsession -Computername "YourServerName"
Invoke-Command -Session $Session -ScriptBlock {Restart-Service "YourServiceName"}
Remove-PSSession $Session

посмотреть здесь для получения дополнительной информации

Я считаю, что PowerShell теперь превосходит команду " sc " с точки зрения простоты:

Restart-Service "servicename"