Пакетный сценарий для установки или удаления службы .NET Windows

У меня нет опыта написания пакетных сценариев, но мне было интересно, есть ли способ установить службу .NET Windows с installutil.exe использованием такого сценария или удалить службу, если она уже установлена, в идеале с каким-то подтверждением, что я бы действительно как выполнить удаление (например, нажмите y, чтобы удалить).

Вот некоторые подробности:

  • .Exe для службы находится в C:\Program Files\Data Serviceкаталоге
  • Скрипт должен находиться в том же каталоге, что и .exe для службы.
  • Было бы неплохо добавить простую строку в файл журнала (мы назовем его program.logтакже в этом каталоге) после установки службы
  • Машина работает под управлением Windows Server 2003 с .NET Framework, установленной в каталоге по умолчанию. C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

Если вы считаете, что это можно сделать лучше, было бы неплохо услышать другие предложения. Я всегда мог написать установщик службы, но это не является приоритетом.

Ответов (10)

Решение

Вы можете настроить свой служебный exe для поддержки саморегистрации / отмены регистрации с использованием аргументов командной строки (-i -u и т. Д.) Вместо того, чтобы писать командный файл, чтобы сделать то же самое.

Информация о создании самоустанавливающихся служб в .NET

http://anotherlab.rajapet.net/2006/06/self-installing-services-in-net.html

http://www.gotnet.biz/WindowsServiceSelfInstaller.ashx

Кроме того, добавление проекта установки в решение и создание установочного пакета Visual Studio может быть быстрее.

Как создать проект установки для службы Windows в Visual Basic .NET или Visual Basic 2005

(VB) http://support.microsoft.com/kb/317421

(C#) http://support.microsoft.com/kb/816169

создайте файл с расширением .bat и поместите его в файл

installutil -uc: \ YourServiceLocation \ Service.exe

Я сделал это с помощью старомодного командного файла ....

Скопируйте installutil.exe в тот же каталог, что и ваш исполняемый файл (для упрощения работы). Ниже приведен общий пример содержимого необходимого командного файла: (у меня были просто имена instal.bat)


installutil MyService.exe 
sc config MyService type= interact type= own
sc failure MyService reset= 6000  actions= restart/5000/restart/5000/restart/5000
sc start MyService 

Дополнительные сведения о параметрах командной строки для installutil.exe см. Здесь .

Чтобы удалить службу, используйте другой командный файл со следующим содержимым:


installutil MyService.exe /u

@echo off

SET PROG="c:\YourServiceLocation\Service.exe" SET FIRSTPART=%WINDIR%"\Microsoft.NET\Framework\v" SET SECONDPART="\InstallUtil.exe" SET DOTNETVER=4.0.30319 IF EXIST %FIRSTPART%%DOTNETVER%%SECONDPART% GOTO install

GOTO fail :install ECHO Found .NET Framework version %DOTNETVER% ECHO Installing service %PROG% %FIRSTPART%%DOTNETVER%%SECONDPART% %PROG% GOTO end :fail echo FAILURE -- Could not find .NET Framework install :param_error echo USAGE: installNETservie.bat [install type (I or U)] [application (.exe)] :end ECHO DONE!!! Pause

запустите этот bat-файл от имени администратора

Я обнаружил, что всегда лучше использовать хороший проект установки, чем использовать пакетные файлы для установки приложения. Однако бывают случаи, когда это невозможно. Несколько работающих проектов были написаны еще во времена Windows NT и ранних версий Windows XP, и для установки использовались простые командные файлы. В то время преобразование командного файла в упакованный для установки представляет собой больше проблем, чем простая настройка. Путем тщательного поиска я обнаружил, что http://ss64.com/nt/ - очень хорошая ссылка на пакетный файл Windows. (При всем нашем прогрессе в области программных технологий мне кажется странным писать это последнее предложение.)

В любом случае, удачного кодирования! - вне зависимости от «языка».

Это командные файлы, которые я использовал для установки.

@ECHO OFF

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

echo Installing MyService...
echo ---------------------------------------------------
InstallUtil /i MyService.exe
echo ---------------------------------------------------
echo Done.
pause

Для удаления я использовал следующее:

@ECHO OFF

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

echo Uninstalling MyService...
echo ---------------------------------------------------
InstallUtil /u MyService.exe
echo ---------------------------------------------------
echo Done

Я не уверен, зачем вам нужен командный файл для однострочника. это то, что я бы использовал.

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ InstallUtil.exe / i ServiceAssembly.dll

Предложения:

  • Используйте среду, Windows не может быть установлена ​​на C :. Но вы можете использовать% WinDir%.
  • Вы можете перенаправить эхо для добавления в файл:

    эхо Сообщение >> logfile.txt

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

  • Нет постоянного места для документации. Но справка (из командной строки) по «cmd», «if», «for», «set» и «call» охватывает большую часть доступного синтаксиса.
  • Отключите эхо в начале, чтобы видеть команды по мере их выполнения.

Это тот, который я использую. Нашел и пользуюсь. Спасибо создателю ..

@echo off

SET PROG="YourServiceHere.exe"
SET FIRSTPART=%WINDIR%"\Microsoft.NET\Framework\v"
SET SECONDPART="\InstallUtil.exe"
SET DOTNETVER=2.0.50727
  IF EXIST %FIRSTPART%%DOTNETVER%%SECONDPART% GOTO install
SET DOTNETVER=1.1.4322
  IF EXIST %FIRSTPART%%DOTNETVER%%SECONDPART% GOTO install
SET DOTNETVER=1.0.3705
  IF EXIST %FIRSTPART%%DOTNETVER%%SECONDPART% GOTO install
GOTO fail
:install
  ECHO Found .NET Framework version %DOTNETVER%
  ECHO Installing service %PROG%
  %FIRSTPART%%DOTNETVER%%SECONDPART% %PROG%
  GOTO end
:fail
  echo FAILURE -- Could not find .NET Framework install
:param_error
  echo USAGE: installNETservie.bat [install type (I or U)] [application (.exe)]
:end
  ECHO DONE!!!
  Pause

Проще просто сделать самоустанавливающиеся сервисы. После того, как вы это реализуете, вы можете либо запустить службу exe напрямую с помощью переключателя (/ i или / u), либо обернуть вызов в пакетный файл, если хотите.

static void Main(string[] args)
{
    if (args.Length > 0)
    {
        //Install service
        if (args[0].Trim().ToLower() == "/i")
        { System.Configuration.Install.ManagedInstallerClass.InstallHelper(new string[] { "/i", Assembly.GetExecutingAssembly().Location }); }

        //Uninstall service                 
        else if (args[0].Trim().ToLower() == "/u")
        { System.Configuration.Install.ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location }); }
    }
    else
    {
        System.ServiceProcess.ServiceBase[] ServicesToRun;
        ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyService() };
        System.ServiceProcess.ServiceBase.Run(ServicesToRun);
    }
}