วิธีเพิ่มการพึ่งพาในบริการ Windows หลังจากติดตั้งบริการแล้ว


133

ฉันมีบริการ Windows ที่ใช้ฐานข้อมูล SQL Server ฉันไม่สามารถควบคุมการติดตั้งบริการได้ แต่ต้องการเพิ่มการพึ่งพาบริการเพื่อให้แน่ใจว่าจะเริ่มขึ้นหลังจากเซิร์ฟเวอร์ SQL เริ่มทำงาน (เซิร์ฟเวอร์ SQL กำลังทำงานบนเครื่องเดียวกันกับบริการที่มีปัญหา)

มีเครื่องมือในการเพิ่มการอ้างอิงหรืออาจแก้ไขรีจิสทรีโดยตรงหรือไม่

คำตอบ:


199

นอกจากนี้ยังสามารถทำได้ผ่านทางพร้อมท์คำสั่งโดยใช้scคำสั่ง ไวยากรณ์คือ:

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

หมายเหตุ : มีพื้นที่เป็นหลังจากที่เท่ากับและมีไม่หนึ่งก่อนที่มันจะ

คำเตือน : depend=พารามิเตอร์จะเขียนทับรายการการพึ่งพาที่มีอยู่ไม่ใช่ผนวก ดังนั้นสำหรับตัวอย่างเช่นถ้าServiceÃแล้วขึ้นอยู่กับ ServiceB และ ServiceC ถ้าคุณทำงานdepend= ServiceD, ServiceÃตอนนี้จะขึ้นอยู่เฉพาะใน Serviced (ขอบคุณMatt !)

ตัวอย่าง

การพึ่งพาบริการอื่น:

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

5
หากคุณต้องการที่จะเห็นการพึ่งพาที่มีอยู่ก่อนที่จะเปลี่ยนพวกเขาด้วยวิธีของ Kip คุณสามารถพิมพ์ sc qc YourServiceName
mivk

1
แค่ระวัง ... ฉันเพิ่งใช้มันและไม่ได้ตระหนักว่ามันจะเขียนทับการอ้างอิงที่มีอยู่เดิม .. มีสองบริการของฉันที่ฉันจำไม่ได้ .. ตอนนี้พวกเขาหายไป .. โอ้ดี! ดังนั้นให้แน่ใจว่าคุณเรียกใช้คำสั่ง @mivk ที่กล่าวถึงก่อนเพื่อดูการพึ่งพาอื่น ๆ ก่อน
Matt

1
คุณสามารถสอบถามการกำหนดค่าการพึ่งพาสำหรับบริการในปัจจุบันโดยใช้sc qc [service name]คำสั่ง
gerrytan

4
ถ้าอย่างฉันบริการของคุณมีช่องว่างในชื่อล้อมรอบด้วยเครื่องหมายคำพูด
Lazlow

6
หากใช้ PowerShell ตรวจสอบให้แน่ใจว่าคุณใช้sc.exeมิฉะนั้นคุณจะได้รับข้อผิดพลาด: 'ไม่พบพารามิเตอร์ตำแหน่งที่ยอมรับการโต้แย้ง'
spuder

42

คุณสามารถเพิ่มการพึ่งพาบริการโดยการเพิ่ม "DependOnService" ค่าบริการในรีจิสทรีโดยใช้คำสั่งบริการจะอยู่ภายใต้regedit HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>รายละเอียดสามารถดูได้ที่บทความ MS KB 193888ซึ่งเป็นข้อความที่ตัดตอนมาจาก:

หากต้องการสร้างการพึ่งพาใหม่ให้เลือกคีย์ย่อยที่แสดงถึงบริการที่คุณต้องการหน่วงเวลาคลิกแก้ไขแล้วคลิกเพิ่มมูลค่า สร้างชื่อค่าใหม่ "DependOnService" (โดยไม่ใส่เครื่องหมายอัญประกาศ) ด้วยชนิดข้อมูลของ REG_MULTI_SZ แล้วคลิกตกลง เมื่อกล่องโต้ตอบข้อมูลปรากฏขึ้นให้พิมพ์ชื่อหรือชื่อของบริการที่คุณต้องการเริ่มก่อนบริการนี้ด้วยหนึ่งรายการสำหรับแต่ละบรรทัดแล้วคลิกตกลง


7
Holy Cow! นั่นคือคำตอบที่เร็วที่สุดที่ฉันเคยได้รับ ฉันเพิ่งกลับไปที่หน้าแรก
Rick

2

ฉันกำลังมองหาวิธี 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[]
);

1

ฉันเขียนแอปพลิเคชั่น. net ที่เรียบง่ายเพื่อจัดการการพึ่งพาบริการหากคุณสนใจ นั่นฟรี.

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


1
มันบอกฉันว่าฉันต้องการ. NET 1.1 แต่ฉันใช้ windows 7
Nick

1
.Net 1.1 ต้องได้รับการติดตั้งบน Windows 7 ดูคำตอบสำหรับคำถามนี้: answer.microsoft.com/en-us/windows/forum/ …
Glenn Sullivan

9
จริงๆแล้วในปี 2014 คุณแนะนำให้ติดตั้ง. NET 1.1 บน Win7 แทนที่จะเพิ่งคอมไพล์ใหม่เป็น 4.0? ขอบคุณไม่
Endrju

0

ใน 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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.