Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

psservice \\server restart service

Ответ 2

ОПИСАНИЕ:       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 security descriptor.
      sdset-----------Sets a service 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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

Я рекомендую метод, заданный 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;

Ответ 7

  • открыть базу данных диспетчера управления службами с помощью openscmanager
  • получить зависимую службу, используя EnumDependService()
  • Остановить все зависимые службы, используя ChangeConfig(), передать STOP-сигнал этой функции, если они запущены.
  • остановить фактическое обслуживание
  • Получить все службы зависимостей службы
  • Запуск всех зависимостей служб с помощью StartService(), если они остановлены
  • Начать фактическое обслуживание

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

Ответ 8

Как и Powershell v3, PSsessions разрешает запуск любого нативного командлета на удаленном компьютере.

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

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

Ответ 9

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

Restart-Service "servicename"