У меня есть служба Windows, которая использует базу данных SQL Server. У меня нет контроля над установкой службы, но я хотел бы добавить зависимость от службы, чтобы гарантировать ее запуск после запуска SQL-сервера. (SQL-сервер работает на том же компьютере, что и рассматриваемая служба)
Есть ли инструмент для добавления зависимости или, возможно, редактирования реестра напрямую?
Это также можно сделать через командную строку с повышенными привилегиями, используя sc
команда. Синтаксис:
sc config [service name] depend= <Dependencies(separated by / (forward slash))>
Заметка: Есть место после знак равенства, и есть не один перед этим.
Предупреждение: depend=
параметр будет перезаписывать список существующих зависимостей, а не добавление. Так, например, если ServiceA уже зависит от ServiceB и ServiceC, если вы запустите depend= ServiceD
, ServiceA теперь будет зависеть только на ServiceD. (Спасибо Мэтт!)
sc config ServiceA depend= ServiceB
Выше означает, что ServiceA не запустится, пока ServiceB не запустится. Если вы остановите ServiceB, ServiceA остановится автоматически.
sc config ServiceA depend= ServiceB/ServiceC/ServiceD/"Service Name With Spaces"
Вышеуказанное означает, что ServiceA не запустится, пока не будут запущены ServiceB, ServiceC и ServiceD. Если вы остановите любой из ServiceB, ServiceC или ServiceD, ServiceA остановится автоматически.
sc config ServiceA depend= /
sc qc ServiceA
Вы можете добавить зависимости службы, добавив значение «DependOnService» в службу в реестре с помощью параметра regedit
команда, услуги можно найти в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>
. Подробности можно найти на сайте MS KB статья 193888, из которого ниже приводится выдержка из:
Чтобы создать новую зависимость, выберите подраздел, представляющий службу, которую вы хотите отложить, нажмите «Изменить», а затем нажмите «Добавить значение». Создайте новое имя значения «DependOnService» (без кавычек) с типом данных REG_MULTI_SZ, а затем нажмите OK. Когда появится диалоговое окно «Данные», введите имя или имена служб, которые вы предпочитаете запускать перед этой службой, с одной записью для каждой строки, а затем нажмите «ОК».
Я искал чисто PowerShell (без regedit или sc.exe) метод, который может работать на 2008R2 / Win7 и новее, и пришел к следующему:
Самый простой - выполнить regedit с помощью PowerShell:
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation' -Name DependOnService -Value @('Bowser','MRxSmb20','NSI')
Или, используя WMI:
$DependsOn = @('Bowser','MRxSmb20','NSI','') #keep the empty array element at end
$svc = Get-WmiObject win32_Service -filter "Name='LanmanWorkstation'"
$svc.Change($null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$DependsOn)
В + Изменить Метод класса Win32_Service помог указать решение:
uint32 Change(
[in] string DisplayName,
[in] string PathName,
[in] uint32 ServiceType,
[in] uint32 ErrorControl,
[in] string StartMode,
[in] boolean DesktopInteract,
[in] string StartName,
[in] string StartPassword,
[in] string LoadOrderGroup,
[in] string LoadOrderGroupDependencies[],
[in] string ServiceDependencies[]
);
Я написал простое приложение .net для управления зависимостями служб, если вам интересно. Это бесплатно.
http://webpages.charter.net/bushman4/servicedependencymanager.html
В C ++ (ATL) мне понравилось это
bool ModifyDependOnService(void)
{
CRegKey R;
if (ERROR_SUCCESS == R.Open(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\services\\MyService"))
{
bool depIsThere = false;
// determine if otherservice is installed, if yes, then add to dependency list.
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
if (hSCManager)
{
SC_HANDLE hService = OpenService(hSCManager, L"OtherService", SERVICE_QUERY_STATUS);
if (hService)
{
depIsThere = true;
CloseServiceHandle(hService);
}
CloseServiceHandle(hSCManager);
}
std::wstring key = L"DependOnService";
if (depIsThere )
{
const wchar_t deps[] = L"RPCSS\0OtherService\0";
R.SetValue(key.c_str(), REG_MULTI_SZ, deps, sizeof(deps));
}
R.Close();
return true;
}
return false;
}