Gewusst wie: SPNs zu verwenden, wenn Sie Webanwendungen gehostet werden, die auf Internet-Informationsdienste konfigurieren

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 929650 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel beschreibt die Dienstprinzipalnamen (SPNs). Dieser Artikel beschreibt außerdem, wie SPNs zu verwenden, wenn Sie Webanwendungen gehostet werden, die auf Microsoft Internet Information Services (IIS) konfigurieren. Dieser Artikel beschreibt außerdem den Negotiate-Prozess in die integrierte Windows-Authentifizierung. Die Negotiate Security Header können Clients wählen zwischen Kerberos-Authentifizierung und NTLM-Authentifizierung.

Dieser Artikel beschreibt außerdem allgemeine Szenarien, die einen SPN Aktivierung der Kerberos-Authentifizierung erfordern. Der letzte Abschnitt beschreibt die Situationen, in denen Kerberos-Authentifizierung fehlschlagen. Der letzte Abschnitt enthält außerdem Schritte zur Problembehandlung.

EINFÜHRUNG

Wichtig Die Themen, die in diesem Artikel beschriebenen gelten, Internet-Informationsdienste (IIS) 6.0. Die Themen gelten auch für IIS 7.0 und 7.5, wenn der Kernel-Mode-Authentifizierung deaktiviert ist, indem Sie die Konfiguration Einstellung UseKernelMode auf false festlegen.
Dieser in einzelne Schritte gegliederte Artikel beschreibt die Dienstprinzipalnamen (SPNs) beim Konfigurieren von Webanwendungen, die gehostet werden auf verwenden IIS.IIS übergibt den Negotiate-Sicherheitsheader, wenn die integrierte Windows-Authentifizierung zum Authentifizieren von Clientanforderungen verwendet wird. Die Negotiate Security Header können Clients wählen zwischen Kerberos-Authentifizierung und NTLM-Authentifizierung. Der Negotiate-Prozess wählt Kerberos-Authentifizierung, es sei denn, eine der folgenden Bedingungen erfüllt ist:
  • Eines der Systeme, die mit der Authentifizierung zusammenhängen kann Kerberos-Authentifizierung nicht verwenden.
  • Die aufrufende Anwendung bietet keine ausreichende Informationen zur Kerberos-Authentifizierung verwenden.
Damit den Negotiate-Prozess für das Kerberos-Protokoll für Netzwerkauthentifizierung zu wählen, muss die Clientanwendung einen DIENSTPRINZIPALNAMEN, ein Benutzerprinzipalname (UPN) oder einen NetBIOS-Kontonamen als den Zielnamen angeben. Wenn die Clientanwendung einen Zielnamen nicht bereitstellt, kann der Negotiate-Prozess nicht das Kerberos-Protokoll verwenden. Wenn der Negotiate-Prozess das Kerberos-Protokoll nicht verwenden kann, wählt der Negotiate-Prozess das NTLM-Protokoll.

Weitere Informationen

Konzepte

Definition des SPN

Ein SPN ist der Name mit dem ein Client eine Instanz eines Dienstes eindeutig identifiziert. Wenn Sie mehrere Instanzen eines Diensts auf Computern in einer Gesamtstruktur installieren, muss jede Dienstinstanz Ihren eigenen SPN haben. Eine bestimmte Dienstinstanz kann mehrere SPNs verfügen, wenn mehrere Namen, die Clients für die Authentifizierung verwenden können. Ein SPN enthält z. B. immer den Namen des Computers Host auf dem die Instanz für den Dienst ausgeführt wird. Aus diesem Grund könnte eine Dienstinstanz einen SPN für jeden Namen bzw. Aliasnamen des seinen Host registrieren.

Die HTTP-Dienst-Klasse

Die HTTP-Dienst-Klasse unterscheidet sich von der HTTP-Protokoll. Sowohl das HTTP-Protokoll HTTPS-Protokoll verwenden Sie die HTTP-Dienst-Klasse. Die Dienstklasse ist die Zeichenfolge, die die allgemeine Klasse von Dienst identifiziert. Bekannter Dienst Klassennamen gehören "Www" für einen Webdienst und "Ldap" für einen Verzeichnisdienst. Im Allgemeinen kann der Dienstname für die Klasse jede beliebige Zeichenfolge sein, die für die Dienstklasse eindeutig ist. Denken Sie daran, dass die SPN-Syntax einen Schrägstrich (/), verwendet um Elemente zu trennen. Daher kann der Schrägstrich (/) in einen Klassennamen Dienst nicht angezeigt werden.

