Самый простой способ перезапустить службу на удаленном компьютере - PullRequest
54 голосов
/ 05 ноября 2008

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

Ответы [ 9 ]

95 голосов
/ 05 ноября 2008

Начиная с Windows XP, вы можете использовать sc.exe для взаимодействия с локальными и удаленными службами. Запланируйте задачу для запуска командного файла, подобного этому:

sc \\server stop service
sc \\server start service

Убедитесь, что задача выполняется под учетной записью пользователя, привилегированного на целевом сервере.

psservice.exe из Sysinternals PSTools также будет выполнять эту работу:

psservice \\server restart service
13 голосов
/ 05 ноября 2008

ОПИСАНИЕ: SC - программа командной строки, используемая для связи с NT Service Controller и сервисы. ИСПОЛЬЗОВАНИЕ: 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

5 голосов
/ 05 ноября 2008

Если для этого не требуется взаимодействие с человеком, это означает, что не будет никакого пользовательского интерфейса, который вызывает эту операцию, и я предполагаю, что он будет перезапущен через определенный интервал? Если у вас есть доступ к машине, вы можете просто установить запланированное задание для выполнения командного файла, используя старые добрые NET STOP и NET START

net stop "DNS Client"
net start "DNS client"

или если вы хотите немного сложнее, вы можете попробовать Powershell

3 голосов
/ 15 июня 2015

Там будет очень много случаев, когда служба войдет в «ожидание остановки». Операционная система будет жаловаться, что «Не удалось остановить службу xyz». Если вы хотите быть абсолютно уверенным, что служба перезапущена, вам следует вместо этого завершить процесс. Вы можете сделать это, выполнив следующие действия в файле bat

taskkill /F /IM processname.exe
timeout 20
sc start servicename

Чтобы узнать, какой процесс связан с вашей службой, перейдите в диспетчер задач -> вкладка «Службы» -> щелкните правой кнопкой мыши на вашей службе -> Перейти к процессу.

Обратите внимание, что это должен быть обходной путь, пока вы не выясните, почему сначала нужно было перезапустить службу. Вы должны искать утечки памяти, бесконечные циклы и другие подобные условия, чтобы ваша служба перестала отвечать.

2 голосов
/ 05 ноября 2008

посмотрите на sysinternals , чтобы найти множество инструментов, которые помогут вам достичь этой цели. Например, psService перезапустит службу на удаленной машине.

1 голос
/ 11 сентября 2015

Начиная с Powershell v3, PSsessions допускает запуск любого собственного командлета на удаленной машине

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

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

1 голос
/ 01 декабря 2008
  1. открыть базу данных менеджера управления службами с помощью openscmanager
  2. получить зависимый сервис, используя EnumDependService ()
  3. Остановите все зависимые службы, используя ChangeConfig (), отправляющие сигнал STOP этой функции, если они запущены
  4. прекратить фактическое обслуживание
  5. Получить все сервисные зависимости сервиса
  6. Запустить все зависимости служб с помощью StartService (), если они остановлены
  7. Начать фактическое обслуживание

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

1 голос
/ 05 ноября 2008

Я рекомендую метод, данный 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;
0 голосов
/ 13 июля 2016

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

Restart-Service "servicename"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...