Функция ChangeServiceConfigA (winsvc.h)

Изменяет параметры конфигурации службы.

Чтобы изменить необязательные параметры конфигурации, используйте функцию ChangeServiceConfig2 .

Синтаксис

BOOL ChangeServiceConfigA(
  [in]            SC_HANDLE hService,
  [in]            DWORD     dwServiceType,
  [in]            DWORD     dwStartType,
  [in]            DWORD     dwErrorControl,
  [in, optional]  LPCSTR    lpBinaryPathName,
  [in, optional]  LPCSTR    lpLoadOrderGroup,
  [out, optional] LPDWORD   lpdwTagId,
  [in, optional]  LPCSTR    lpDependencies,
  [in, optional]  LPCSTR    lpServiceStartName,
  [in, optional]  LPCSTR    lpPassword,
  [in, optional]  LPCSTR    lpDisplayName
);

Параметры

[in] hService

Дескриптор службы. Этот дескриптор возвращается функцией OpenService или CreateService и должен иметь право доступа SERVICE_CHANGE_CONFIG . Дополнительные сведения см. в разделе Безопасность службы и права доступа.

[in] dwServiceType

Тип службы. Укажите SERVICE_NO_CHANGE , если существующий тип службы не изменяется; В противном случае укажите один из следующих типов служб.

Значение Значение
SERVICE_FILE_SYSTEM_DRIVER
0x00000002
Служба драйверов файловой системы.
SERVICE_KERNEL_DRIVER
0x00000001
Служба драйверов.
SERVICE_WIN32_OWN_PROCESS
0x00000010
Служба, которая выполняется в собственном процессе.
SERVICE_WIN32_SHARE_PROCESS
0x00000020
Служба, которая совместно использует процесс с другими службами.
 

Если вы указываете SERVICE_WIN32_OWN_PROCESS или SERVICE_WIN32_SHARE_PROCESS, а служба выполняется в контексте учетной записи LocalSystem, можно также указать следующий тип.

Значение Значение
SERVICE_INTERACTIVE_PROCESS
0x00000100
Служба может взаимодействовать с рабочим столом.

Дополнительные сведения см. в разделе Интерактивные службы.

[in] dwStartType

Параметры запуска службы. Укажите SERVICE_NO_CHANGE , если существующий тип запуска не изменяется; В противном случае укажите одно из следующих значений.

Значение Значение
SERVICE_AUTO_START
0x00000002
Служба автоматически запускается диспетчером управления службами во время запуска системы.
SERVICE_BOOT_START
0x00000000
Драйвер устройства, запущенный системным загрузчиком. Это значение допустимо только для служб драйверов.
SERVICE_DEMAND_START
0x00000003
Служба, запущенная диспетчером управления службами, когда процесс вызывает функцию StartService .
SERVICE_DISABLED
0x00000004
Служба, которая не может быть запущена. Попытки запустить службу приводят к ERROR_SERVICE_DISABLED кода ошибки.
SERVICE_SYSTEM_START
0x00000001
Драйвер устройства, запущенный функцией IoInitSystem . Это значение допустимо только для служб драйверов.

[in] dwErrorControl

Серьезность ошибки и выполняемое действие, если эта служба не запускается. Укажите SERVICE_NO_CHANGE , если существующий элемент управления ошибками не изменяется; В противном случае укажите одно из следующих значений.

Значение Значение
SERVICE_ERROR_CRITICAL
0x00000003
Программа запуска регистрирует ошибку в журнале событий, если это возможно. Если запускается последняя известная конфигурация, операция запуска завершается сбоем. В противном случае система перезапускается с последней известной хорошей конфигурацией.
SERVICE_ERROR_IGNORE
0x00000000
Программа запуска игнорирует ошибку и продолжает операцию запуска.
SERVICE_ERROR_NORMAL
0x00000001
Программа запуска записывает ошибку в журнал событий, но продолжает операцию запуска.
SERVICE_ERROR_SEVERE
0x00000002
Программа запуска регистрирует ошибку в журнале событий. Если запускается последняя известная конфигурация, операция запуска продолжается. В противном случае система перезапускается с последней известной хорошей конфигурацией.