Der HOST-Dienst und der HTTP-Dienst-Klasse

Der HOST-Dienst stellt den Host-Computer dar. Das Kerberos-Protokoll nutzt die HOST-SPN für den Zugriff auf den Computer Host. Das Kerberos-Protokoll verwendet die langfristigen Schlüssels auf dem Computer Host, um ein Dienstticket zu erstellen.

Die HTTP-Dienst-Klasse ist einer der integrierten Dienste, die als Alias für die HOST-SPN fungieren. Der HOST-SPN wird das Host-Computerkonto zugeordnet. Daher, wenn Sie die Standardklasse für HTTP-Dienst verwenden, verwendet das Kerberos-Protokoll das Computerkonto als Dienstkonto, um ein Dienstticket anzufordern.

Häufig vorkommende Szenarios

Dieser Abschnitt beschreibt Szenarios, in denen ein DIENSTPRINZIPALNAME erfordern. Außerdem veranschaulicht dieses Abschnitts bestimmen, welche DIENSTPRINZIPALNAMEN für jedes Szenario festgelegt. Die folgenden Begriffe werden in diesen Szenarien verwendet:
Tabelle minimierenTabelle vergrößern
IIS6server1Die Host-Namen des Computers, auf dem IIS ausgeführt wird
MeineDomäneDie Domäne, die mit der IIS6server1-Computer verbunden ist
appPool1Das Benutzerkonto in der Domäne MeineDomäne, die für die Identität des Anwendungspools verwendet wird
appPool2Das Benutzerkonto in der Domäne MeineDomäne, die für die zweite Anwendungspoolidentität verwendet wird
www.Test.comDie Kopfzeile der ersten Host für eine Website
www.test2.comDie Kopfzeile des zweiten Host für eine Website
www.test3.comDer dritte Host-Kopfzeile für eine Website
www.myIIScluster.comDer vollqualifizierte Domänenname eines Clusters von Computern, auf denen IIS ausgeführt wird
www.myEXCHcluster.comDen vollqualifizierten Domänennamen eines Clusters von Computern, auf denen Microsoft Exchange auf dem IIS ausgeführt wird

Das Programm "Setspn.exe"

Das Programm "Setspn.exe" können Sie zu lesen, ändern und löschen Sie die SPN-Verzeichnis-Eigenschaft für ein Active Directory-Dienstkonto. Dienstprinzipalnamen werden verwendet, um einen Ziel-principal Name für die Ausführung eines Dienstes suchen. Das SetSpn.exe-Tool können Sie auch die aktuelle SPNs anzeigen, die Konto-Standard-SPNs zurücksetzen und hinzufügen oder ergänzende SPNs zu löschen.

Klicken Sie auf die folgende KB-Artikelnummer, um das Programm "Setspn.exe" für Microsoft Windows Server 2003 zu beziehen:
970536"Setspn.exe" Support Tools Update für Windows Server 2003

Szenario 1: Greifen Sie IIS-Anwendung , wenn die Anwendungspoolidentität geändert wurde

Wenn eine IIS-Anwendung unter einem Domänenbenutzerkonto statt unter dem Standard-Netzwerkdienstkonto ausgeführt wird, müssen Sie den SPN für den HTTP-Dienst unter dem Domänenkonto festlegen. In diesem Szenario greifen Sie die IIS-Anwendung, indem Sie entweder den NetBIOS-Namen des Servers, auf dem IIS ausgeführt wird oder den vollqualifizierten Domänennamen des Servers, auf dem IIS ausgeführt wird.

