다음을 통해 공유


도메인 컨트롤러가 종료되면 도메인 구성원이 인증에 실패합니다.

이 문서에서는 DC(도메인 컨트롤러)를 종료할 때 애플리케이션에서 사용자를 인증할 수 없는 문제를 해결합니다.

원래 KB 번호: 2683606

증상

도메인의 애플리케이션은 NTLM(로컬 영역 네트워크 관리자) 또는 Kerberos를 사용하여 사용자를 인증합니다. 일부 애플리케이션에는 클라이언트가 애플리케이션 서버에 다시 연결하는 패턴이 있습니다.

애플리케이션은 NTLM을 사용할 때 주로 영향을 받습니다. Kerberos를 사용하는 애플리케이션은 애플리케이션에서 허용하는 인증에 Kerberos PAC(권한 특성 인증서) 확인이 사용되는 경우에도 영향을 받을 수 있습니다. 모든 경우에 이러한 확인을 해제할 수 없습니다.

이 경우 DC를 종료할 때 두 DC가 네트워크에서 응답하지 않고 도메인 멤버가 인증을 위해 다른 DC를 선택할 때까지 애플리케이션이 사용자를 인증하지 않을 수 있습니다.

진단 로그 및 네트워크 추적에서 사용자 로그온 오류 로그온 실패 또는 지정된 계정이 없음을 표시하는 오류 0xc0000064 STATUS_NO_SUCH_USER 표시될 수 있습니다. Kerberos를 사용하는 경우 오류 6, KDC_ERR_C_PRINCIPAL_UNKNOWN 표시할 수 있습니다.

원인

발생할 수 있는 두 가지 문제가 있습니다.

  1. DC가 종료 단계에 있는 경우 일반적으로 오류 코드 0xc00000dc(STATUS_INVALID_SERVER_STATE )를 사용하여 인증에 다른 DC를 사용하도록 현재 클라이언트에 지시합니다. 이 문제가 발생하지 않는 코드 경로가 있습니다.

  2. 서버는 Netlogon UDP(사용자 데이터그램 프로토콜) 쿼리에서 새 클라이언트에 응답하지 않습니다. 또한 DC가 종료 중이라는 오류를 받은 클라이언트는 이후 DC 검색에서 동일한 DC를 선택하지 않습니다.

클라이언트가 종료하는 동안 DC를 선택하면 NTLM 또는 Kerberos 요청이 다시 실패합니다. 이 시점에서 클라이언트는 음수 캐시 모드로 전환되고 나중에 인증 요청에 실패합니다.

NTLM의 경우 클라이언트는 애플리케이션 서버이므로 작동하는 DC를 선택할 때까지 새 클라이언트를 수락할 수 없습니다.

해결

문제를 방지하려면 종료를 시작하거나 다시 시작하기 전에 DC에서 Netlogon 서비스를 중지합니다. 이 작업을 자동화하려면 DC에 대한 로컬 종료 스크립트에 중지 작업을 입력합니다. 로컬 그룹 정책에 액세스하려면 다음 단계를 수행합니다.

  1. Gpedit.msc 시작

  2. 설정 트리를 열고 컴퓨터 구성 > Windows 설정 > 스크립트 종료로 > 이동합니다.

  3. 새 스크립트 명령줄에서 .를 입력합니다 net stop netlogon && net stop kdc.

레지스트리 매개 변수 NegativeCachePeriod 를 낮은 값으로 설정할 수 있지만 클라이언트가 대체 DC를 더 자주 찾기 때문에 이 변경 내용이 문제를 완전히 방지하지는 않습니다.

자세한 정보

클라이언트의 Netlogon.log DC에서 STATUS_INVALID_SERVER_STATE 오류 코드를 수신하는 것을 볼 수 있습니다.

<날짜><시간> [CRITICAL] NlPrintRpcDebug: I_NetLogonSamLogonEx 대한 EEInfo를 얻을 수 없습니다: 1761 (0xc00000dc 대해 합법적일 수 있음)
<날짜><시간> [CRITICAL] <도메인>: NlpUserValidateHigher: 상태 후 액세스 거부: 0xc00000dc 0
<날짜><시간> [SESSION] <도메인>: NlSetStatusClientSession: 연결 상태를 c00000dc로 설정
<날짜><시간> [SESSION] <도메인>: NlSetStatusClientSession: 서버 \\<dc-name1><에서 바인딩 해제.도메인 FQDN>(TCP) 1.

클라이언트가 DC 종료 시 DC를 DC 중 하나로 시도할 때의 결과입니다.

<날짜><시간> [SESSION] <도메인>: NlSessionSetup: 세션 설정 시도
<날짜><시간> [SESSION] <도메인>: NlDiscoverDc: 동기 검색 시작
<날짜><시간> [MISC] NetpDcInitializeContext: DSGETDC_VALID_FLAGS c01ffff1
<날짜><시간> [MAILSLOT] NetpDcPingListIp: 도메인>: <UDP ping을 10.10.103.87로 보냈습니다.
<받은 날짜><시간> [SESSION] NETLOGON_CONTROL_TC_QUERY 함수입니다.
<날짜><시간> [MAILSLOT] NetpDcPingListIp: 도메인>: <UDP ping을 10.10.103.93으로 보냈습니다.
<날짜><시간> [MAILSLOT] NetpDcPingListIp: 도메인>: <UDP ping을 10.10.103.92로 보냈습니다.

두 번째 ping은 종료 후 DC로 전송됩니다.

DC는 클라이언트에 오류를 이미 반환했지만 응답합니다.

<날짜><시간> [LOGON] HM-REBOOT: SamLogon: HM-REBOOT-SRV1에서 domain>\test1의 <전이적 네트워크 로그온(HM-REBOOT-SRV1을 통해) 입력됨
<날짜><시간> [LOGON] HM-REBOOT: SamLogon: HM-REBOOT-SRV1에서 domain>\test1의 <전이적 네트워크 로그온(HM-REBOOT-SRV1을 통해) 0xC00000DC 반환합니다.
...
<날짜><시간> [MAILSLOT] UDP LDAP의 HM-REBOOT-SRV1 <\domain> (null)에서 ping을 받았습니다.
<날짜><시간> [MAILSLOT] <도메인>: Ping 응답 'Sam Logon Response Ex' (null) to \\<member server> Site: Default-First-Site-Name on UDP LDAP
<날짜><시간> [MAILSLOT] <도메인>: Ping 응답 'Sam Logon Response Ex' (null) to \\<member server> Site: Default-First-Site-Name on UDP LDAP

다음 단계

"NegativeCachePeriod"에 대한 참조: