인터넷 정보 서비스에서 호스팅되는 웹 응용 프로그램을 구성할 때 SPN을 사용하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 929650 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 서비스 사용자 이름을 (SPN)을 설명합니다. 이 문서에서는 Microsoft 인터넷 정보 서비스 (IIS) 서버에서 호스트되는 웹 응용 프로그램을 구성할 때 SPN을 사용하는 방법도 설명합니다. 이 문서에서는 Windows 통합 인증 협상 프로세스에 대해 설명합니다. 협상 보안 헤더 사용하면 클라이언트가 선택 간에 Kerberos 인증, NTLM 인증.

또한 이 문서에서는 Kerberos 인증을 설정하려면 SPN이 필요한 일반적인 시나리오를 설명합니다. 마지막 단원에서는 Kerberos 인증이 실패할 수 있는 상황을 설명합니다. 또한 마지막 섹션에서는 문제 해결 단계를 제공합니다.

소개

중요 이 문서에서 설명하는 항목은 IIS (인터넷 정보 서비스) 6.0 데 적용됩니다. 커널 모드 인증 구성 설정 useKernelModefalse 로 설정하면 사용할 수 없는 경우 해당 항목은 또한 IIS 7.0 및 7 적용됩니다.
이 문서에서는 호스팅되는 웹 응용 프로그램을 구성할 때 Windows 통합 인증은 클라이언트 요청을 인증하는 데 사용할 때 서비스 사용자 이름 (SPN) IIS.IIS 패스 협상 보안 헤더를 사용하는 방법에 대해 설명합니다. 협상 보안 헤더 사용하면 클라이언트가 선택 간에 Kerberos 인증, NTLM 인증. 다음 조건 중 하나에 해당하는 경우에만 협상 프로세스를 Kerberos 인증을 선택합니다.
  • 인증에서 관련된 시스템 중 하나가 Kerberos 인증을 사용할 수 없습니다.
  • 호출 응용 프로그램이 Kerberos 인증을 사용할 수 있는 충분한 정보를 제공하지 않습니다.
협상 프로세스를 네트워크 인증을 위해 Kerberos 프로토콜을 선택할 수 있도록 클라이언트 응용 프로그램이 SPN을 사용자 원칙 이름 (UPN) 또는 NetBIOS 계정 이름을 대상 이름으로 제공해야 합니다. 클라이언트 응용 프로그램이 대상 이름을 제공하지 않으면 Kerberos 프로토콜 협상 프로세스를 사용할 수 없습니다. Kerberos 프로토콜 협상 프로세스를 사용할 수 없는 경우 NTLM 프로토콜을 협상 프로세스를 선택합니다.

추가 정보

개념

SPN은 정의

SPN은 클라이언트가 서비스 인스턴스를 고유하게 식별하는 이름입니다. 포리스트 전체에서 컴퓨터에 서비스의 여러 인스턴스를 설치할 경우, 자체 SPN 각 서비스 인스턴스가 있어야 합니다. 클라이언트는 인증에 사용할 수 있는 이름을 여러 개 있으면 여러 SPN을 특정 서비스 인스턴스를 가질 수 있습니다. 예를 들어, SPN이 항상 서비스 인스턴스가 실행되는 호스트 컴퓨터 이름을 포함합니다. 따라서 서비스 인스턴스가 각 이름 또는 별칭을 해당 호스트의 SPN을 등록하는 것입니다.

HTTP 서비스 클래스

HTTP 서비스 클래스는 HTTP 프로토콜을 다릅니다. HTTP 프로토콜 및 HTTPS 프로토콜을 HTTP 서비스 클래스를 사용합니다. 서비스 클래스가 서비스의 일반 클래스를 식별하는 문자열입니다. 웹 서비스에 대해 "www" 및 "LDAP" 디렉터리 서비스에 대해 잘 알려진 서비스 클래스 이름이 포함됩니다. 일반적으로 서비스 클래스 이름은 서비스 클래스의 고유한 모든 문자열일 수 있습니다. SPN을 구문을 슬래시 문자 (/) 요소를 구분하는 데 사용하는 수 있습니다. 따라서, 슬래시 문자 (/) 서비스 클래스 이름을 표시할 수 없습니다.

서비스 호스트 서비스 및 HTTP 클래스

호스트 컴퓨터에서는 호스트 서비스를 나타냅니다. Kerberos 프로토콜은 HOST SPN을 호스트 컴퓨터에 액세스합니다. Kerberos 프로토콜 서비스 티켓을 만들 호스트 컴퓨터의 장기적인 키를 사용합니다.

HTTP 서비스 클래스의 별칭으로 HOST SPN의 역할을 하는 기본 제공 서비스 중 하나입니다. HOST SPN은 호스트 컴퓨터 계정에 매핑됩니다. 기본 HTTP 서비스 클래스를 사용할 때, Kerberos 프로토콜을 컴퓨터 계정을 서비스 계정으로 서비스 티켓을 요청할 수 사용합니다.