Die IIS-Anwendung zugreifen, indem Sie den NetBIOS-Namen, verwenden Sie den folgenden Befehl ein, wobei ist NETBIOS_NAME_OF_IIS_SERVER den NetBIOS-Namen des Servers, auf dem IIS ausgeführt wird:
Setspn ? HTTP-s / NETBIOS_NAME_OF_IIS_SERVER domain\username
Der Befehl kann beispielsweise den folgenden Befehl ähneln:
Setspn ? s-HTTP-iis6server1-mydomain\appPool1
Die IIS-Anwendung zugreifen, indem Sie den FQDN zu verwenden, verwenden Sie den folgenden Befehl ein, wobei ist FQDN_OF_IIS_SERVER den vollqualifizierten Domänennamen des Servers, auf dem IIS ausgeführt wird:
Setspn ? HTTP-s / FQDN_OF_IIS_SERVER domain\username
Der Befehl kann beispielsweise den folgenden Befehl ähneln:
Setspn ? s HTTP/iis6server1.mydomain.com mydomain\appPool1

Szenario 2: Zugriff auf eine Webanwendung mithilfe eine Host-Kopfzeile

Wenn Sie eine Webanwendung mit einen Host-Header zugreifen, müssen Sie einen SPN für den HTTP-Dienst festlegen.

Wenn Sie die Webanwendung unter ein Standardkonto, z. B. das Netzwerkdienstkonto, das lokale Dienstkonto oder das lokale Systemkonto ausführen, können Sie den folgenden Befehl verwenden:
Setspn ? a HTTP / HOST_HEADER NETBIOS_NAME_OF_IIS_SERVER
In diesem Befehl ist HOST_HEADER die Host-Header, geben Sie in einem Browserfenster für den Zugriff auf die Anwendung und NETBIOS_NAME_OF_IIS_SERVER ist der NetBIOS-Name des Servers, auf dem IIS ausgeführt wird.

Der Befehl für die Anwendung kann z. B. den folgenden Befehl ähneln:
Setspn ? a HTTP/www.test.com iis6server1
Wenn die Anwendung unter einem Domänenkonto ausgeführt wird, können Sie den folgenden Befehl verwenden:
Setspn ? a HTTP / HOSTHEADER_OR_DNS_ALIAS domain\username
In diesem Befehl wird die HOSTHEADER_OR_DNS_ALIAS die Host-Header oder DNS-Alias, mit denen Sie die Webanwendung zugreifen.

Beispielsweise kann der Befehl für die Anwendung eine der folgenden Befehle ähneln:
  • Setspn ? a HTTP/www.test.com mydomain\appPool1
  • Setspn ? a HTTP/www.test3.com mydomain\appPool2

Szenario 3: Zugreifen auf eine IIS-Anwendung in einer Umgebung mit gruppierten oder mit Lastenausgleich

Wenn Sie IIS in einer Clusterumgebung oder in einer Umgebung mit Lastenausgleich ausführen, greifen Sie mithilfe der Clustername anstelle der Knotennamen Anwendungen. Dieses Szenario umfasst Netzwerk Lastenausgleich. In Clustertechnologie bezieht sich auf einem Computer, der Mitglied des Clusters ist ein Knoten. Für die Verwendung von Kerberos als Authentifizierungsprotokoll in diesem Szenario muss die Identität des Anwendungspools auf jedem Knoten IIS so konfiguriert werden, dass dasselbe Domänenbenutzerkonto verwenden. Verwenden Sie zum Konfigurieren der einzelnen IIS-Knoten dasselbe Domänenbenutzerkonto verwenden den folgenden Befehl ein:
Setspn ? a HTTP / CLUSTER_NAME Domäne\Benutzername
Der Befehl kann beispielsweise einen der folgenden Befehle ähneln:
  • Setspn ? a HTTP/www.myIISCluster.com mydomain\appPool1
  • Setspn ? a HTTP/www.myEXCHCluster.com mydomain\appPool2

Szenario 4: Verwenden von SQL Server Zugriff auf eine Anwendung

Der SPNs auf dem Back-End-Server eventuell überprüft werden, wenn die IIS-Webanwendung Zugriff auf einen Back-End-Computer erfordert, auf dem SQL Server ausgeführt wird. Die Webanwendung funktioniert möglicherweise nicht korrekt, wenn die erforderlichen SPNs falsch konfiguriert sind.

