2013-09-30 6 views
2

Нам нужно дистанционно управлять службой Windows с помощью приложения .net. Пример: у нас есть 10 служб Windows на разных сервисах. Теперь я хочу создать приложение (я думаю, это также служба Windows), чтобы запустить и остановить эти службы удаленно, а также установить или удалить их через командную строку.Управление службой Windows

Первое, что нужно для сбора этих имен услуг. Затем, используя цикл, или if/else, я думаю. До этого я хочу убедиться, что все службы установлены. Я не хочу обращаться к диспетчеру службы для установки сервисов, я хочу реализовать его в коде. У меня откуда-то появился намек, но я точно не знаю.

ServiceInstaller.InstallService("\"" + _applicationPath + "\\" + _applicationName + ".exe\" -service", _applicationName, _applicationName, autoInstall, autoRun); 
internal static bool InstallService(string svcPath, string svcName, string svcDispName, bool autoStart, bool startNow) 
    { 
     #region Constants declaration. 
     int SC_MANAGER_CREATE_SERVICE = 0x0002; 
     int SERVICE_WIN32_OWN_PROCESS = 0x00000010; 
     int SERVICE_DEMAND_START = 0x00000003; 
     int SERVICE_ERROR_NORMAL = 0x00000001; 
     int STANDARD_RIGHTS_REQUIRED = 0xF0000; 
     int SERVICE_QUERY_CONFIG = 0x0001; 
     int SERVICE_CHANGE_CONFIG = 0x0002; 
     int SERVICE_QUERY_STATUS = 0x0004; 
     int SERVICE_ENUMERATE_DEPENDENTS = 0x0008; 
     int SERVICE_START = 0x0010; 
     int SERVICE_STOP = 0x0020; 
     int SERVICE_PAUSE_CONTINUE = 0x0040; 
     int SERVICE_INTERROGATE = 0x0080; 
     int SERVICE_USER_DEFINED_CONTROL = 0x0100; 
     int SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | 
     SERVICE_QUERY_CONFIG | 
     SERVICE_CHANGE_CONFIG | 
     SERVICE_QUERY_STATUS | 
     SERVICE_ENUMERATE_DEPENDENTS | 
     SERVICE_START | 
     SERVICE_STOP | 
     SERVICE_PAUSE_CONTINUE | 
     SERVICE_INTERROGATE | 
     SERVICE_USER_DEFINED_CONTROL); 
     int SERVICE_AUTO_START = 0x00000002; 
     #endregion Constants declaration. 

     try 
     { 
      int dwStartType = SERVICE_AUTO_START; 
      if (autoStart == false) dwStartType = SERVICE_DEMAND_START; 

      IntPtr sc_handle = OpenSCManager(null, null, SC_MANAGER_CREATE_SERVICE); 
      if (sc_handle.ToInt32() != 0) 
      { 
       IntPtr sv_handle = CreateService(sc_handle, svcName, svcDispName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, dwStartType, SERVICE_ERROR_NORMAL, svcPath, null, 0, null, null, null); 
       if (sv_handle.ToInt32() == 0) 
       { 
        CloseServiceHandle(sc_handle); 
        return false; 
       } 
       else 

Мои вопросы:

1) Как собирать услуги?

2) Как начать/остановить услуги?

3) Установите служебный код, нет подсказки.

ответ

1

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

  1. Получить все услуги на удаленном компьютере:

    var services = ServiceController.GetServices(machineName); 
    
  2. Для запуска и остановок конкретной службы на удаленном компьютере, вы можете использовать LINQ, чтобы получить конкретную услугу из списка извлеченного выше:

    var services = ServiceController.GetServices(machineName); 
    var service = services.First(s => s.ServiceName == "MyServiceName"); 
    service.Start(); 
    ... 
    service.Stop(); 
    

    Другой вариант, чтобы получить конкретную услугу на конкретной машине:

    var service = new ServiceController("MyServiceName", machineName); 
    
  3. Для установки новой услуги у вас есть несколько вариантов. Если вы пишете свои собственные службы в .NET, вы можете создать пакет MSI с помощью WiX. Вы также можете использовать класс ServiceInstaller с InstallUtil.exe или без него, или вы можете установить любой сервис даже удаленно, используя SC.exe.

    Однако для установки службы удаленно вы по-прежнему должны размещать исполняемый файл службы локально на удаленном компьютере. Поэтому установка службы удаленно действительно включает в себя получение услуги на удаленном компьютере, а затем запуск некоторого процесса для выполнения фактической установки, которая создаст правильные записи в базе данных реестра. Вам нужно будет решить, хотите ли вы использовать общие ресурсы файлов, WMI, удаленную PowerShell или, возможно, Active Directory для распространения программного обеспечения.

0

Возможно, использование команды net из оболочки - это путь? Он может перечислить, запустить, остановить службы и т. Д. Вы будете чувствовать себя немного «грязными», если будете использовать его, но, черт возьми, это сработает.

How do I restart a service on a remote machine in Windows?

да, я бы рекомендовал обертывание, что при простое приложение веб-службы.

Также читать: Simplest way to restart service on a remote computer

+0

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

0

насчет ServiceController класса?

http://msdn.microsoft.com/library/system.serviceprocess.servicecontroller.aspx

Если служба не установлена ​​ServiceController.Status выбросит InvalidOperationException

ServiceController.GetServices() поможет вам перечень услуг. Он может работать на удаленных компьютерах тоже, но код должен иметь правильные разрешения

Существует также это (ВСД, может быть?): http://www.codeproject.com/Articles/4242/Command-Line-Windows-Services-Manager

В Windows Installutil.exe можно использовать для установки/удаления услуг. Но вы должны использовать правильную версию: их может быть несколько, в зависимости от версии и системы .NET (x64, x32). На собственной машине (я не знаю об удаленных машинах) правильный путь:

string path = Path.Combine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(), "InstallUtil.exe"); 

Вы можете выполнить процесс на другом компьютере с помощью PsExec или WMI

EDIT:

.bat для установки службы на вашей собственной машине (x64 версия installutil устанавливает версию версии x64):

@ECHO OFF 

REM The following directory is for .NET 2.0 
set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework64\v2.0.50727 
set PATH=%PATH%;%DOTNETFX2% 

echo Installing WindowsService... 
echo --------------------------------------------------- 
InstallUtil /i "service path goes here" 
echo --------------------------------------------------- 
echo Done. 
+0

Значит, сам менеджер - это служба Windows или общий класс? –

+0

@ Если вы говорите о записи codeproject, я думаю, что это консольное приложение. InstallUtil.exe также является консольным приложением. Вы идете: «installutil -i [servicepath]», чтобы установить службу и использовать параметр -u для удаления – Arie

Смежные вопросы