서비스가 설치된 후 Windows 서비스에 종속성을 추가하는 방법


133

SQL Server 데이터베이스를 사용하는 Windows 서비스가 있습니다. 서비스 설치를 제어 할 수는 없지만 SQL 서버가 시작된 후 서비스가 시작되도록 서비스에 대한 종속성을 추가하고 싶습니다. (SQL 서버가 해당 서비스와 동일한 시스템에서 실행 중임)

종속성을 추가하거나 레지스트리를 직접 편집 할 수있는 도구가 있습니까?

답변:


199

명령을 사용하여 관리자 sc권한 명령 프롬프트를 통해 수행 할 수도 있습니다 . 구문은 다음과 같습니다.

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

참고 : 등호 뒤에 공백이 있고 그 앞에 공백 이 없습니다 .

경고 : depend=매개 변수는 추가하지 않고 기존 종속성 목록 을 덮어 씁니다 . 예를 들어, ServiceA가 이미 ServiceB 및 ServiceC에 의존하는 경우을 실행 depend= ServiceD하면 ServiceA는 이제 ServiceD 에만 의존 합니다 . ( 매트 감사합니다 !)

다른 서비스에 대한 종속성 :

sc config ServiceA depend= ServiceB

위는 ServiceB가 시작될 때까지 ServiceA가 시작되지 않음을 의미합니다. ServiceB를 중지하면 ServiceA가 자동으로 중지됩니다.

다른 여러 서비스에 대한 종속성 :

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

위의 의미는 ServiceB, ServiceC 및 ServiceD가 모두 시작될 때까지 ServiceA가 시작되지 않음을 의미합니다. 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

다음 regedit명령을 사용하여 레지스트리의 서비스에 "DependOnService"값을 추가하여 서비스 종속성을 추가 할 수 있습니다 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. 자세한 내용은 MS KB 기사 193888 에서 찾을 수 있으며 다음 내용은 다음에서 발췌 한 것입니다.

새 종속성을 만들려면 지연하려는 서비스를 나타내는 하위 키를 선택하고 편집을 클릭 한 다음 값 추가를 클릭합니다. 데이터 유형이 REG_MULTI_SZ 인 새 값 이름 "DependOnService"(인용 부호 제외)를 작성한 다음 확인을 클릭하십시오. 데이터 대화 상자가 나타나면이 서비스 전에 시작하려는 서비스의 이름을 각 줄에 대해 하나의 항목으로 입력 한 다음 확인을 클릭하십시오.


7
이런 젠장! 그것은 내가받은 가장 빠른 답변이었습니다. 간신히 홈페이지로 돌아 왔습니다.
Rick

2

2008R2 / Win7 이상에서 작동 할 수있는 순수한 PowerShell (regedit 또는 sc.exe 없음) 방법을 찾고 있었고 다음과 같은 결과를 얻었습니다.

하나는 PowerShell을 사용하여 regedit을 수행하는 것입니다.

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 클래스 의 Change 메소드는 해결책을 지적하는 데 도움이되었습니다.

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에 설치해야합니다.이 질문에 대한 답변을 참조하십시오 : answers.microsoft.com/en-us/windows/forum/…
Glenn Sullivan

9
실제로 2014 년에는 4.0으로 다시 컴파일하는 대신 Win7에 .NET 1.1을 설치하는 것이 좋습니다. 고마워요
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.