태그 보관물: windows-service

windows-service

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

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

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



답변

명령을 사용하여 관리자 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


답변

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

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


답변

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


답변

관심있는 경우 서비스 종속성을 관리하는 간단한 .net 응용 프로그램을 작성했습니다. 무료입니다.

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


답변

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


답변