일반적인 시나리오

이 섹션에서는 SPN을 하는 시나리오에 대해 설명합니다. 또한 이 절에서는 각 시나리오에 대해 설정할 수 있는 SPN 확인하는 방법을 보여 줍니다. 이러한 시나리오에서 사용되는 용어는 다음과 같습니다.
표 축소표 확대
IIS6server1IIS가 실행되는 컴퓨터의 호스트 이름
MyDomainIIS6server1 컴퓨터가 가입한 도메인
appPool1응용 프로그램 풀 ID를 사용하는 mydomain 도메인의 사용자 계정
appPool2두 번째 응용 프로그램 풀 ID를 사용하는 mydomain 도메인의 사용자 계정
www.test.com웹 사이트의 첫 번째 호스트 헤더
www.test2.com웹 사이트에 대한 두 번째 호스트 헤더
www.test3.com웹 사이트에 대한 세 번째 호스트 헤더
www.myIIScluster.comIIS를 실행하는 컴퓨터로 구성된 클러스터 정규화된 도메인 이름
www.myEXCHcluster.comMicrosoft Exchange IIS를 실행하는 컴퓨터로 구성된 클러스터 정규화된 도메인 이름

Setspn.exe 도구

Setspn.exe 도구를 사용하여 읽고 수정할 Active Directory 서비스 계정에 대해 SPN을 디렉터리 속성을 삭제할 수 있습니다. SPN은 서비스를 실행하기 위한 대상 주 이름이 찾는 데 사용됩니다. SetSpn.exe 도구를 사용하면 현재 SPN을 보기, 기본 계정의 SPN을 다시 및 추가 또는 보충 SPN을 삭제할 수 있습니다.

Setspn.exe 도구를 구하려면 Microsoft Windows Server 2003이 문서에서는 Microsoft 기술 자료의 다음 문서 번호를 누르십시오.
970536Windows Server 2003 Setspn.exe 지원 도구 업데이트

시나리오 1: 응용 프로그램 풀 ID를 수정할 때 IIS 응용 프로그램 액세스

IIS 응용 프로그램 대신 도메인 사용자 계정이나 기본 네트워크 서비스 계정에서 실행되는 경우 도메인 계정을 사용하여 HTTP 서비스에 대한 SPN을 설정해야 합니다. 이 경우 IIS가 실행되는 서버의 NetBIOS 이름 또는 IIS 실행 서버의 FQDN을 사용하여 IIS 응용 프로그램을 액세스합니다.

NetBIOS 이름을 사용하여 IIS 응용 프로그램에 액세스하기 위해 IIS를 실행하는 서버의 NetBIOS 이름이 NETBIOS_NAME_OF_IIS_SERVER 곳에 다음 명령을 사용하십시오.
Setspn HTTP ?S/NETBIOS_NAME_OF_IIS_SERVER domain\username
예를 들어, 다음 명령을 명령을 유사할 수 있습니다.
HTTP/iis6server1 mydomain\appPool1 ?S Setspn
FQDN을 사용하여 IIS 응용 프로그램에 액세스하기 위해 FQDN_OF_IIS_SERVER IIS를 실행하는 서버의 FQDN을 위치 다음 명령을 사용하십시오.
Setspn HTTP ?S/FQDN_OF_IIS_SERVER domain\username
예를 들어, 다음 명령을 명령을 유사할 수 있습니다.
Setspn ?S HTTP/iis6server1.mydomain.com mydomain\appPool1

시나리오 2: 호스트 헤더를 사용하여 웹 응용 프로그램 액세스

호스트 헤더를 사용하여 웹 응용 프로그램에 액세스할 때 HTTP 서비스에 대한 SPN을 설정해야 합니다.

네트워크 서비스 계정을 로컬 서비스 계정 또는 로컬 시스템 계정을 기본 계정으로 웹 응용 프로그램을 실행하면 다음과 같은 명령을 사용할 수 있습니다.
?A Setspn HTTP/HOST_HEADER NETBIOS_NAME_OF_IIS_SERVER
이 명령은 HOST_HEADER 해당 응용 프로그램에 액세스할 수 있는 브라우저 창에서 입력한 다음 NETBIOS_NAME_OF_IIS_SERVER IIS를 실행하는 서버의 NetBIOS 이름은 호스트 헤더가 있습니다.

예를 들어, 다음 명령은 응용 프로그램의 명령을 유사할 수 있습니다.
Setspn ?A HTTP/www.test.com iis6server1
응용 프로그램 도메인 계정에서 실행되는 경우 다음 명령을 사용할 수 있습니다.
Setspn HTTP ?A/HOSTHEADER_OR_DNS_ALIAS domain\username
이 명령은 HOSTHEADER_OR_DNS_ALIAS 호스트 헤더 또는 DNS 별칭을 사용하여 웹 응용 프로그램에 액세스할 수 있습니다.

