วิธีการใช้ SPNs เมื่อคุณได้กำหนดค่าโปรแกรมประยุกต์สำหรับเว็บที่เป็นโฮสต์ในบริการข้อมูลทางอินเทอร์เน็ต

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 929650 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

บทความนี้อธิบายถึงบริการชื่อหลัก (SPNs) นอกจากนี้บทความนี้อธิบายวิธีการใช้ SPNs เมื่อคุณกำหนดค่าโปรแกรมประยุกต์สำหรับเว็บที่เป็นโฮสต์บน Microsoft ข้อมูลบริการทางอินเทอร์เน็ต (IIS) นอกจากนี้บทความนี้อธิบายขั้นตอนการ Negotiate ใน Windows แบบรวมการรับรองความถูกต้อง การ Negotiate ความปลอดภัยหัวข้อให้ไคลเอนต์เลือกระหว่างการรับรองความถูกต้องของ Kerberos และการรับรองความถูกต้องของ NTLM

นอกจากนี้ บทความนี้อธิบายสถานการณ์ที่พบโดยทั่วไปที่จำเป็นต้องมี SPN เพื่อเปิดใช้งานการรับรองความถูกต้องของ Kerberos ส่วนสุดท้ายอธิบายสถานการณ์ที่ซึ่งการรับรองความถูกต้องของ Kerberos อาจล้มเหลว ส่วนสุดท้ายยังอธิบายขั้นตอนการแก้ไขปัญหาเบื้องต้น

บทนำ

สิ่งสำคัญหัวข้อที่กล่าวถึงในบทความนี้ใช้กับรายละเอียดบริการทางอินเทอร์เน็ต (IIS) 6.0 หัวข้อจะใช้กับ IIS 7.0 และ 7.5 ถ้าการรับรองความถูกต้องของโหมดเคอร์เนลถูกปิดใช้งาน โดยการตั้งค่าการตั้งค่าการตั้งค่าคอนฟิกuseKernelModeเมื่อต้องการเท็จ.
บทความที่มีการทีละขั้นตอนนี้อธิบายวิธีการใช้บริการชื่อหลัก (SPNs) เมื่อคุณกำหนดค่าของแอปพลิเคชันเว็บที่เป็นโฮสต์บนผ่านไป IIS.IIS หัวข้อการรักษาความปลอดภัย Negotiate เมื่อมีใช้การพิสูจน์ตัวจริงของ Windows แบบรวมการร้องขอของไคลเอ็นต์การรับรองความถูกต้อง การ Negotiate ความปลอดภัยหัวข้อให้ไคลเอนต์เลือกระหว่างการรับรองความถูกต้องของ Kerberos และการรับรองความถูกต้องของ NTLM กระบวนการ Negotiate เลือกการรับรองความถูกต้องของ Kerberos เว้นแต่มีเงื่อนไขใด ๆ ต่อไปนี้เป็นจริง:
  • ระบบที่เกี่ยวข้องกับการรับรองความถูกต้องอย่างใดอย่างหนึ่งไม่สามารถใช้การรับรองความถูกต้องของ Kerberos
  • โปรแกรมประยุกต์ที่เรียกไม่ได้ให้ข้อมูลเพียงพอที่จะใช้การรับรองความถูกต้องของ Kerberos
เมื่อต้องการเปิดใช้งานการประมวลผล Negotiate เพื่อเลือกโพรโทคอล Kerberos สำหรับการรับรองความถูกต้องของเครือข่าย แอพลิเคชันไคลเอนต์ต้องให้ SPN มี หลักชื่อผู้ใช้ (UPN), หรือชื่อบัญชี NetBIOS เป็นชื่อเป้าหมาย ถ้าแอพลิเคชันไคลเอนต์ไม่มีชื่อเป้าหมาย กระบวนการ Negotiate ไม่สามารถใช้โพรโทคอล Kerberos ถ้ากระบวนการ Negotiate ไม่สามารถใช้โพรโทคอล Kerberos กระบวนการ Negotiate เลือกโพรโทคอล NTLM

ข้อมูลเพิ่มเติม

