如何使用的 SPN,當網際網路資訊服務上設定裝載的 Web 應用程式

文章翻譯 文章翻譯
文章編號: 929650 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將告訴您服務主要名稱 (SPN)。本文也說明如何使用的 SPN,當您在 Microsoft 「 網際網路資訊服務 (IIS) 設定裝載的 Web 應用程式。本文也將告訴您在 Windows 整合式驗證交涉程序。[交涉安全性標頭可讓用戶端選取 Kerberos 驗證和 NTLM 驗證之間。

此外,本文將告訴您需要啟用 Kerberos 驗證 SPN 的常見案例。 最後一節將說明 Kerberos 驗證可能會失敗的情況。最後一節也提供疑難排解步驟。

簡介

重要本文中討論的主題套用至網際網路資訊服務 (IIS) 6.0。 主題也會套用到 IIS 7.0 和 7.5 如果組態設定 useKernelMode為 false 停用核心模式驗證。
本文將逐步告訴您,如何使用服務主要名稱 (SPN) 當您設定裝載的 Web 應用程式上 IIS.IIS 傳遞交涉安全性標頭 Windows 整合式驗證來驗證用戶端要求時。[交涉安全性標頭可讓用戶端選取 Kerberos 驗證和 NTLM 驗證之間。除非發生下列情況之一是,則為 True,交涉程序會選取 Kerberos 驗證:
  • 其中涉及驗證系統無法使用 Kerberos 驗證。
  • 呼叫的應用程式不會提供足夠的資訊來使用 Kerberos 驗證。
若要以便交涉程序選取 Kerberos 通訊協定的網路驗證用戶端應用程式必須提供 SPN、 一個使用者主要名稱 (UPN) 或 NetBIOS 帳戶名稱做為目標名稱。如果用戶端應用程式並不提供目標名稱,交涉程序不能使用 Kerberos 通訊協定。如果交涉程序不能使用 Kerberos 通訊協定,交涉程序會選擇 NTLM 通訊協定。

其他相關資訊

概念

定義的 SPN

SPN 是用用戶端唯一地識別服務的執行個體名稱。如果您在整個樹系的電腦上安裝多個服務執行個體,每個服務執行個體必須要有它自己的 SPN。特定的服務執行個體可以有多個的 SPN,如果有多個用戶端可能會用於驗證的名稱。比方說 SPN 永遠包括在其執行的服務執行個體的主機電腦的名稱。因此,服務執行個體可能註冊 SPN 針對每個名稱或別名其主機。

HTTP 服務類別

HTTP 服務類別不同於 HTTP 通訊協定。HTTP 通訊協定和 HTTPS 通訊協定使用 HTTP 服務類別。服務類別是識別服務的一般類別的字串。已知服務類別名稱包含"www 」 Web 服務和"ldap 「 目錄服務的。通常,服務類別名稱可以是唯一服務類別的任何字串。要注意 SPN 語法使用正斜線字元 (/) 來分隔項目。因此,正斜線字元 (/) 不能出現在服務類別名稱。

HOST 服務並 HTTP 服務類別

HOST 服務代表主機電腦。Kerberos 通訊協定會使用 HOST SPN,來存取主機電腦。Kerberos 通訊協定會使用主機電腦上的長期的機碼來建立服務票證。

HTTP 服務類別是其中一個內建的服務,以當作所主持 SPN 的別名。HOST SPN 被對應至主機電腦帳戶。因此,當您使用 [預設 HTTP 服務類別 Kerberos 通訊協定使用電腦帳戶以服務帳戶要求服務票證。

常見的案例

這一節將說明可能需要 SPN 的案例。此外,這一節會示範如何判斷每個案例設定哪一個 SPN。在這些案例中使用下列詞彙:
摺疊此表格展開此表格
IIS6server1執行 IIS 的電腦的主機名稱
mydomainIIS6server1 電腦已加入網域
appPool1在應用程式集區識別用於 mydomain 網域使用者帳戶
appPool2在第二個應用程式集區識別用於 mydomain 網域使用者帳戶
www.test.com第一個 Web 網站的主機標頭
www.test2.com第二個主機標頭的網站
www.test3.com第三個的主機標頭的網站
www.myIIScluster.com執行 IIS 的電腦的叢集完整格式的網域名稱
www.myEXCHcluster.com完整格式的網域名稱的電腦在 IIS 執行 Microsoft Exchange 叢集的

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: 修改應用程式集區識別時,存取 IIS 應用程式

當網域使用者帳戶而不是預設的網路服務帳戶下執行 IIS 應用程式時,您必須設定 HTTP 服務網域帳戶的 SPN。在這種情況下,請使用執行 IIS 的伺服器的 NetBIOS 名稱或執行 IIS 的伺服器的 FQDN 來存取 IIS 應用程式。

使用 NetBIOS 名稱,以存取 IIS 應用程式,使用下列命令,NETBIOS_NAME_OF_IIS_SERVER 其中是 NetBIOS 名稱執行 IIS 的伺服器的:
Setspn –S HTTP / NETBIOS_NAME_OF_IIS_SERVER domain\username
比方說命令可能會類似下列的命令:
Setspn –S HTTP/iis6server1 mydomain\appPool1
使用 FQDN 存取 IIS 應用程式,使用下列命令,FQDN_OF_IIS_SERVER 其中是執行 IIS 的伺服器的 FQDN:
Setspn –S HTTP / FQDN_OF_IIS_SERVER domain\username
比方說命令可能會類似下列的命令:
Setspn –S HTTP/iis6server1.mydomain.com mydomain\appPool1

案例 2: 使用主機標頭來存取 Web 應用程式

當您使用主機標頭來存取 Web 應用程式時,您必須設定 HTTP 服務的 SPN。

您在執行 Web 應用程式,例如網路服務帳戶、 本機服務] 帳戶或本機系統帳戶在預設帳戶時,您可以使用下列命令:
Setspn – HTTP / HOST_HEADER NETBIOS_NAME_OF_IIS_SERVER
在這個命令 HOST_HEADER 是伺服器的主機標頭,您在要存取應用程式的瀏覽器視窗中輸入,但 NETBIOS_NAME_OF_IIS_SERVER 是伺服器的執行 IIS 的 NetBIOS 名稱。

比方說應用程式的指令可能會類似下列的命令:
Setspn – HTTP/www.test.com iis6server1
如果您在執行應用程式在網域帳戶,您可以使用下列命令:
Setspn – HTTP / HOSTHEADER_OR_DNS_ALIAS domain\username
在這個命令 HOSTHEADER_OR_DNS_ALIAS 是主機標頭或您用來存取 Web 應用程式的 DNS 別名。

比方說應用程式的指令可能會類似下列命令其中之一:
  • Setspn – HTTP/www.test.com mydomain\appPool1
  • Setspn – HTTP/www.test3.com mydomain\appPool2

案例 3: 存取叢集或負載平衡的環境中 IIS 應用程式

當您在叢集環境中,或在負載平衡的環境中執行 IIS 時的應用程式使用存取叢集名稱,而不使用節點名稱。此案例包含網路負載平衡。在叢集技術節點是指一台電腦是叢集中的成員。要作為驗證通訊協定,在這種情況下 Kerberos,應用程式集區識別 IIS 中的每個節點上必須設定為使用相同的網域使用者帳戶。若要進行每個 IIS] 節點,以使用相同的網域使用者帳戶使用下列命令:
Setspn – HTTP / CLUSTER_NAME 網域 \ 使用者名稱
比方說命令可能會類似下列命令其中之一:
  • Setspn – HTTP/www.myIISCluster.com mydomain\appPool1
  • Setspn – HTTP/www.myEXCHCluster.com mydomain\appPool2

若要存取應用程式案例 4: 使用 SQL Server

後端伺服器上的 SPN 可能要進行確認 IIS Web 應用程式是否需要執行 SQL Server 的後端電腦的存取。如果必要的 SPN 設定不正確,Web 應用程式可能無法正確運作。

如果執行 SQL Server 的後端電腦執行在本機系統帳戶 「 MSSQLSvc 下 / FQDN_OF_SQL_SERVER:port 連接埠號碼必須是可用的電腦名稱。使用下列命令來決定執行 SQL Server 電腦的 SPN:
Setspn –L SQL_SERVER_COMPUTER_NAME
使用下列命令來設定名稱執行 SQL Server 的電腦的 SPN:
Setspn – MSSQLSvc / FQDN_OF_SQLSERVER:port SQLSERVER_COMPUTER_NAME
如果執行 SQL Server 的後端電腦執行在網域帳戶 [MSSQLSvc 下 / FQDN_OF_SQL_SERVER:port 連接埠號碼必須是可用的網域帳戶。使用下列命令來判斷網域帳戶的 SPN:
Setspn –L 網域 \ 使用者名稱
使用下列命令其中之一來設定名稱執行 SQL Server 的電腦的 SPN:
  • Setspn – MSSQLSvc / FQDN_OF_SQLSERVER:portFQDN_OF_SQLSERVER
  • Setspn – MSSQLSvc / FQDN_OF_SQLSERVER:portdomain\username

SPN Helper 指令碼

若要尋找之 SPN 的 IIS 應用程式,您可以使用下列的範例指令碼。您也可以使用這個指令碼來尋找重複的 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 將會覆寫隱含涵蓋 HOST 項目下的一個。不過,如果 URL,使用者型別有關聯的多個使用者帳號或一個以上的電腦帳戶,您有重複的 SPN。
  • 請確認 [SPN 有複寫到其他網域控制站。

    網域控制站之間的複寫問題可以防止 [SPN 複寫到其他網域控制站。當 [SPN 不要複寫到其他網域控制站時,應用程式可能無法運作從某些用戶端電腦上。比方說如果 HTTP/www.test.com SPN myDomain\appPool1 帳戶在網域控制站上設定,HTTP/www.test.com SPN 會找不到第二個網域控制站上 myDomain\appPool1 帳戶如果 SPN 尚未被複寫到第二個網域控制站。

    附註預設情況下,複寫需要花費 15 分鐘。
  • 請確認 Web 伺服器設定以支援 Kerberos 驗證。若要執行此動作確認 [在 IIS Metabase NTAuthenticationProviders 機碼設定不已變更 NTLM]。預設值是 交涉、 NTLM
  • 請確認伺服器或委派認證的服務是受信任可以委派。
  • 請確認服務正在執行之下的帳戶受信任可以委派。
  • 確認 [Active Directory 中的 [[是機密帳戶,無法委派] 核取方塊被清除的存取應用程式的使用者]。
  • 如果您直接從伺服器存取應用程式,請確認清除 迴路測試安全性檢查] 核取方塊。如需有關如何確認已停用回送] 核取的資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
    896861當您瀏覽的網站,使用 「 整合式驗證 」 且裝載在 IIS 5.1 或 IIS 6 上時,收到錯誤 401.1
  • 請確認用戶端是 Kerberos 啟用用戶端。而且,確認 [啟用 Windows 整合式驗證 設定已啟用在 Internet Explorer 中。若要執行此動作,按一下 [工具] 功能表上的 [網際網路選項]、 按一下 [進階] 索引標籤並再確定已選取 [啟用 Windows 整合式驗證] 核取方塊。
  • 請確認 Kerberos 程序的一部分的所有電腦有一致的名稱解析,而且由 Kerberos 信任連接。比方說驗證 Kerberos 程序中所涉及的電腦位於相同的樹系中,或是不跨樹系 Kerberos 信任的一部份。
  • 請確認語彙基元大小不會超過為 MaxTokenSize 屬性設定值。此外,請確認要求大小不會超過為 MaxFieldLength 屬性設定值。如果 Kerberos 程序的一部分的使用者是多個群組的成員,可能會超過這些值。
    920862當一個 Outlook Web Access 使用者嘗試存取 Exchange Server 2003 中的信箱時,出現錯誤訊息: 「 HTTP 400 錯誤的要求 (過長要求頁首) 」
  • 請設定應用程式集區的網域帳戶時啟用必要的安全性原則。如果要執行此動作確認網域帳戶是下列本機安全性原則執行 IIS 的電腦上的成員:
    • 調整處理程序的記憶體配額
    • 登入為服務
    • 更換處理層權杖
  • 確認 Kerberos 驗證正常運作透過 UDP。根據預設值,Kerberos 驗證會使用 UDP。不過,UDP 封包損失可能會造成 Kerberos 驗證失敗。這個問題時,您可以強制使用 TCP 的 Kerberos 驗證。如更多有關如何強制使用 TCP 的 Kerberos 驗證,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
    244474如何強制使用 TCP,而不是 Windows Server 2003 中、 Windows XP 以及 Windows 2000 的 UDP Kerberos
  • 請確認時間戳記在驗證者不會與不不同由超過五分鐘從時間戳記伺服器。如需有關如何解決時間戳記的差異的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
    232386如果不同步的時間和日期不能登入
  • 請確認 TCP/UDP 連接埠 88 未由防火牆或路由器封鎖。根據預設值,Kerberos 驗證會使用 TCP/UDP 連接埠 88。
  • 驗證網域模式環境至少一個 Microsoft Windows 2000 原生模式的環境。如需有關如何判斷網域模式的詳細資訊,請造訪下列 Microsoft 網站]:
    http://technet2.microsoft.com/windowsserver/en/library/11b2d3d3-980c-4b64-9ed3-51778f1fe5771033.mspx?mfr=true
  • 在 [用戶端確認 Web 應用程式的 URL 會加入至近端內部網路網站。如需有關如何將 URL 加入至近端內部網路的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
    303650內部網路網站被識別為網際網路站台上,當您使用 FQDN 或 IP 位址
  • 確認每一個 Gigabit 乙太網路裝置使用最新的驅動程式版本。如 Gigabit 乙太網路裝置的驅動程式已經過期時可以發生的問題的更多有關,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
    326152無法連線到網域控制站,並不能套用群組原則與十億位元乙太網路裝置

?考

如需有關如何使用 Kerberos 驗證與負載平衡的 Web 網站的詳細資訊,請造訪下列 Microsoft 網站]:
http://technet.microsoft.com/en-us/library/cc757299.aspx
如與 Proxy 伺服器使用 Kerberos 驗證可以發生的問題的更多有關,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
321728Internet Explorer 不支援使用 Proxy 伺服器的 Kerberos 驗證
如需有關如何設定 IIS 以支援 Kerberos 通訊協定和 NTLM 通訊協定網路驗證的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
215383如何將 IIS 設定為支援網路驗證 Kerberos 通訊協定和 NTLM 通訊協定
如更多有關如何設定要使用 Kerberos 驗證,以及如何從 Kerberos 驗證切換回到 NTLM 驗證的 Windows SharePoint 服務虛擬伺服器會按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
832769如何設定 Windows SharePoint 服務虛擬伺服器來使用 Kerberos 驗證,以及如何從 Kerberos 驗證切換回到 NTLM 驗證
如當您使用 Kerberos 驗證通訊協定來連線到使用非標準的連接埠,在 Windows XP 上的 Web 伺服器或 Windows Server 2003 可以發生的問題的更多有關,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
908209Internet Explorer 6 不能使用 Kerberos 驗證通訊協定來連線到使用非標準的連接埠,在 Windows XP 上的 Web 伺服器或 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 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:929650
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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