как добавить зависимость от службы windows после установки службы

<p>у меня есть служба windows, которая использует базу данных sql server. у меня нет контроля над установкой службы, но я хотел бы добавить зависимость от службы, чтобы она запускалась после запуска sql-сервера. (sql-сервер работает на той же машине, что и рассматриваемая служба)</p><p>есть ли инструмент для добавления зависимости или, возможно, редактирования реестра напрямую?</p>

<p>это также можно сделать с помощью командной строки с повышенными привилегиями, используя команду <code>sc</code>. синтаксис:</p><pre><code>sc config [service name] depend= <dependencies(separated by / (forward slash))> </code></pre><p><strong> примечание </strong>: есть пробел <em> после</em> знак равенства, и есть <em> нет</em> = один до этого.</p><p><strong> предупреждение </strong>: <code>depend=</code> параметр будет <strong> перезаписывать </strong> существующий список зависимостей, а не добавлять. так, например, если servicea уже зависит от serviceb и servicec, если вы запускаете <code>depend= serviced</code>, servicea теперь будет зависеть <em> только</em> от serviced. (спасибо <a href="https://serverfault.com/users/37868/matt">мэтт</a> !)</p><h2>примеры</h2><h3>зависимость от еще одного сервиса:</h3><pre><code>sc config servicea depend= serviceb </code></pre><p>выше означает, что servicea не запустится, пока не запустится serviceb. если вы остановите serviceb, servicea остановится автоматически.</p><h3>зависимость от нескольких других сервисов:</h3><pre><code>sc config servicea depend= serviceb/servicec/serviced/"service name with spaces" </code></pre><p>выше означает, что servicea не запустится, пока не начнутся все serviceb, servicec и serviced. если вы остановите какой-либо из serviceb, servicec или serviced, servicea остановится автоматически.</p><h3>чтобы удалить все зависимости:</h3><pre><code>sc config servicea depend= / </code></pre><h3>чтобы отобразить текущие зависимости:</h3><pre><code>sc qc servicea </code></pre>

<p>вы можете добавить зависимости службы, добавив значение "dependonservice" к службе в реестре с помощью команды <code>regedit</code>, службы можно найти в <code>hkey\_local\_machine\system\currentcontrolset\services\<service name></code>. подробности можно найти по адресу <a href="http://support.microsoft.com/kb/193888">ms kb article, 193888</a> , откуда взято следующее:</p><blockquote> <p>чтобы создать новую зависимость, выберите подраздел, представляющий службу, которую вы хотите отложить, нажмите "изменить", а затем нажмите "добавить значение". создайте новое имя значения "dependonservice" (без кавычек) с типом данных reg\_multi\_sz и нажмите кнопку ок. когда появится диалоговое окно "данные", введите имя или имена служб, которые вы предпочитаете запускать перед этой службой, с одной записью для каждой строки, а затем нажмите кнопку "ок".</p> </blockquote>

<p>я искал чисто powershell (без regedit или sc.exe) метод, который может работать на 2008r2/win7 и новее, и придумал это:</p><p>легко сделать regedit с powershell:</p><pre><code>set-itemproperty -path 'hklm:\system\currentcontrolset\services\lanmanworkstation' -name dependonservice -value @('bowser','mrxsmb20','nsi') </code></pre><p>или, используя wmi:</p><pre><code>$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) </code></pre><p>метод <a href="https://msdn.microsoft.com/en-us/library/aa384901(v=vs.85).aspx">change</a> класса win32\_service помог указать на решение:</p><pre><code>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[] ); </code></pre>

<p>я написал простое приложение .net для управления служебными зависимостями, если вам интересно. это бесплатно.</p><p> <a href="http://webpages.charter.net/bushman4/servicedependencymanager.html">http://webpages.charter.net/bushman4/servicedependencymanager.html</a> </p>

<p>в c++ (atl) я так и сделал</p><pre><code>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; } </code></pre>