Bagaimana cara menambahkan ketergantungan pada Layanan Windows SETELAH layanan diinstal

133

Saya memiliki Layanan Windows yang menggunakan database SQL Server. Saya tidak memiliki kontrol atas instalasi layanan, tetapi ingin menambahkan ketergantungan pada layanan untuk memastikan bahwa itu dimulai setelah SQL server dimulai. (SQL server berjalan pada mesin yang sama dengan layanan yang dimaksud)

Apakah ada alat untuk menambah ketergantungan atau mungkin mengedit registri secara langsung?

Rick
sumber

Jawaban:

199

Ini juga dapat dilakukan melalui prompt perintah yang ditinggikan menggunakan scperintah. Sintaksnya adalah:

sc config [service name] depend= <Dependencies(separated by / (forward slash))>

Catatan : Ada ruang setelah tanda sama dengan, dan ada tidak satu sebelum.

Peringatan : depend=parameter akan menimpa daftar dependensi yang ada, bukan menambahkan. Jadi misalnya, jika ServiceA sudah tergantung pada ServiceB dan ServiceC, jika Anda menjalankan depend= ServiceD, ServiceA sekarang hanya akan bergantung pada ServiceD. (Terima kasih, Matt !)

Contohnya

Ketergantungan pada satu layanan lain:

sc config ServiceA depend= ServiceB

Di atas berarti bahwa ServiceA tidak akan mulai sampai ServiceB telah dimulai. Jika Anda menghentikan ServiceB, ServiceA akan berhenti secara otomatis.

Ketergantungan pada beberapa layanan lain:

sc config ServiceA depend= ServiceB/ServiceC/ServiceD/"Service Name With Spaces"

Di atas berarti bahwa ServiceA tidak akan mulai sampai ServiceB, ServiceC, dan ServiceD semuanya dimulai. Jika Anda menghentikan ServiceB, ServiceC, atau ServiceD, ServiceA akan berhenti secara otomatis.

Untuk menghapus semua dependensi:

sc config ServiceA depend= /

Untuk daftar dependensi saat ini:

sc qc ServiceA
Tidur
sumber
5
Jika Anda ingin melihat dependensi yang ada sebelum mengubahnya dengan metode Kip, Anda dapat mengetik sc qc YourServiceName
mivk
1
Berhati-hatilah ... Saya hanya menggunakan ini dan tidak menyadari bahwa itu akan menimpa dependensi yang ada .. ada dua untuk layanan saya yang saya tidak ingat .. sekarang mereka hilang .. oh well! Jadi pastikan Anda menjalankan perintah @mivk yang disebutkan pertama kali untuk melihat dependensi lainnya terlebih dahulu.
Matt
1
Anda dapat meminta ketergantungan yang saat ini dikonfigurasi untuk layanan dengan menggunakan sc qc [service name]perintah
gerrytan
4
Jika seperti saya, Layanan Anda memiliki spasi dalam nama, lampirkan dalam tanda kutip.
Lazlow
6
Jika menggunakan powershell, pastikan Anda menggunakan yang sc.exelain Anda akan mendapatkan kesalahan: 'Parameter posisi tidak dapat ditemukan yang menerima argumen'
spuder
42

Anda dapat menambahkan dependensi layanan dengan menambahkan nilai "DependOnService" ke layanan di registri menggunakan regeditperintah, layanan dapat ditemukan di bawah HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Rinciannya dapat ditemukan di artikel MS KB 193888 , dari mana ini adalah kutipan dari:

Untuk membuat ketergantungan baru, pilih subkunci yang mewakili layanan yang ingin Anda tunda, klik Edit, lalu klik Tambahkan Nilai. Buat nama nilai baru "DependOnService" (tanpa tanda kutip) dengan tipe data REG_MULTI_SZ, lalu klik OK. Ketika kotak dialog Data muncul, ketikkan nama atau nama layanan yang Anda inginkan untuk memulai sebelum layanan ini dengan satu entri untuk setiap baris, dan kemudian klik OK.

pauska
sumber
7
Astaga! Itu adalah jawaban tercepat yang pernah saya terima. Saya baru saja kembali ke halaman utama.
Rick
2

Saya sedang mencari metode murni PowerShell (tanpa regedit atau sc.exe) yang dapat bekerja pada 2008R2 / Win7 dan yang lebih baru, dan muncul dengan ini:

Yang mudah adalah lakukan regedit dengan PowerShell:

Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation' -Name DependOnService -Value @('Bowser','MRxSmb20','NSI')

Atau, menggunakan 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)

The Perubahan metode kelas Win32_Service membantu titik untuk solusi:

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[]
);
JoeGasper
sumber
1

Saya menulis aplikasi .net sederhana untuk mengelola dependensi layanan, jika Anda tertarik. Gratis.

http://webpages.charter.net/bushman4/servicedependencymanager.html

Glenn Sullivan
sumber
1
Ia memberi tahu saya bahwa saya perlu. NET 1.1 tetapi saya menjalankan windows 7
Nick
1
.Net 1.1 perlu diinstal pada Windows 7. Lihat jawaban untuk pertanyaan ini: answer.microsoft.com/en-us/windows/forum/…
Glenn Sullivan
9
Sungguh, pada tahun 2014 Anda merekomendasikan untuk menginstal .NET 1.1 pada Win7 daripada hanya mengkompilasi ulang untuk 4.0? Terima kasih tidak
Endrju
0

Dalam C ++ (ATL) saya suka ini

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;
}
Anders
sumber