pengembangan-web-mp-pd.com

Bagaimana 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 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?

135
Rick

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

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

Catatan : Ada spasi setelah tanda sama dengan, dan ada bukan = satu sebelumnya.

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 akan bergantung pada satunya 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
203
Kip

Anda dapat menambahkan dependensi layanan dengan menambahkan nilai "DependOnService" ke layanan di registri menggunakan perintah regedit, layanan dapat ditemukan di bawah HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Detailnya dapat ditemukan di artikel MS KB 193888 , dari mana kutipan berikut adalah 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.

42
pauska

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)

Metode Change dari 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[]
);
2
JoeGasper

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

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

1
Glenn Sullivan

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;
}
0
AndersK