Как перезапустить службу удаленно?

Я могу запускать или останавливать службу удаленно из проекта .net.

ConnectionOptions options = new ConnectionOptions();
options.Username = @"192.168.36.22\test";
options.Password = "test";
ManagementScope scope = new ManagementScope(@"\\192.168.36.22\root\cimv2", options);
scope.Connect();


ManagementOperationObserver Stop = new ManagementOperationObserver();
Stop.Completed += new CompletedEventHandler(Stop_CallBack);
try
{
    string NameServices = "ArcGIS Server";
    WqlObjectQuery query = new WqlObjectQuery("SELECT * FROM Win32_Service  WHERE Name=\"" + NameServices + "\"");
    ManagementObjectSearcher find = new ManagementObjectSearcher(scope, query);
    foreach (ManagementObject spooler in find.Get())
    {
        spooler.InvokeMethod("StopService", new object[] { });
        spooler.InvokeMethod(Start, "StopService", new object[] { });
    }
 }
....

Как я могу перезапустить эту службу?


person novicegis    schedule 23.08.2013    source источник
comment
Вы можете использовать стоп, а затем начать. Это то же самое.   -  person FelProNet    schedule 23.08.2013


Ответы (3)


Вы можете использовать класс ServiceController следующим образом:

ServiceController sc = new ServiceController("ArcGIS Server", "192.168.36.22");

sc.Start();
sc.Stop();

Это избавляет вас от необходимости писать весь этот код для взаимодействия с WMI. Обратите внимание, что для использования класса ServiceController необходимо добавить ссылку на сборку System.ServiceProcess.

person chris.house.00    schedule 23.08.2013
comment
Могу ли я перезапустить службу с помощью ManagementObject? - person novicegis; 23.08.2013
comment
Да, если вы хотите использовать ManagementObject, вам просто нужно передать StartService в InvokeMethod. - person chris.house.00; 23.08.2013
comment
Когда я использую ServiceController, у меня возникает исключение. Не удается открыть диспетчер управления службами на компьютере «MAPSERVER». Для этой операции могут потребоваться другие привилегии - person novicegis; 23.08.2013

Сервисный контроллер у меня не работал, поэтому я использовал для этого Cmd.

Process.Start("CMD.exe", "/C sc \\\\remoteMachine stop \"serviceName\"&sc \\\\remoteMachine start \"serviceName\"");

Чтобы преодолеть проблему с учетными данными, я использовал класс из этого ответа https://stackoverflow.com/a/5433640/2179222.

Итак, в итоге это выглядело так:

    private static void RestartService(string remoteMachine, string serviceName, string userName, string password)
    {
        using (new NetworkConnection($"\\\\{remoteMachine}", new NetworkCredential(userName, password)))
        {
            Process.Start("CMD.exe", $"/C sc \\\\{remoteMachine} stop \"{serviceName}\"&sc \\\\{remoteMachine} start \"{serviceName}\"");
        }
    }
person Eduard Grinberg    schedule 12.12.2019
comment
Может ли remoteMachine быть IP-адресом? - person Si8; 01.12.2020
comment
Да, у меня это сработало и с IP-адресом. - person Eduard Grinberg; 22.12.2020

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

person Piyush Shrivastava    schedule 08.01.2016