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

У нас есть приложение Windows Service, которое может принимать параметры командной строки, такие как:

MyService -option 

До тех пор, когда мы хотим запустить службу с параметром, мы либо делаем это вручную из диалогового окна "Свойства службы" (в поле "Параметры запуска" ), либо с помощью команды

sc start MyService -option  

Что нам нужно - это способ установить службу "навсегда" с помощью этого параметра, чтобы пользователи просто должны были запускать/останавливать его, не устанавливая параметр каждый время.

Кстати, добавление параметра в запись реестра ImagePath не работает, и установка не выполняется так:

MyService -option /install

Обновлено. Спасибо за ответы, которые помогают мне уточнить вопрос.
То, что я хотел бы достичь, - установить параметр на уровне самого уровня службы (например, со свойствами), если в одном и том же исполняемом файле имеется более одной службы. Параметр binpath config просто обновляет запись ImagePath в реестре. Это не может быть специфичным для службы.

Ответы

Ответ 1

sc config MyService binPath= MyService.exe -option

Обновление

Индивидуальные параметры обслуживания хранятся в реестре с ключом HKLM\SYSTEM\CurrentControlSet\Services\<serviceName>\Parameters. Я не уверен, что как параметры передаются службе. Я считаю, что SCM считывает эти значения, затем, когда он вызывает StartService, он передает их в ServiceMain.

Ответ 2

Как добавить параметр в файл конфигурации?

Ответ 3

В соответствии с документацией ServiceBase.OnStart:

Аргументы, введенные в консоли, не сохраняются; они передаются в службу единовременно, когда служба запускается с панели управления. Аргументы, которые должны присутствовать при запуске службы, могут быть помещены в строковое значение ImagePath для ключа реестра службы (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \). Вы можете получить аргументы из реестра с помощью метода GetCommandLineArgs, например: string [] imagePathArgs = Environment.GetCommandLineArgs();.

Ответ 4

Аргументы, переданные в командной строке через ImagePath, доступны в main() или через GetCommandLine(). Вы можете установить с помощью команд командной строки, а затем в свой ServiceMain, проверить, были ли какие-либо аргументы переданы в параметре lpszArgs. Если нет, вызовите GetCommandLine и посмотрите, были ли переданы какие-либо пути.

Ответ 5

Powershell может это сделать, но вы должны использовать .NET для его достижения.

new-Object System.ServiceProcess.ServiceController("$ServiceName",$ComputerName)).Start("$Parameter")

Ответ 6

Если существует несколько сервисов с одним и тем же исполняемым файлом, вы должны установить их с разными именами служб. Вы можете ссылаться на имя службы вместо параметров.

Чтобы получить имя службы, вы можете использовать это Как служба Windows может определить свое имя службы?

Ответ 7

Используйте команду SC (service control), она дает вам больше возможностей, чем просто запуск и остановка.

DESCRIPTION:
          SC is a command line program used for communicating with the
          NT Service Controller and services.
  USAGE:
      sc <server> [command] [service name]  ...

      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 (persistent).
        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
  EXAMPLE:
          sc start MyService

Ответ 8

Если вы хотите передать параметры, когда ваш сервис запускается автоматически, это может помочь: fooobar.com/questions/32218/...

Ответ 9

Если у вас есть самоустанавливающаяся служба с ее исходным кодом (здесь подразумевается C++), вы можете передавать параметры командной строки во время создания экземпляра службы:

CreateService(
               schSCManager,                   // SCManager database
               pszServiceName,                 // Name of service
               pszDisplayName,                 // Name to display
               SERVICE_ALL_ACCESS,             // Desired access
               SERVICE_WIN32_OWN_PROCESS,      // Service type
               dwStartType,                    // Service start type
               SERVICE_ERROR_NORMAL,           // Error control type
               wszFullCommand,                 // Service command with parameters
               NULL,                           // No load ordering group
               NULL,                           // No tag identifier
               pszDependencies,                // Dependencies
               pszAccount,                     // Service running account
               pszPassword                     // Password of the account
            );

где wszFullCommand может быть построен следующим образом:

if (GetModuleFileName(NULL, wszPath, _countof(wszPath)) == 0)
{
  throw std::exception("Failed to obtain service path.");
}
else
{
  // Assemble full service command
  _snwprintf_s(wszFullCommand, _countof(wszFullCommand), _countof(wszFullCommand) - 1, L"\"%s\" %s", wszPath, wszParams);
}

здесь wszParams - это командная строка со всеми параметрами.

Если исполняемый файл службы находится в C:\Program Files\my-service\my-service.exe и значение wszParams равно -foo bar -baz 33, служба будет установлена для запуска в качестве:

Панель "C:\Program Files\my-service\my-sevice.exe" -foo -baz 33

Ответ 10

Единственное, что мне помогло, - это добавить параметр в ImagePath в реестре, как показано ниже: enter image description here