แนวคิด

ข้อกำหนดของ SPN ข้อ

SPN มีชื่อที่ไคลเอนต์ระบุอินสแตนซ์ของบริการโดยเฉพาะ ถ้าคุณติดตั้งอินสแตนซ์หลายอินสแตนซ์ของบริการบนเครื่องคอมพิวเตอร์ทั่วทั้งฟอเรสต์ แต่ละอินสแตนซ์ของบริการต้องมี SPN ของตนเอง อินสแตนซ์การบริการเฉพาะที่สามารถมีหลาย SPNs ถ้ามีชื่อที่หลายที่ไคลเอ็นต์อาจใช้สำหรับการรับรองความถูกต้อง ตัวอย่างเช่น SPN มีชื่อของคอมพิวเตอร์เครื่องโฮสต์ที่อินสแตนซ์การบริการที่กำลังรันอยู่เสมอ ดังนั้น อินสแตนซ์การบริการที่อาจลงทะเบียนข้อ SPN สำหรับแต่ละชื่อหรือนามแฝงของโฮสต์ของ

ระดับชั้นบริการของ HTTP

ระดับชั้นบริการ HTTP แตกต่างจากโพรโทคอล HTTP โพรโทคอล HTTP และ HTTPS โพรโทคอลใช้ระดับชั้นบริการของ HTTP คลาบริการเป็นสายอักขระที่ระบุเป็นคลาสทั่วไปของบริการ ชื่อคลาสบริการที่รู้จักกันดีรวม "www" สำหรับบริการเว็บและ "ldap" สำหรับบริการไดเรกทอรี โดยทั่วไป ชื่อคลาสบริการสามารถเป็นสายอักขระที่ไม่ซ้ำกันเป็นคลาสบริการ โปรดทราบว่า ไวยากรณ์ SPN ใช้อักขระเครื่องหมายทับไปข้างหน้า (/) เพื่อแยกองค์ประกอบ ดังนั้น อักขระเครื่องหมายทับไปข้างหน้า (/) ไม่ปรากฏอยู่ในชื่อของระดับชั้นบริการ

บริการโฮสต์และ HTTP ให้บริการคลาส

บริการโฮสต์แทนคอมพิวเตอร์โฮสต์ โพรโทคอล Kerberos SPN โฮสต์ใช้ในการเข้าถึงคอมพิวเตอร์โฮสต์ โพรโทคอล Kerberos ใช้คีย์การระยะยาวบนคอมพิวเตอร์โฮสต์เพื่อสร้างบัตรการบริการ

ระดับชั้นบริการ HTTP มีบริการอยู่แล้วภายในที่ทำหน้าที่เป็นนามแฝงการ SPN โฮสต์อย่างใดอย่างหนึ่ง SPN โฮสต์ถูกแมปไปบัญชีคอมพิวเตอร์โฮสต์ ดังนั้น เมื่อคุณใช้ HTTP เป็นค่าเริ่มต้นเป็นการบริการระดับชั้น โพรโทคอล Kerberos ใช้บัญชีคอมพิวเตอร์เป็นบัญชีบริการบัตรบริการที่ร้องขอ

สถานการณ์สมมติ

ส่วนนี้อธิบายสถานการณ์ที่อาจต้องให้มี SPN นอกจากนี้ หัวข้อนี้อธิบายวิธีการตรวจสอบ SPN ใดการตั้งค่าสำหรับแต่ละสถานการณ์ เงื่อนไขต่อไปนี้จะใช้ในสถานการณ์เหล่านี้:
ยุบตารางนี้ขยายตารางนี้
IIS6server1ชื่อโฮสต์ของคอมพิวเตอร์ที่กำลังเรียกใช้ IIS
mydomainเชื่อมต่อคอมพิวเตอร์ IIS6server1 โดเมน
appPool1บัญชีผู้ใช้ที่อยู่ในโดเมน mydomain ที่ใช้สำหรับรหัสประจำตัวของพูลโปรแกรมประยุกต์
appPool2บัญชีผู้ใช้ที่อยู่ในโดเมน mydomain ที่ใช้สำหรับพูลโปรแกรม identity ที่สองของแอพลิเคชัน
www.test.comThe first host header for a Web site
www.test2.comThe second host header for a Web site
www.test3.comThe third host header for a Web site
www.myIIScluster.comThe fully qualified domain name of a cluster of computers that are running IIS
www.myEXCHcluster.comThe fully qualified domain name of a cluster of computers that are running Microsoft Exchange on IIS