예를 들어, 다음 명령 중 하나가 응용 프로그램의 명령 유사할 수 있습니다.
  • Setspn ?A HTTP/www.test.com mydomain\appPool1
  • Setspn ?A HTTP/www.test3.com mydomain\appPool2

시나리오 3: 클러스터된 인덱스 또는 부하가 분산된 환경에서 IIS 응용 프로그램 액세스

클러스터된 환경에서 또는 부하가 분산된 환경에서 IIS를 실행하는 경우 노드 이름을 사용하여 클러스터 이름 대신 사용하여 응용 프로그램에 액세스합니다. 네트워크 로드 균형 조정 이 시나리오가 포함되어 있습니다. 클러스터 기술이 있는 노드가 클러스터의 구성원이 한 컴퓨터에 참조합니다. Kerberos 인증 프로토콜은 이 시나리오에서 사용하려면 동일한 도메인 사용자 계정을 사용하도록 각 IIS 노드에 응용 프로그램 풀 ID를 구성해야 합니다. 다음 명령을 사용하여 각 IIS 노드를 동일한 도메인 사용자 계정을 사용하도록 구성합니다.
Setspn HTTP ?A/CLUSTER_NAME 도메인\사용자 이름
예를 들어, 다음 명령 중 하나를 명령을 유사할 수 있습니다.
  • Setspn ?A HTTP/www.myIISCluster.com mydomain\appPool1
  • Setspn ?A HTTP/www.myEXCHCluster.com mydomain\appPool2

시나리오 4: SQL 응용 프로그램이 액세스해야 하는 서버 사용

백 엔드 서버의 SPN IIS 웹 응용 프로그램이 SQL Server를 실행 중인 백 엔드 컴퓨터에 액세스하는 것이 필요한지 여부를 확인할 수 있을 수 있습니다. 필요한 SPN을 잘못 구성된 경우 웹 응용 프로그램이 제대로 작동하지 않을 수 있습니다.

이면 해당 MSSQLSvc 로컬 시스템 계정에서 실행되고 SQL Server를 실행 중인 백 엔드 컴퓨터/포트 번호를 FQDN_OF_SQL_SERVER:port 컴퓨터 이름을 사용할 수 있어야 합니다. SQL Server를 실행하는 컴퓨터에 대한 SPN을 확인하려면 다음 명령을 사용하십시오.
Setspn ?L SQL_SERVER_COMPUTER_NAME
SQL Server를 실행하는 컴퓨터 이름에 대한 SPN을 설정하려면 다음 명령을 사용하십시오.
Setspn ?A MSSQLSvc/FQDN_OF_SQLSERVER:port SQLSERVER_COMPUTER_NAME
SQL Server를 실행 중인 백 엔드 컴퓨터에 있는 MSSQLSvc 있는 도메인 계정으로 실행되고/포트 번호를 FQDN_OF_SQL_SERVER:port 도메인 계정을 사용해야 하는 경우. 도메인 계정에 대해 SPN을 확인하려면 다음 명령을 사용하십시오.
Setspn ?L 도메인\사용자 이름
SQL Server를 실행하는 컴퓨터 이름에 대한 SPN을 설정하려면 다음 명령 중 하나를 수행하십시오.
  • Setspn ?A MSSQLSvc/FQDN_OF_SQLSERVER:portFQDN_OF_SQLSERVER
  • Setspn ?A MSSQLSvc/FQDN_OF_SQLSERVER:portdomain\username

SPN 도우미 스크립트