Wenn der Back-End-Computer mit SQL Server, unter dem lokalen Systemkonto, das MSSQLSvc ausgeführt wird / Portnummer FQDN_OF_SQL_SERVER:port die Computername verfügbar sein muss. Verwenden Sie den folgenden Befehl, um die SPNs für den Computer zu bestimmen, die SQL Server ausgeführt wird:
Setspn ?L SQL_SERVER_COMPUTER_NAME
Verwenden Sie den folgenden Befehl, um den SPN für den Namen des Computers festgelegt, auf dem SQL Server ausgeführt wird:
Setspn ? a MSSQLSvc / FQDN_OF_SQLSERVER:port SQLSERVER_COMPUTER_NAME
Wenn der Back-End-Computer mit SQL Server unter einem Domänenkonto die MSSQLSvc läuft / FQDN_OF_SQL_SERVER:port-Portnummer für das Domänenkonto verfügbar sein muss. Verwenden Sie den folgenden Befehl, um die SPNs für das Domänenkonto zu bestimmen:
Setspn ?L Domäne\Benutzername
Verwenden Sie eine der folgenden Befehle, um den SPN für den Namen des Computers festgelegt, auf dem SQL Server ausgeführt wird:
  • Setspn ? a MSSQLSvc / FQDN_OF_SQLSERVER:portFQDN_OF_SQLSERVER
  • Setspn ? a MSSQLSvc / FQDN_OF_SQLSERVER:portdomain\username

Der SPN-Helfer-Skript

Das folgende Beispielskript können Sie die SPNs für eine IIS-Anwendung gefunden werden. Mit diesem Skript können auch um doppelte SPNs zu suchen. Gehen Sie folgendermaßen vor um dieses Skript verwenden:
  1. Klicken Sie auf Start, klicken Sie auf Ausführen, geben Sie Notepad, und klicken Sie dann auf OK.
  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. Speichern Sie die Datei unter Spnhelper.vbs.
  4. Führen Sie an einer Eingabeaufforderung die Spnhelper.vbs-Datei mithilfe der entsprechenden Befehlszeilenoption.

    Hinweis: Zum Anzeigen der Befehlszeilenoptionen für die Datei Spnhelper.vbs Spnhelper.vbs/help an einer Eingabeaufforderung eingeben, und drücken Sie anschließend die [EINGABETASTE].

Weitere Überlegungen