[in, optional] lpBinaryPathName

Полный путь к двоичному файлу службы. Если существующий путь не изменяется, укажите ЗНАЧЕНИЕ NULL. Если путь содержит пробел, он должен быть заключен в кавычки, чтобы он правильно интерпретировался. Например, "d:\my share\myservice.exe" следует указать как ""d:\my share\myservice.exe"".

Путь также может содержать аргументы для службы автоматического запуска. Например, "d:\myshare\myservice.exe arg1 arg2". Эти аргументы передаются в точку входа службы (обычно это функция main).

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

[in, optional] lpLoadOrderGroup

Имя группы упорядочения нагрузки, членом которой является эта служба. Если вы не изменяете существующую группу, укажите ЗНАЧЕНИЕ NULL. Укажите пустую строку, если служба не принадлежит группе.

Программа запуска использует группы упорядочения загрузки для загрузки групп служб в указанном порядке по отношению к другим группам. Список групп упорядочения нагрузки содержится в значении ServiceGroupOrder следующего раздела реестра:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

[out, optional] lpdwTagId

Указатель на переменную, получающую значение тега, уникальное в группе, указанной в параметре lpLoadOrderGroup . Если существующий тег не изменяется, укажите ЗНАЧЕНИЕ NULL.

Вы можете использовать тег для запуска службы заказов в группе упорядочения нагрузки, указав вектор порядка тегов в значении GroupOrderList следующего раздела реестра:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

Теги оцениваются только для служб драйверов, которые имеют SERVICE_BOOT_START или SERVICE_SYSTEM_START типы запуска.

[in, optional] lpDependencies

Указатель на массив имен служб, разделенных значениями NULL, или групп упорядочения загрузки, которые система должна запустить перед запуском этой службы. (Зависимость от группы означает, что эта служба может запускаться, если хотя бы один член группы работает после попытки запустить всех участников группы.) Если существующие зависимости не изменяются, укажите ЗНАЧЕНИЕ NULL. Укажите пустую строку, если у службы нет зависимостей.

Имена групп должны быть префиксированы с помощью SC_GROUP_IDENTIFIER, чтобы их можно было отличить от имени службы, так как службы и группы служб используют одно и то же пространство имен.

[in, optional] lpServiceStartName

Имя учетной записи, под которой должна выполняться служба. Укажите ЗНАЧЕНИЕ NULL , если вы не изменяете имя существующей учетной записи. Если служба имеет тип SERVICE_WIN32_OWN_PROCESS, используйте имя учетной записи в формате Имя_\пользователя домена. Процесс службы войдет в систему от имени этого пользователя. Если учетная запись принадлежит встроенному домену, можно указать .\UserName (обратите внимание, что соответствующая строка C/C++ — ".\\UserName"). Дополнительные сведения см. в разделах Учетные записи пользователей службы и предупреждение в разделе Примечания.

Общий процесс может выполняться от имени любого пользователя.

Если служба имеет тип SERVICE_KERNEL_DRIVER или SERVICE_FILE_SYSTEM_DRIVER, это имя объекта драйвера, которое система использует для загрузки драйвера устройства. Укажите значение NULL , если драйвер использует имя объекта по умолчанию, созданное системой ввода-вывода.

Службу можно настроить для использования управляемой учетной записи или виртуальной учетной записи. Если служба настроена для использования управляемой учетной записи службы, это имя управляемой учетной записи службы. Если служба настроена для использования виртуальной учетной записи, укажите имя NT SERVICE\ServiceName. Дополнительные сведения об управляемых учетных записях служб и виртуальных учетных записях см. в пошаговом руководстве по учетным записям служб.

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: Управляемые учетные записи служб и виртуальные учетные записи не поддерживаются до Windows 7 и Windows Server 2008 R2.

