Как передать параметр службе 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]()