Kerberos-Authentifizierung kann fehlschlagen, wenn die erforderlichen SPNs für die Computerkonten oder für Konten der Domäne festgelegt sind. Wenn die Kerberos-Authentifizierung unerwartet fehlschlägt, gehen Sie folgendermaßen vor:
  • Stellen Sie sicher, dass keine doppelte SPNs für einen SPN im globalen Katalog vorhanden sind.

    Z. B. wenn der HTTP/www.test.com-SPN für das myDomain\appPool1-Konto und für das myDomain\appPool2-Konto festgelegt ist, gibt es ein doppelter SPN, obwohl die SPNs für unterschiedliche Konten festgelegt werden. Darüber hinaus haben Wenn der HTTP/iis6server1.mydomain.com-SPN für das myDomain\appPool1-Konto festgelegt ist und der HTTP/iis6server1.mydomain.com-SPN auch das Computerkonto für den Server zugeordnet ist, Sie auch einen doppelten SPN. Sie können eine HOST-SPN und einen HTTP-SPN haben. Die explizite HTTP-SPN überschreibt implizite diejenige, die unter dem HOST-Eintrag abgedeckt wird. Jedoch, wenn der URL, dass die Benutzereingabe mit mehr als ein Benutzerkonto oder mit mehr als ein Computerkonto verknüpft ist, Sie haben einen doppelten SPN.
  • Stellen Sie sicher, dass der SPNs auf andere Domänencontroller repliziert wurden.

    Probleme bei der Replikation zwischen Domänencontrollern können verhindern, dass der SPNs auf andere Domänencontroller replizieren. Wenn die SPNs nicht auf andere Domänencontroller replizieren, die Anwendung funktioniert möglicherweise nicht aus einige Clientcomputer. Beispielsweise kann HTTP/www.test.com-SPN für das myDomain\appPool1-Konto auf einem Domänencontroller festgelegt ist, der HTTP/www.test.com-SPN nicht gefunden werden für das myDomain\appPool1-Konto auf einem zweiten Domänencontroller Wenn Sie der SPN nicht auf den zweiten Domänencontroller repliziert wurde.

    Hinweis: In der Standardeinstellung nimmt die Replikation 15 Minuten.
  • Stellen Sie sicher, dass der Webserver für die Unterstützung der Kerberos-Authentifizierung konfiguriert ist. Dazu stellen Sie sicher, dass die Einstellung für die Eigenschaft "NTAuthenticationProviders" Schlüssel in der IIS-Metabasis auf NTLM nicht geändert wurde. Die Standardeinstellung ist die Negotiate, NTLM.
  • Stellen Sie sicher, dass der Server oder Dienst, der die Anmeldeinformationen zu delegieren, wird für Delegierungszwecke vertraut wird.
  • Stellen Sie sicher, dass das Konto, unter der Dienst ausgeführt wird, für Delegierungszwecke vertraut wird.
  • In Active Directory stellen Sie sicher, dass das Kontrollkästchen Konto ist vertraulich und kann nicht delegiert werden für Benutzer deaktiviert ist, die die Anwendung zugreifen.
  • Wenn Sie die Anwendung direkt vom Server zugreifen, stellen Sie sicher, dass das Kontrollkästchen <a0>Loopback-Sicherheitsüberprüfung deaktiviert ist.Weitere Informationen dazu, wie Sie sicherstellen, dass die Loopback-Kontrollkästchen deaktiviert ist, klicken Sie auf die folgende KB-Artikelnummer:
    896861Fehlermeldung 401.1 beim Browsen einer Website, die integrierte Authentifizierung verwendet und IIS 5.1 oder IIS 6 gehostet wird
  • Stellen Sie sicher, dass der Client ein Kerberos-fähigen Client ist. Stellen Sie außerdem sicher, dass die Integrierte Windows-Authentifizierung aktivieren in Internet Explorer aktiviert ist. Dazu klicken Sie im Menü Extras auf Internetoptionen, klicken Sie auf die Registerkarte Erweitert, und stellen Sie sicher, dass das Kontrollkästchen Integrierte Windows-Authentifizierung aktivieren aktiviert ist.
  • Stellen Sie sicher, dass alle Computer, die Bestandteil des Kerberos-Prozesses sind konsistent Namensauflösung haben und vom Kerberos-Vertrauensstellung verbunden sind. Beispielsweise stellen Sie sicher, dass die Computer, die an den Kerberos-Prozess beteiligt sind in derselben Gesamtstruktur oder sind Teil einer gesamtstrukturübergreifenden Kerberos-Vertrauensstellung.
  • Stellen Sie sicher, dass die token-Größe nicht den Wert übersteigt, der für die <a0>MaxTokenSize</a0>-Eigenschaft festgelegt ist. Stellen Sie außerdem sicher, dass die Größe der Anforderung nicht den Wert übersteigt, der für die Eigenschaft "MaxFieldLength" festgelegt ist. Diese Werte möglicherweise überschritten werden, wenn der Benutzer, die Bestandteil des Kerberos-Prozesses sind vielen Gruppen angehören.
    920862Fehlermeldung, wenn ein Benutzer von Outlook Web Access, versucht Zugriff auf ein Postfach in Exchange Server 2003: ? HTTP 400 Bad Request (Anforderung Header zu lang) ?
  • Stellen Sie sicher, dass die erforderlichen Sicherheitsrichtlinien aktiviert werden, wenn Sie Domänenkonten für Anwendungspools konfigurieren. Dazu stellen Sie sicher, dass das Domänenkonto eine der folgenden lokalen Sicherheitsrichtlinien auf dem Computer angehört, auf dem IIS ausgeführt wird:
    • Anpassen von Speicherkontingenten für einen Prozess
    • Anmelden als Dienst
    • Ersetzen ein Tokens auf Prozessebene
  • Überprüfen Sie, dass Kerberos-Authentifizierung über UDP funktionsfähig ist. Standardmäßig wird Kerberos-Authentifizierung UDP verwendet. Verlust der UDP-Pakete kann jedoch Kerberos-Authentifizierung zu einem Ausfall führen. Wenn dieses Problem auftritt, können Sie erzwingen, dass Kerberos-Authentifizierung zur Verwendung von TCP. Weitere Informationen dazu, wie die Kerberos-Authentifizierung zur Verwendung von TCP zu erzwingen klicken Sie auf die folgende KB-Artikelnummer:
    244474So erzwingen Sie, dass Kerberos zur Verwendung von TCP anstatt UDP in Windows Server 2003, Windows XP und Windows 2000
  • Stellen Sie sicher, dass der Zeitstempel der Echtheitsbestätigung nicht durch mehr als fünf Minuten von der Zeitstempel des Servers unterscheiden. Weitere Informationen zum Timestamp Unterschiede zu beheben klicken Sie auf die folgende KB-Artikelnummer:
    232386Anmeldung nicht möglich, wenn Uhrzeit oder Datum nicht synchronisiert sind
  • Stellen Sie sicher, dass TCP/UDP-Port 88 nicht durch eine Firewall oder einen Router gesperrt wird. Kerberos-Authentifizierung verwendet standardmäßig die TCP/UDP-Port 88.
  • Stellen Sie sicher, dass die Domänenumgebung Modus mindestens einer Umgebung mit Microsoft Windows 2000 im einheitlichen Modus ist. Weitere Informationen darüber, wie Sie den Domänenmodus feststellen können, finden Sie auf folgender Website von Microsoft:
    http://technet2.microsoft.com/windowsserver/en/library/11b2d3d3-980c-4b64-9ed3-51778f1fe5771033.mspx?mfr=true
  • Überprüfen Sie, dass der URL für die Webanwendung der lokalen Intranetsites hinzugefügt wird, auf dem Client. Weitere Informationen dazu, wie Sie einen URL mit dem lokalen Intranet hinzuzufügen klicken Sie auf die folgende KB-Artikelnummer:
    303650Intranetsite wird bei Verwendung einer FQDN- oder IP-Adresse als eine Internetsite identifiziert
  • Stellen Sie sicher, dass jedes Gigabit-Ethernet-Gerät die neueste Version des Treibers. Weitere Informationen zu Problemen, die auftreten können, wenn die Treiber für Gigabit-Ethernet-Geräte veraltet sind, klicken Sie auf die folgende KB-Artikelnummer:
    326152Kann keine Verbindung mit Domänencontroller herstellen und kann nicht anwenden von Gruppenrichtlinien mit Gigabit-Ethernet-Geräten