[in, optional] lpPassword

Пароль для имени учетной записи, указанной параметром lpServiceStartName . Если вы не изменяете существующий пароль, укажите ЗНАЧЕНИЕ NULL . Укажите пустую строку, если у учетной записи нет пароля или если служба выполняется в учетной записи LocalService, NetworkService или LocalSystem. Дополнительные сведения см. в разделе Список записей служб.

Если имя учетной записи, указанное параметром lpServiceStartName , является именем управляемой учетной записи службы или виртуальной учетной записи, параметр lpPassword должен иметь значение NULL.

Пароли для служб драйверов игнорируются.

[in, optional] lpDisplayName

Отображаемое имя, используемое приложениями для идентификации службы для пользователей. Укажите ЗНАЧЕНИЕ NULL , если вы не изменяете существующее отображаемое имя; В противном случае эта строка имеет максимальную длину 256 символов. Имя сохраняется с учетом регистра в диспетчере управления службами. Сравнение отображаемых имен всегда не учитывает регистр.

Этот параметр может указать локализованную строку в следующем формате:

@[path]dllname,-strID

Строка с идентификатором strID загружается из dllname; Путь является необязательным. Дополнительные сведения см. в разделе RegLoadMUIString.

Windows Server 2003 и Windows XP: Локализованные строки не поддерживаются до Windows Vista.

Возвращаемое значение

Если функция выполняется успешно, возвращается ненулевое значение.

Если функция выполняется неудачно, возвращается нулевое значение. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

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

Код возврата Описание
ERROR_ACCESS_DENIED
Дескриптор не имеет права доступа к SERVICE_CHANGE_CONFIG .
ERROR_CIRCULAR_DEPENDENCY
Указана циклическая зависимость службы.
ERROR_DUPLICATE_SERVICE_NAME
Отображаемое имя уже существует в базе данных диспетчера контроллеров служб в виде имени службы или другого отображаемого имени.
ERROR_INVALID_HANDLE
Указанный дескриптор недопустим.
ERROR_INVALID_PARAMETER
Указан недопустимый параметр.
ERROR_INVALID_SERVICE_ACCOUNT
Имя учетной записи не существует, или служба указана для совместного использования того же двоичного файла, что и уже установленная служба, но с именем учетной записи, которое не совпадает с именем установленной службы.
ERROR_SERVICE_MARKED_FOR_DELETE
Служба помечена для удаления.

Комментарии

Функция ChangeServiceConfig изменяет сведения о конфигурации указанной службы в базе данных диспетчера управления службами. Сведения о текущей конфигурации можно получить с помощью функции QueryServiceConfig .

При изменении конфигурации для запущенной службы, за исключением lpDisplayName, изменения не вступают в силу, пока служба не будет остановлена. Чтобы обновить учетные данные без перезапуска службы, используйте функцию LsaCallAuthenticationPackage .

Примечания по безопасности

Установка параметра lpServiceStartName изменяет учетную запись входа службы. Это может привести к проблемам. Если вы зарегистрировали имя субъекта-службы (SPN), оно будет зарегистрировано в неправильной учетной записи. Аналогичным образом, если вы использовали ACE для предоставления доступа к службе, он теперь предоставляет доступ к неправильной учетной записи.

Примеры

Пример см. в разделе Изменение конфигурации службы.

Требования

Требование Значение
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header winsvc.h (включая Windows.h)
Библиотека Advapi32.lib
DLL Advapi32.dll

См. также раздел

ChangeServiceConfig2

CreateService

OpenService

QueryServiceConfig

QueryServiceConfig2

QueryServiceDynamicInformation

Пошаговое руководство по использованию учетных записей служб

Конфигурация службы.

Функции службы

StartService