The Setspn.exe tool

The Setspn.exe tool enables you to read, modify and delete the SPN directory property for an Active Directory service account. SPNs are used to locate a target principal name for running a service. The SetSpn.exe tool also enables you to view the current SPNs, reset the account's default SPNs, and add or delete supplemental SPNs.

เมื่อต้องการขอรับเครื่องมือ Setspn.exe สำหรับ Microsoft Windows Server 2003 คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
970536Setspn.exe สนับสนุนเครื่องมือการปรับปรุงสำหรับ Windows Server 2003

Scenario 1: Access an IIS application when the application pool identity has been modified

When an IIS application runs under a domain user account instead of under the default network service account, you must set the SPN for the HTTP service under the domain account. In this scenario, you access the IIS application by using either the NetBIOS name of the server that is running IIS or the FQDN of the server that is running IIS.

To access the IIS application by using the NetBIOS name, use the following command, whereNETBIOS_NAME_OF_IIS_SERVERis the NetBIOS name of the server that is running IIS:
Setspn –S HTTP/NETBIOS_NAME_OF_IIS_SERVERโดเมน\ชื่อ
For example, the command may resemble the following command:
Setspn –S HTTP/iis6server1 mydomain\appPool1
To access the IIS application by using the FQDN, use the following command, whereFQDN_OF_IIS_SERVERis the FQDN of the server that is running IIS:
Setspn –S HTTP/FQDN_OF_IIS_SERVERโดเมน\ชื่อ
For example, the command may resemble the following command:
Setspn –S HTTP/iis6server1.mydomain.com mydomain\appPool1

Scenario 2: Access a Web application by using a host header

When you access a Web application by using a host header, you must set an SPN for the HTTP service.

When you run the Web application under a default account such as the network service account, the local service account, or the local system account, you can use the following command:
Setspn –A HTTP/HOST_HEADERNETBIOS_NAME_OF_IIS_SERVER
ในคำสั่งนี้HOST_HEADERis the host header that you type in a browser window to access the application, andNETBIOS_NAME_OF_IIS_SERVERis the NetBIOS name of the server that is running IIS.

For example, the command for the application may resemble the following command:
Setspn –A HTTP/www.test.com iis6server1
If you run the application under a domain account, you can use the following command:
Setspn –A HTTP/HOSTHEADER_OR_DNS_ALIASโดเมน\ชื่อ
ในคำสั่งนี้HOSTHEADER_OR_DNS_ALIASis the host header or DNS alias that you use to access the Web application.

For example, the command for the application may resemble one of the following commands:
  • Setspn –A HTTP/www.test.com mydomain\appPool1
  • Setspn –A HTTP/www.test3.com mydomain\appPool2

Scenario 3: Access an IIS application in a clustered or load-balanced environment

When you run IIS in a clustered environment or in a load-balanced environment, you access applications by using the cluster name instead of by using a node name. This scenario includes network load balancing. In cluster technology, a node refers to one computer that is a member of the cluster. To use Kerberos as the authentication protocol in this scenario, the application pool identity on each IIS node must be configured to use the same domain user account. To configure each IIS node to use the same domain user account, use the following command:
Setspn –A HTTP/CLUSTER_NAMEโดเมน\ชื่อ
For example, the command may resemble one of the following commands:
  • Setspn –A HTTP/www.myIISCluster.com mydomain\appPool1
  • Setspn –A HTTP/www.myEXCHCluster.com mydomain\appPool2

Scenario 4: Use SQL Server to access an application