Informationsquellen

Weitere Informationen zur Verwendung von Kerberos-Authentifizierung bei Websites mit Lastenausgleich die folgende Microsoft-Website:
http://technet.microsoft.com/en-us/library/cc757299.aspx
Weitere Informationen zu Problemen, die auftreten können, wenn Sie die Kerberos-Authentifizierung mit Proxyserver verwenden, klicken Sie auf die folgende KB-Artikelnummer:
321728Internet Explorer unterstützt keine Kerberos-Authentifizierung mit Proxyservern
Weitere Informationen zum Konfigurieren von IIS sowohl das Kerberos-Protokoll als auch das NTLM-Protokoll für Netzwerkauthentifizierung zu unterstützen klicken Sie auf die folgende KB-Artikelnummer:
215383Gewusst wie: Konfigurieren von IIS sowohl das Kerberos-Protokoll als auch das NTLM-Protokoll für Netzwerkauthentifizierung zu unterstützen.
Weitere Informationen zum Konfigurieren ein virtueller Windows SharePoint Services-Server Kerberos-Authentifizierung und Wechseln von Kerberos-Authentifizierung zurück zur NTLM-Authentifizierung verwenden klicken Sie auf die folgende KB-Artikelnummer:
832769So konfigurieren Sie einen virtuellen Windows SharePoint Services-Server für die Kerberos-Authentifizierung und Wechseln von Kerberos-Authentifizierung zurück zur NTLM-Authentifizierung
Weitere Informationen zu Problemen, die auftreten können, wenn Sie Kerberos-Authentifizierungsprotokoll, verwenden um eine Verbindung zu einem Webserver, der einen nicht standardmäßigen Port auf Windows XP verwendet oder Windows Server 2003 herstellen, klicken Sie auf die folgende KB-Artikelnummer:
908209Internet Explorer 6 kann nicht das Kerberos-Authentifizierungsprotokoll verwenden, Herstellen einer Verbindung mit einem Webserver, der einen nicht standardmäßigen Port auf Windows XP verwendet oder Windows Server 2003

Eigenschaften

Artikel-ID: 929650 - Geändert am: Mittwoch, 12. Mai 2010 - Version: 5.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Internet Information Services 7.5
  • Microsoft Internet Information Services 7.0
  • Microsoft Internet Information Services 6.0
Keywords: 
kbmt kbinfo kbhowto KB929650 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 929650
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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