SQL Server 데이터베이스를 사용하는 Windows 서비스가 있습니다. 서비스 설치를 제어 할 수는 없지만 SQL 서버가 시작된 후 서비스가 시작되도록 서비스에 대한 종속성을 추가하고 싶습니다. (SQL 서버가 해당 서비스와 동일한 시스템에서 실행 중임)
종속성을 추가하거나 레지스트리를 직접 편집 할 수있는 도구가 있습니까?
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
sc qc [service name]
명령 을 사용하여 서비스에 대해 현재 구성된 종속성을 쿼리 할 수 있습니다
sc.exe
경우 그렇지 않으면 다음과 같은 오류가 발생합니다. '인수를 허용하는 위치 매개 변수를 찾을 수 없습니다'
다음 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;
}