SPNs บนเซิร์ฟเวอร์สิ้นสุดหลังอาจต้องจะตรวจสอบถ้า แอพลิเคชันเว็บของ IIS ที่ต้องการเข้าถึงเครื่องคอมพิวเตอร์สิ้นสุดหลังที่กำลังเรียกใช้ SQL Server แอพลิเคชันเว็บอาจไม่ทำงานอย่างถูกต้องถ้า SPNs ที่จำเป็นต้องมีการกำหนดค่าไม่ถูกต้อง

ถ้าคอมพิวเตอร์สิ้นสุดหลังที่กำลังเรียกใช้ SQL Server ทำงานภายใต้บัญชีระบบภายใน หมาย MSSQLSvc /FQDN_OF_SQL_SERVER:portหมายเลขพอร์ตที่ต้องพร้อมใช้งานสำหรับชื่อของคอมพิวเตอร์ ใช้คำสั่งต่อไปนี้เพื่อดูว่า SPNs สำหรับคอมพิวเตอร์ที่ใช้ SQL Server:
Setspn –Lsql_server_computer_name
ใช้คำสั่งต่อไปนี้เพื่อตั้งค่า SPN สำหรับชื่อของคอมพิวเตอร์ที่ใช้ SQL Server:
MSSQLSvc –A Setspn /FQDN_OF_SQLSERVER:portsqlserver_computer_name
ถ้าคอมพิวเตอร์สิ้นสุดหลังที่กำลังเรียกใช้ SQL Server ทำงานภายใต้บัญชีโดเมน การ MSSQLSvc /FQDN_OF_SQL_SERVER:portหมายเลขพอร์ตที่ต้องพร้อมใช้งานสำหรับบัญชีโดเมน ใช้คำสั่งต่อไปนี้เพื่อดูว่า SPNs สำหรับบัญชีโดเมน:
โดเมน\ชื่อ –L Setspn
ใช้คำสั่งต่อไปนี้อย่างใดอย่างหนึ่งเพื่อตั้งค่า SPN สำหรับชื่อของคอมพิวเตอร์ที่ใช้ SQL Server:
  • MSSQLSvc –A Setspn /FQDN_OF_SQLSERVER:portfqdn_of_sqlserver
  • MSSQLSvc –A Setspn /FQDN_OF_SQLSERVER:portโดเมน\ชื่อ

สคริปต์ของผู้ช่วยเหลือ SPN

คุณสามารถใช้สคริปต์ตัวอย่างต่อไปนี้เพื่อค้นหา SPNs ที่สำหรับโปรแกรมประยุกต์ของ IIS คุณยังสามารถใช้สคริปต์นี้เพื่อค้นหาการซ้ำ SPNs เมื่อต้องการใช้สคริปต์นี้ ดำเนินการดังต่อไปนี้:
  1. คลิกเริ่มการทำงานคลิกเรียกใช้ประเภท:notepadแล้ว คลิกตกลง.
  2. ในแฟ้ม Notepad วางสคริปต์ต่อไปนี้:
    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

สิ่งต่างๆ ที่ต้องพิจารณาเพิ่มเติม:

การรับรองความถูกต้องของ kerberos อาจล้มเหลวเมื่อ SPNs ที่จำเป็นต้องมีการตั้งค่า สำหรับบัญชีคอมพิวเตอร์ หรือ สำหรับบัญชีโดเมน ถ้าการรับรองความถูกต้อง Kerberos ล้มเหลวโดยไม่คาดคิด ทำต่อไปนี้:
  • ตรวจสอบว่า SPNs ไม่ซ้ำกันอยู่ในแค็ตตาล็อกส่วนกลางสำหรับ SPN ข้อ

    ตัวอย่างเช่น ถ้า HTTP/www.test.com SPN ถูกตั้งค่า สำหรับบัญชี myDomain\appPool1 และบัญชี myDomain\appPool2, SPN ที่ซ้ำกันอยู่แม้ว่า SPNs มีการตั้งค่าสำหรับบัญชีที่แตกต่างกัน Additionally, if the HTTP/iis6server1.mydomain.com SPN is set for the myDomain\appPool1 account, and the HTTP/iis6server1.mydomain.com SPN is also associated with the computer account for the server, you also have a duplicate SPN. You can have one HOST SPN and one HTTP SPN. The explicit HTTP SPN will override the implicit one that is covered under the HOST entry. However, if the URL that the user types is associated with more than one user account or with more than one computer account, you have a duplicate SPN.
  • Verify that the SPNs have replicated to other domain controllers.

    Replication issues between the domain controllers can prevent the SPNs from replicating to the other domain controllers. When the SPNs do not replicate to the other domain controllers, the application may not work from some client computers. For example, if the HTTP/www.test.com SPN is set for the myDomain\appPool1 account on a domain controller, the HTTP/www.test.com SPN may not be found for the myDomain\appPool1 account on a second domain controller if the SPN has not been replicated to the second domain controller.

    หมายเหตุ:By default, replication takes 15 minutes.
  • Verify that the Web server is configured to support Kerberos authentication. To do this, verify that the setting for the NTAuthenticationProviders key in the IIS metabase has not been changed tontlm. The default setting isNegotiate,NTLM.
  • Verify that the server or service that is delegating the credentials is trusted for delegation.
  • Verify that the account that the service is running under is trusted for delegation.
  • In Active Directory, verify that theAccount is sensitive and cannot be delegatedcheck box is cleared for users who access the application.
  • If you are accessing the application directly from the server, verify that theLoopback Security Checkล้างข้อมูลกล่องกาเครื่องหมายไว้For more information about how to verify that the loopback check is disabled, click the following article number to view the article in the Microsoft Knowledge Base:
    896861คุณได้รับข้อผิดพลาด 401.1 เมื่อคุณเรียกดูเว็บไซต์ที่ใช้ การรับรองความถูกต้องรวม และโฮสต์บน IIS 5.1 หรือ IIS 6
  • Verify that the client is a Kerberos-enabled client. Also, verify that theEnable Windows Integrated Authenticationsetting is enabled in Internet Explorer. เมื่อต้องการทำเช่นนี้ คลิกตัวเลือกอินเทอร์เน็ตในการเครื่องมือเมนู คลิกการขั้นสูงแท็บ และจากนั้น ตรวจสอบที่จะEnable Windows Integrated Authenticationมีเลือกกล่องกาเครื่องหมาย
  • Verify that all computers that are part of the Kerberos process have consistent name resolution and are connected by Kerberos trust. For example, verify that the computers that are involved in the Kerberos process are in the same forest or are part of a cross-forest Kerberos trust.
  • Verify that the token size does not exceed the value that is set for theMaxTokenSizeคุณสมบัติ Also, verify that the request size does not exceed the value that is set for theMaxFieldLengthคุณสมบัติ These values may be exceeded if users who are part of the Kerberos process are members of many groups.
    920862เกิดข้อผิดพลาดเมื่อผู้ใช้ Outlook Web Access ที่คุณได้พยายามเข้าถึงกล่องจดหมายที่มีใน Exchange Server 2003: “ HTTP 400 การร้องขอไม่ถูกต้อง (ยาวเกินไปหัวข้อการร้องขอ) ”
  • Verify that the required security policies are enabled when you configure domain accounts for application pools. To do this, verify that the domain account is a member of the following local security policies on the computer that is running IIS:
    • การปรับปรุงโควต้าของหน่วยความจำสำหรับกระบวนการ
    • เข้าสู่ระบบเป็นการบริการ
    • โทเค็นระดับกระบวนการแทน
  • Verify that Kerberos authentication is working correctly over UDP. By default, Kerberos authentication uses UDP. However, the loss of UDP packets can cause Kerberos authentication to fail. When this issue occurs, you can force Kerberos authentication to use TCP.For more information about how to force Kerberos authentication to use TCP, click the following article number to view the article in the Microsoft Knowledge Base:
    244474วิธีการบังคับให้ Kerberos เพื่อใช้ TCP แทน UDP ใน Windows Server 2003 ใน Windows XP และ Windows 2000
  • Verify that the time stamp on the authenticator does not differ by more than five minutes from the time stamp of the server.For more information about how to resolve timestamp differences, click the following article number to view the article in the Microsoft Knowledge Base:
    232386Cannot log on if time and date are not synchronized
  • Verify that TCP/UDP port 88 is not blocked by a firewall or a router. By default, Kerberos authentication uses TCP/UDP port 88.
  • Verify that the domain mode environment is at least a Microsoft Windows 2000 native mode environment. For more information about how to determine the domain mode, visit the following Microsoft Web site:
    http://technet2.microsoft.com/windowsserver/en/library/11b2d3d3-980c-4b64-9ed3-51778f1fe5771033.mspx?mfr=true
  • On the client, verify that the URL for the Web application is added to the local intranet sites.For more information about how to add a URL to the local intranet, click the following article number to view the article in the Microsoft Knowledge Base:
    303650Intranet site is identified as an Internet site when you use an FQDN or an IP address
  • Verify that each gigabit ethernet device is using the latest driver version.สำหรับข้อมูลเพิ่มเติมเกี่ยวกับปัญหาที่เกิดขึ้นเมื่อไดรเวอร์สำหรับกิกะบิตอีเทอร์เน็ตอุปกรณ์ล้าสมัย คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
    326152ไม่สามารถเชื่อมต่อกับตัวควบคุมโดเมน และไม่สามารถใช้'นโยบายกลุ่ม'กับอุปกรณ์อีเทอร์เน็ตกิกะบิต

ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการใช้การรับรองความถูกต้องของ Kerberos กับเว็บไซต์ที่ดุลการโหลด แวะไปที่เว็บไซต์ต่อไปนี้ของ Microsoft:
http://technet.microsoft.com/en-us/library/cc757299.aspx
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับปัญหาที่เกิดขึ้นเมื่อคุณใช้การรับรองความถูกต้องของ Kerberos กับพร็อกซีเซิร์ฟเวอร์ คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
321728Internet Explorer ไม่สนับสนุนการรับรองความถูกต้อง Kerberos กับพร็อกซีเซิร์ฟเวอร์
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการกำหนดค่าคอนฟิก IIS เพื่อสนับสนุนโพรโทคอล Kerberos และโพรโทคอล NTLM สำหรับการรับรองความถูกต้องของเครือข่าย คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
215383วิธีการกำหนดค่า IIS เพื่อสนับสนุนโพรโทคอล Kerberos และโพรโทคอล NTLM สำหรับการรับรองความถูกต้องของเครือข่าย
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการกำหนดค่า เซิร์ฟเวอร์เสมือน Windows SharePoint Services เพื่อใช้การรับรองความถูกต้องของ Kerberos และวิธีการสลับจากการรับรองความถูกต้องของ Kerberos กลับไปยังการรับรองความถูกต้อง NTLM คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
832769วิธีการกำหนดค่าเซิร์ฟเวอร์เสมือน Windows SharePoint Services เพื่อใช้การรับรองความถูกต้องของ Kerberos และวิธีการสลับจากการรับรองความถูกต้องของ Kerberos กลับไปยังการรับรองความถูกต้องของ NTLM
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับปัญหาที่เกิดขึ้นเมื่อคุณใช้โพรโทคอลการรับรองความถูกต้อง Kerberos เพื่อเชื่อมต่อกับเว็บเซิร์ฟเวอร์ที่ใช้พอร์ต non-standard ใน Windows XP หรือ Windows Server 2003 คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
908209Internet Explorer 6 ไม่สามารถใช้โพรโทคอลการรับรองความถูกต้องของ Kerberos เพื่อเชื่อมต่อกับเว็บเซิร์ฟเวอร์ที่ใช้พอร์ต non-standard ใน Windows XP หรือ Windows Server 2003

คุณสมบัติ

หมายเลขบทความ (Article ID): 929650 - รีวิวครั้งสุดท้าย: 16 มกราคม 2554 - Revision: 2.0
ใช้กับ
  • Microsoft Internet Information Services 7.5
  • Microsoft Internet Information Services 7.0
  • Microsoft Internet Information Services 6.0
Keywords: 
kbinfo kbhowto kbmt KB929650 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ 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