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

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本: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, domainInputFunction Help()Dim strMessagestrMessage = 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.QuitEnd FunctionFunction 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 ifEnd FunctionFunction resetValues()	spnToSearch = ""	objCategory = ""	strFilter = ""End FunctionFunction 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 & "/" & tempStrEnd FunctionFunction 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 FunctionFunction isSPNInputValid(spnIN)	isSPNInputValid = ""	If instr(spnIN,"/")=0 Then Exit Function	If instr(spnIN,"*")>0 Then Exit Function	isSPNInputValid = spnINEnd FunctionFunction 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 FunctionFunction getPingResult(hostName,errorMessage)'On Error Resume NextgetPingResult = ""	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 = hostNameExit Function'If Err Then getPingResult = hostNameEnd FunctionFunction 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.MessageEnd FunctionFunction 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.CloseEnd FunctionFunction 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 SelectEnd Functioncall 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 網站]:
  • 在 [用戶端確認 Web 應用程式的 URL 會加入至近端內部網路網站。如需有關如何將 URL 加入至近端內部網路的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
    303650內部網路網站被識別為網際網路站台上,當您使用 FQDN 或 IP 位址
  • 確認每一個 Gigabit 乙太網路裝置使用最新的驅動程式版本。如 Gigabit 乙太網路裝置的驅動程式已經過期時可以發生的問題的更多有關,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
    326152無法連線到網域控制站,並不能套用群組原則與十億位元乙太網路裝置
参考
如需有關如何使用 Kerberos 驗證與負載平衡的 Web 網站的詳細資訊,請造訪下列 Microsoft 網站]:如與 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 - 最後檢閱時間:05/12/2010 22:02:25 - 修訂: 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
意見反應