다음 예제 스크립트는 IIS 응용 프로그램에 대한 SPN을 찾을 수 있습니다. 이 스크립트는 중복된 SPN 찾을 수도 있습니다. 이 스크립트를 사용하려면 다음 이 단계를 수행하십시오.
  1. 시작실행메모장)를 입력한 다음 확인 을 클릭하십시오.
  2. In the Notepad file, paste the following script:
    Dim argSPN, argUser, argComputer, spnToSearch, objCategory, strFilter, searchCategory, domainInput
    
    Function Help()
    Dim strMessage
    strMessage = strMessage & "Usage:" & chr(13)
    strMessage = strMessage & "For accurate results run this script from the IIS server or a member server in the same domain as IIS server." & chr(13)
    strMessage = strMessage & "Check the article's failure scenarios and make sure no duplicate SPNs exist." & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:spn /spn:HTTP/www.test.com /user:mydomain\apppool1" & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:spn /spn:HTTP/www.test.com /computer:iis6server1" & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:user /user:mydomain\apppool1" & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:computer /computer:iis6server1" & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:duplicatespn /spn:HTTP/www.test.com" & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:requiredspn" & chr(13)
    	MsgBox strMessage,,"SPN Helper"
    	WScript.Quit
    End Function
    
    Function setArguments()
    	argSPN = lcase(WScript.Arguments.Named("spn"))
    	argUser =  lcase(WScript.Arguments.Named("user"))
    	argComputer = lcase(WScript.Arguments.Named("computer"))
    	searchCategory = lcase(WScript.Arguments.Named("f"))
    	if instr(argUser,"\")>0 then
    		domainInput = ",DC=" & split(argUser,"\")(0)
    		argUser = split(argUser,"\")(1)
    	end if
    End Function
    
    Function resetValues()
    	spnToSearch = ""
    	objCategory = ""
    	strFilter = ""
    End Function
    
    Function getGCPath()
    	Dim tempGCPath, objGC, tempGC, tempStr
    	Set objGC = GetObject("GC:")
    	for each tempGC in objGC
    		tempGCPath = tempGC.ADsPath
    	next
    	if tempGCPath <> "" then
    		getGCPath = tempGCPath
    	else
    		WScript.Echo "Unable to find active directory"
    		WScript.Quit
    	end if
    	For tempCounter=0 to UBound(split(lcase(split(getGCPath,"//")(1)),"."))
    		If tempCounter = UBound(split(lcase(split(getGCPath,"//")(1)),".")) Then tempSeperator="" else tempSeperator = ","
    		tempStr = tempStr & "DC=" & split(lcase(split(getGCPath,"//")(1)),".")(tempCounter) & tempSeperator
    	Next
    	getGCPath = tempGCPath & "/" & tempStr
    End Function
    
    Function getSPNClass()
    	Dim tempSPNClass
    	If trim(argSPN)="" Then getSPNClass = "*": Exit Function
    	If instr(argSPN,"/")=0 Then getSPNClass = "*": Exit Function
    	If instr(split(argSPN,"/")(0),"*")>0 Then getSPNClass = "*": Exit Function
    	getSPNClass = split(argSPN,"/")(0)
    End Function
    
    Function isSPNInputValid(spnIN)
    	isSPNInputValid = ""
    	If instr(spnIN,"/")=0 Then Exit Function
    	If instr(spnIN,"*")>0 Then Exit Function
    	isSPNInputValid = spnIN
    End Function
    
    Function Main()
    	Dim paramSPN
    	paramSPN = ""
    	call  resetValues()
    	call setArguments()
    	Select Case searchCategory
    		Case "spn"
    			if (argUser = "" and argComputer = "") or (argUser <> "" and argComputer <> "") then WScript.Echo "You must use /spn along with /computer or /user": WScript.Quit
    			if argSPN = "" then argSPN = "*"
    			spnToSearch = "(servicePrincipalName=" & argSPN & ")"
    			if argUser <> "" then objCategory = "(objectCategory=person)(sAMAccountName=" & argUser & ")"
    			if argComputer <> "" then 
    				objCategory = "(objectCategory=computer)(cn=" & argComputer & ")"
    			End If
    			strFilter = "(&" & spnToSearch & objCategory & ")"
    		Case "duplicatespn"
    			If isSPNInputValid(argSPN)="" Then WScript.Echo "Invalid SPN input. Please verify and try again.": WScript.Quit
    			spnToSearch = "(servicePrincipalName=" & argSPN & ")"
    			strFilter = spnToSearch
    			paramSPN = argSPN
    		Case "requiredspn"
    			call showRequiredSPNs("IIS")
    			WScript.Quit
    		Case "computer"
    			objCategory = "(&(objectCategory=computer)(cn=" & argComputer & "))"
    			strFilter = objCategory
    		Case "user"
    			objCategory = "(&(objectCategory=person)(sAMAccountName=" & argUser & "))"
    			strFilter = objCategory
    		Case else
    			call Help()
    			WScript.Quit
    	End Select
    	call getSPNs(paramSPN)
    End Function
    
    Function getPingResult(hostName,errorMessage)
    'On Error Resume Next
    getPingResult = ""
    	If instr(hostName,".")=0 Then
    		Dim tempGCPath, objGC, tempGC
    		Set objGC = GetObject("GC:")
    		for each tempGC in objGC
    			tempGCPath = tempGC.ADsPath
    		next
    		if tempGCPath <> "" then
    			gcPath = tempGCPath
    		else
    			WScript.Echo "Unable to find active directory"
    			WScript.Quit
    		end if
    		Set adConn = CreateObject("ADODB.Connection")
    		Set adCmd = CReateObject("ADODB.Command")
    		adConn.Provider = "ADsDSOObject"
    		adConn.Open "ADs Provider"
    		Set adCmd.ActiveConnection = adConn
    		adQuery = "<" + gcPath + ">;" & "(&(objectCategory=computer)(cn=" & hostName & "))" & ";dnsHostName;subtree"
    		'WScript.Echo adQuery
    		'WScript.Quit
    		adCmd.CommandText = adQuery
    		Set adRecordSet = adCmd.Execute
    		if adRecordSet.RecordCount>0 Then 
    			If IsNull(adRecordSet.Fields("dnsHostName"))=0 Then 
    				getPingResult = adRecordSet.Fields("dnsHostName") 
    				hostName = getPingResult 
    			Else 
    				getPingResult = hostName
    			End If
    		else 
    			errorMessage = "Could not find " & hostname & " in the active directory"
    		end if
    
    		Exit Function
    	End If
    	getPingResult = hostName
    Exit Function
    'If Err Then getPingResult = hostName
    End Function
    
    Function getSPNs(spn)
    	Dim spnClass, duplicateSPNArray
    	spnClass = getSPNClass()
    	duplicateSPNArray = ""
    	gcPath = getGCPath()
    	Set adConn = CreateObject("ADODB.Connection")
    	Set adCmd = CreateObject("ADODB.Command")
    	adConn.Provider = "ADsDSOObject"
    	adConn.Open "ADs Provider"
    	Set adCmd.ActiveConnection = adConn
    	adQuery = "<" + gcPath + domainInput + ">;" & strFilter & ";distinguishedName,objectCategory,dnsHostName,servicePrincipalName,sAMAccountName;subtree"
    	'WScript.Echo adQuery
    	'WScript.Quit
    	adCmd.CommandText = adQuery
    	Set adRecordSet = adCmd.Execute
    	if adRecordSet.EOF and adRecordSet.Bof Then
    		WScript.echo "No " & searchCategory & " found with the given criteria."
    	else
    		If adRecordSet.RecordCount>10 Then
    			If msgbox(adRecordSet.RecordCount & " Records are returned with the given criteria. Printing all of them might take a long time" & chr(13) & " Do you want to print all of them?",vbYesNo,"Kerberos")=vbNo Then Exit Function
    		End If
    		Do While not adRecordset.Eof
    			If Err Then Exit Do
    			WScript.echo "Class: " & split(split(adRecordSet.Fields("objectCategory"),",")(0),"=")(1)
    			WScript.Echo adRecordSet.Fields("distinguishedName")
    			if UCase(adRecordSet.Fields("objectCategory")) = "COMPUTER" Then
    				WScript.echo "Computer Name" & adRecordSet.Fields("dnsHostName")
    			else
    				WScript.echo "User Name: " & adRecordSet.Fields("samAccountName")
    			end if
    			if instr(searchCategory,"spn")>0 Then
    				spnCollection = adRecordSet.Fields("servicePrincipalName")
    				for each individualSPN in spnCollection
    					if spnClass="*" Then
    					WScript.Echo Chr(9) + individualSPN
    					else
    						Select Case searchCategory
    							Case "spn"
    								if Lcase(split(individualSPN,"/")(0)) = lcase(spnClass) Then
    									WScript.Echo Chr(9) + individualSPN
    								end if
    							Case "duplicatespn"
    								if Lcase(individualSPN) = lcase(spn) Then
    									duplicateSPNArray = duplicateSPNArray & Lcase(individualSPN) & " for " & split(split(adRecordSet.Fields("objectCategory"),",")(0),"=")(1) & ":" & adRecordSet.Fields("samAccountName") & Chr(29)
    								end if
    							Case "requiredspn"
    						End Select
    					End if
    				next
    			end if
    			WScript.Echo
    			adRecordSet.MoveNext
    		Loop
    		If searchCategory = "duplicatespn" Then
    			If UBound(Split(duplicateSPNArray,Chr(29)))>1 Then
    				WScript.Echo "Duplicate SPNs found"
    				For tempDuplicateCount=0 to UBound(Split(duplicateSPNArray,Chr(29)))-1
    					WScript.Echo Split(duplicateSPNArray,Chr(29))(tempDuplicateCount)
    				Next
    			End If
    		End If
    		WScript.Echo ""
    		If adRecordset.RecordCount>1 Then WScript.Echo "Found " & adRecordset.RecordCount & " accounts" Else WScript.Echo "Found " & adRecordset.RecordCount & " account"
    	end if
    	adRecordset.Close
    	adConn.Close
    	If Err Then MsgBox Err.Message
    End Function
    
    Function getCategoryCount(myFilterValue, myFilterCategory)
    'This function accepts 2 parameters. First paramenter is the filter value and second param is filter category.
    'If you want to pass in your own filter string with various categories, you can pass "" as the second param.
    	gcPath = getGCPath()
    	searchCategory = myFilterCategory
    	Select Case lcase(searchCategory)
    		Case "spn"
    			tempFilter = "(servicePrincipalName=" & myFilterValue & ")"
    		Case "user"
    			tempFilter = "(&(objectCategory=person)(sAMAccountName=" & myFilterValue & "))"
    		Case "computer"
    			tempFilter = "(&(objectCategory=computer)(cn=" & myFilterValue & "))"
    		Case else
    			tempFilter = myFilterValue
    	End Select
    	Dim tempCategoryCount
    	tempCategoryCount = 0
    	Set adConn = CreateObject("ADODB.Connection")
    	Set adCmd = CReateObject("ADODB.Command")
    	adConn.Provider = "ADsDSOObject"
    	adConn.Open "ADs Provider"
    	Set adCmd.ActiveConnection = adConn
    	adQuery = "<" + gcPath + domainInput + ">;" & tempFilter & ";objectCategory,dnsHostName,servicePrincipalName,sAMAccountName;subtree"
    	'WScript.Echo adQuery
    	'WScript.Quit
    	adCmd.CommandText = adQuery
    	Set adRecordSet = adCmd.Execute
    	if adRecordSet.EOF and adRecordSet.Bof Then
    	else
    		Do While not adRecordset.Eof
    			If Err Then Exit Do
    			if searchCategory = "spn" Then
    				spnCollection = adRecordSet.Fields("servicePrincipalName")
    				for each individualSPN in spnCollection
    					If lcase(individualSPN) = lcase(myFilterValue) Then
    						tempCategoryCount  = tempCategoryCount  + 1
    					End If
    				next
    			else
    				tempCategoryCount = tempCategoryCount + 1
    			end if   
    			adRecordSet.MoveNext
    		Loop
    	end if
    	getCategoryCount = tempCategoryCount
    	adRecordset.Close
    	adConn.Close
    End Function
    
    Function showRequiredSPNs(Product)
    	Select Case Product
    		Case "IIS"
    			If MsgBox("Is IIS running in a Cluster or NLB",vbYesNo)=vbYes Then 'Running in Cluster or NLB is true
    				strClusterName = InputBox("Enter the Cluster Name")
    				If strClusterName = "" Then WScript.Quit
    				If getPingResult(strClusterName,errorMessage)="" Then
    					If MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.Quit
    				End If
    				strDomainAccount = InputBox("Enter the Domain Account that the application pool is running under")
    				If strDomainAccount = "" Then WScript.Quit
    				strRequiredSPN = "HTTP/" & strClusterName
    				If instr(strDomainAccount,"\") > 0 then
    					If getCategoryCount(split(strDomainAccount,"\")(1), "user")=0 Then
    						WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    						WScript.Quit
    					End If
    				Else
    					If getCategoryCount(strDomainAccount, "user")=0 Then
    						WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    						WScript.Quit
    					End If
    				End If
    				If getCategoryCount(strRequiredSPN, "spn")>0 Then
    					WScript.Echo "SPN " & " is already set. Use search option for finding the account that it is set for"
    					WScript.Quit
    				End If
    				WScript.Echo "You need to set the SPN " & strRequiredSPN & " for domain account " & strDomainAccount
    			Else
    				If MsgBox("Is IIS application pool running under domain account",vbYesNo)=vbYes Then 
    					strHostName = InputBox("Enter the hostname or host header or FQDN that you use to access the application")
    					If strHostName = "" Then WScript.Quit
    					If getPingResult(strHostName,errorMessage)="" Then
    						If MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.Quit
    					End If
    					strDomainAccount = InputBox("Enter the Domain Account that the application pool is running under")
    					If strDomainAccount = "" Then WScript.Quit
    					If instr(strDomainAccount,"\") > 0 then
    						If getCategoryCount(split(strDomainAccount,"\")(1), "user")=0 Then
    							WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    							WScript.Quit
    						End If
    					Else
    						If getCategoryCount(strDomainAccount, "user")=0 Then
    							WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    							WScript.Quit
    						End If
    					End If
    					strRequiredSPN = "HTTP/" & strHostName
    					If getCategoryCount(strRequiredSPN, "spn")>0 Then
    						WScript.Echo "SPN " & strSPNRequired & " is already set. Use search option for finding the account that it is set for"
    						WScript.Quit
    					Else
    						WScript.Echo "You need to set SPN " & strRequiredSPN & " for domain account " & strDomainAccount
    						WScript.Quit
    					End If
    				Else
    					strHostName = InputBox("Enter the host header or FQDN that you use to access the application")
    					If strHostName = "" Then WScript.Quit
    					If getPingResult(strHostName,errorMessage)="" Then
    						If MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.Quit
    					End If
    					If MsgBox("Are you accessing the application with netbios name or FQDN or CNAME alias of IIS server?",vbYesNo)=vbYes Then
    						strRequiredSPN = "host/" & strHostName
    						If getCategoryCount(strRequiredSPN, "spn")>0 Then
    							WScript.Echo "Required SPN " & strRequiredSPN & " is already set. Use search option for finding the account that it is set for"
    							WScript.Quit
    						Else
    							WScript.Echo "You need to set SPN " & strRequiredSPN & " for IIS server's netbios name"
    							WScript.Quit
    						End If
    					End If
    					strHostHeader = InputBox("Enter the host header that you use to access the application")
    					If strHostHeader = "" Then WScript.Quit
    					strRequiredSPN = "http/" & strHostHeader
    					If getCategoryCount(strSPNRequired, "spn")>0 Then
    						WScript.Echo "A required SPN " & strSPNRequired & " is already set. Use search option to find the account the SPN is set to. If the required SPN is found under a different account, remove and add it to the IIS server's machine account."
    						WScript.Quit
    					Else
    						WScript.Echo "You need to set SPN " & strRequiredSPN & " for IIS server's netbios name"
    						WScript.Quit
    					End If
    				End If
    				
    			End If
    		Case Else
    			call Help()
    	End Select
    End Function
    
    call Main()
    '
    
  3. Spnhelper.vbs 같은 파일을 저장하십시오.
  4. 명령 프롬프트에서 적절한 명령줄 옵션을 사용하여 Spnhelper.vbs 파일을 실행하십시오.

    참고 Spnhelper.vbs 파일에 대한 명령줄 옵션을 보려면 명령 프롬프트에서 Spnhelper.vbs/help 입력한 다음 Enter 키를 누릅니다.

추가 고려 사항

컴퓨터 계정 또는 도메인 계정에 대한 필수 SPN을 설정할 때 Kerberos 인증이 실패할 수 있습니다. 예기치 않게 Kerberos 인증이 실패할 경우 다음과 같이 하십시오.
  • 중복된 SPN 글로벌 카탈로그에 SPN에 대해 존재하는지 확인하십시오.

    예를 들어, HTTP/www.test.com SPN을 계정의 myDomain\appPool1 및 myDomain\appPool2 계정에 대해 설정되어 있으면 해당 SPN을 다른 계정을 설정할 수 있지만 중복된 SPN이 존재합니다. 또한 HTTP/iis6server1.mydomain.com SPN을 myDomain\appPool1 계정을 설정하고 HTTP/iis6server1.mydomain.com SPN을 또한 서버에 대한 컴퓨터 계정과 사용하여 연결된 또한 중복된 SPN이 있습니다. HOST 하나의 SPN 한 HTTP SPN을 가질 수 있습니다. 호스트 항목 아래에 나와 있는 것처럼 암시적 한을 명시적 HTTP SPN을 우선합니다. 그러나 사용자가 있는지 하나 이상의 사용자 계정 또는 컴퓨터 계정이 두 개 이상 연결된 URL을 사용자가 있을 경우 중복된 SPN.
  • SPN을 있는 다른 도메인 컨트롤러에 복제되었는지 확인하십시오.

    다른 도메인 컨트롤러로 복제하는 도메인 컨트롤러 사이에 복제 문제가 있는 SPN을 방지할 수 있습니다. 다른 도메인 컨트롤러에 대한 SPN을 복제하지 않는 경우 일부 클라이언트 컴퓨터에서 응용 프로그램이 작동하지 않을 수 있습니다. HTTP/www.test.com SPN을 myDomain\appPool1 계정 도메인 컨트롤러에 대해 설정되어 있으면 SPN을 두 번째 도메인 컨트롤러로 복제하는 경우 예를 들어, HTTP/www.test.com SPN은 myDomain\appPool1 계정에 대한 두 번째 도메인 컨트롤러 찾을 수 없습니다.

    참고 기본적으로 복제 15 분 정도 걸립니다.
  • 웹 서버가 Kerberos 인증을 지원하도록 구성되었는지 확인하십시오. 이렇게 하려면 NTLM NTAuthenticationProviders 키 IIS 메타베이스에 대한 설정이 변경되지 않은 것을 확인하십시오. 협상, NTLM 기본 설정입니다.
  • 서버 또는 자격 증명을 위임할 서비스가 위임용으로 트러스트되어 있는지 확인하십시오.
  • 서비스가 실행 중인 계정이 위임용으로 트러스트되어 있는지 확인하십시오.
  • Active Directory에서 응용 프로그램에 액세스할 사용자 계정 민감하여 위임할 수 없음 확인란이 선택 취소되어 있는지 확인하십시오.
  • 응용 프로그램 서버에서 직접 액세스하는 경우 루프백 보안 검사 확인란이 선택 취소되어 있는지 확인하십시오.루프백 확인란을 사용할 수 있는지 확인하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
    896861통합 인증을 사용하며 IIS 5.1 또는 IIS 6에 호스트된 웹 사이트를 탐색할 때 오류 401.1이 나타난다
  • 클라이언트는 Kerberos 사용 가능 클라이언트 상태에 있는지 확인하십시오. 또한 Windows 통합 인증 사용 설정은 Internet Explorer에서 사용할 수 있는지 확인하십시오. 이렇게 하려면 [도구] 메뉴에서 [인터넷 옵션고급 을 및 Windows 통합 인증 사용 확인란을 선택해야 합니다.
  • Kerberos 프로세스에 포함되는 모든 컴퓨터에 일관된 이름 확인이 Kerberos 트러스트에 의해 연결되어 계속할 수 없습니다. 예를 들어, Kerberos 프로세스에 포함되는 컴퓨터와 같은 포리스트에 있지 또는 포리스트 간 Kerberos 트러스트 포함된 확인하십시오.
  • MaxTokenSize 속성을 설정하는 값을 토큰 크기를 초과하지 않는지 확인하십시오. 또한 MaxFieldLength 속성에 설정된 값을 요청 크기를 초과하지 않는지 확인하십시오. Kerberos 과정에서 사용자가 여러 그룹의 구성원인 경우 이 값이 초과될 수 있습니다.
    920862Outlook Web Access 사용자가 Exchange Server 2003 에서 사서함에 액세스하려고 할 때 오류 메시지: “ HTTP 400 잘못된 요청 (요청 헤더가 너무 길어서) ”
  • 응용 프로그램 풀에 대해 도메인 계정을 구성할 때 필요한 보안 정책을 사용할 수 있는지 확인하십시오. 이렇게 하려면 도메인 계정을 IIS가 실행되는 컴퓨터에서 다음 로컬 보안 정책 구성원이 있는지 확인하십시오.
    • 프로세스의 메모리 할당량 조정
    • 서비스로 로그온
    • 프로세스 수준 토큰 바꾸기
  • UDP를 통해 Kerberos 인증이 올바르게 작동하는지 확인하십시오. 기본적으로 UDP을 Kerberos 인증을 사용합니다. 그러나 Kerberos 인증이 실패할 UDP 패킷 손실이 발생할 수 있습니다. 이 문제가 발생하면 TCP를 사용하는 Kerberos 인증을 할 수 있습니다. 강제로 Kerberos 인증을 TCP를 사용하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
    244474Kerberos UDP Windows Server 2003, Windows XP 및 Windows 2000 대신 TCP를 사용하는 방법
  • 인증자 시간 스탬프 5분 타임스탬프 서버의 데이터를 기준으로 다릅니까 않는 것을 확인하십시오. 시간 스탬프 차이를 해결하는 방법에 대한 자세한 내용은 기술 자료의 다음 문서를 참조하십시오.
    232386날짜 및 시간이 동기화되어 있지 않으면 로그온할 수 없습니다.
  • TCP/UDP 포트를 88 방화벽이나 라우터가 차단된 확인하십시오. 기본적으로 TCP/UDP 포트를 88 Kerberos 인증을 사용합니다.
  • 도메인 모드 환경에서는 최소한 Microsoft Windows 2000 기본 모드 환경에서 확인하십시오. 도메인 모드를 결정하는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 방문하십시오.
    http://technet2.microsoft.com/windowsserver/en/library/11b2d3d3-980c-4b64-9ed3-51778f1fe5771033.mspx?mfr=true
  • 클라이언트에서 웹 응용 프로그램의 URL을 로컬 인트라넷 사이트 추가되었는지 확인하십시오. 로컬 인트라넷 URL 추가하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
    303650FQDN이나 IP 주소를 사용하면 인트라넷 사이트가 인터넷 사이트로가 식별됩니다.
  • 각 기가비트 이더넷 장치를 최신 드라이버를 사용하고 있는지 확인하십시오. 기가비트 이더넷 장치에 대한 드라이버가 오래된 경우 발생하는 문제에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
    326152도메인 컨트롤러에 연결할 수 없고 기가비트 이더넷 장치를 사용하면 그룹 정책을 적용할 수 없습니다.

참조

로드 균형이 조정된 웹 사이트를 Kerberos 인증을 사용하는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 방문하십시오.
http://technet.microsoft.com/en-us/library/cc757299.aspx
프록시 서버가 Kerberos 인증을 사용할 때 발생하는 문제에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
321728Internet Explorer 프록시 서버가 Kerberos 인증을 지원하지 않습니다.
네트워크 인증을 위해 Kerberos 프로토콜 및 NTLM 프로토콜을 지원하도록 IIS를 구성하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
215383네트워크 인증을 위해 Kerberos 프로토콜 및 NTLM 프로토콜을 지원하도록 IIS를 구성하는 방법
Kerberos 인증과 Kerberos 인증과 NTLM 인증을 전환하는 방법을 사용하려면 Windows SharePoint Services 가상 서버를 구성하는 방법에 대한 자세한 내용은 Microsoft 기술 자료 문서를 보려면 다음 문서 번호를 누르십시오.
832769Windows SharePoint Services 가상 서버에 Kerberos 인증을 사용하도록 구성하는 방법 및 Kerberos 인증과 NTLM 인증을 전환하는 방법
Kerberos 인증 프로토콜을 사용하여 Windows Server 2003 또는 Windows XP에서 표준이 아닌 포트를 사용하여 웹 서버에 연결할 때 발생하는 문제에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
908209Internet Explorer 6 Kerberos 인증 프로토콜은 Windows XP에서 비표준 포트를 사용하는 웹 서버 또는 Windows Server 2003 연결할 수 없습니다.

속성

기술 자료: 929650 - 마지막 검토: 2010년 5월 12일 수요일 - 수정: 5.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Internet Information Services 7.5
  • Microsoft Internet Information Services 7.0
  • Microsoft Internet Information Services 6.0
키워드:?
kbmt kbinfo kbhowto KB929650 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.
이 문서의 영문 버전 보기:929650

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com