Pertanyaan Cara menambahkan ketergantungan pada Layanan Windows SETELAH layanan diinstal


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 server SQL dimulai. (SQL server berjalan pada mesin yang sama dengan layanan yang dimaksud)

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


117
2018-06-12 14:52






Jawaban:


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

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

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

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

Contoh

Ketergantungan pada satu layanan lain:

sc config ServiceA depend= ServiceB

Di atas berarti bahwa ServiceA tidak akan mulai sampai ServiceB 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

180
2018-01-28 21:59



Saya awalnya memilih jawaban yang menunjukkan cara mengedit registri. Tetapi menggunakan perintah SC lebih sesuai dengan apa yang saya cari. Terima kasih. - Rick
Jika Anda ingin melihat dependensi yang ada sebelum mengubahnya dengan metode Kip, Anda dapat mengetikkan sc qc YourServiceName - mivk
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 baik! Jadi pastikan Anda menjalankan perintah @mivk yang disebutkan terlebih dahulu untuk melihat dependensi lain terlebih dahulu. - Matt
Jika seperti saya, Layanan Anda memiliki spasi dalam nama, lampirkan dalam tanda kutip. - Lazlow
Jika menggunakan PowerShell, pastikan Anda menggunakannya sc.exe jika tidak, Anda akan mendapatkan kesalahan: 'Sebuah parameter posisi tidak dapat ditemukan yang menerima argumen' - spuder


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

Untuk membuat ketergantungan baru, pilih   subkunci mewakili layanan Anda   ingin menunda, klik Edit, lalu   klik Tambah Nilai. Buat nilai baru   nama "DependOnService" (tanpa   tanda kutip) dengan tipe data   REG_MULTI_SZ, lalu klik OK. Kapan   Kotak dialog Data muncul, ketik   nama atau nama layanan yang Anda   lebih memilih untuk memulai sebelum layanan ini   dengan satu entri untuk setiap baris, dan kemudian   klik OK.


41
2018-06-12 14:53



Astaga! Itu adalah jawaban tercepat yang pernah saya terima. Saya baru saja kembali ke halaman muka. - Rick
+1 Terima kasih, bekerja untuk saya. - Rich


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

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


1
2018-01-31 16:38



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


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

Yang mudah adalah melakukan 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)

Itu Perubahan metode kelas Win32_Service membantu menunjukkan 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[]
);

1
2018-02-13 03:40



Diuji; bekerja dengan baik. Terima kasih telah berbagi. - CJBS


Di C ++ (ATL) saya memang 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;
}

0
2017-08-02 06:58