インターネット インフォメーション サービスでホストされている Web アプリケーションを構成するときは、Spn を使用する方法

文書翻訳 文書翻訳
文書番号: 929650
すべて展開する | すべて折りたたむ

目次

概要

この資料では、サービス プリンシパル名 (Spn) について説明します。Microsoft インターネット インフォメーション サービス (IIS) でホストされている Web アプリケーションを構成する場合、Spn を使用する方法についても説明します。Windows 統合認証に Negotiate プロセスについても説明します。Negotiate セキュリティ ヘッダーを使用できますクライアント選択間の Kerberos 認証と NTLM 認証。

また、この資料では、Kerberos 認証を有効にするのには、SPN を必要とする一般的なシナリオについて説明します。最後のセクションで Kerberos 認証が失敗する場合があります状況をについて説明します。最後のセクションもトラブルシューティング手順を説明します。

はじめに

重要です この資料に記載されているトピックは、インターネット インフォメーション サービス (IIS) 6.0 に適用されます。カーネル モード認証の設定を設定することで無効になっている場合は、トピックは、IIS 7.0 および 7.5 に適用することも useKernelMode するには false.
この資料では、IIS 上でホストされている Web アプリケーションを構成するときは、サービス プリンシパル名 (Spn) を使用する方法について説明します。クライアント要求の認証に統合 Windows 認証を使用すると IIS は Negotiate セキュリティ ヘッダーを渡します。Negotiate セキュリティ ヘッダーを使用できますクライアント選択間の Kerberos 認証と NTLM 認証。次の条件のいずれかの場合を除き、Negotiate プロセス Kerberos 認証を選択します。
  • 認証に関連するシステムのいずれかの Kerberos 認証を使用することはできません。
  • 呼び出し元のアプリケーションに Kerberos 認証を使用する場合は、十分な情報がありません。
ネットワーク認証に Kerberos プロトコルを選択するのには、ネゴシエーション プロセスを有効にするには、クライアント アプリケーションの SPN、ユーザー プリンシパル名 (UPN)、または NetBIOS アカウント名としてターゲット名指定してください。クライアント アプリケーションは、ターゲット名が得られない場合は、ネゴシエート プロセスは、Kerberos プロトコルを使用できません。Negotiate プロセスは、Kerberos プロトコルを使用できない場合は、NTLM プロトコル ネゴシエーション プロセスを選択します。

詳細

概念

SPN の定義

SPN によって、クライアントがサービスのインスタンスを一意に識別する名前です。フォレスト全体でサービスの複数のインスタンスをインストールすると、サービスの各インスタンスは独自の SPN が必要です。クライアントの認証に使用する複数の名前がある場合、特定のサービス インスタンス複数 Spn を設定できます。たとえば、SPN には常にサービスのインスタンスを実行しているホスト コンピューターの名前が含まれます。そのため、サービス インスタンスの SPN をそれぞれの名前またはそのホストのエイリアスを登録可能性があります。

HTTP サービス クラス

HTTP サービス クラスには、HTTP プロトコルのとは異なります。HTTP プロトコルおよび HTTPS プロトコルは HTTP サービス クラスを使用します。サービス クラスは、サービスの一般的なクラスを識別する文字列です。既知のサービス クラスの名前に"www"の Web サービスとディレクトリ サービスが"ldap"などがあります。一般に、サービス クラスの名前をサービス クラスに固有の文字列です。SPN の構文は要素間の区切りにスラッシュ文字 (/) を使用することに注意します。したがって、スラッシュ文字 (/) では、サービス クラスの名前は使用できません。

ホスト サービスと HTTP サービス ・ クラス

ホスト サービスは、ホスト コンピューターを表します。Kerberos プロトコルは、ホスト コンピューターにアクセスするのにホストの SPN を使用します。Kerberos プロトコルは、長期的なキー、ホスト コンピューターにサービス チケットを作成するのには. します。

HTTP サービス クラスを使用するとホストの SPN をエイリアスとして、組み込みのサービスのいずれかです。ホストの SPN は、ホストのコンピューター アカウントにマップされます。既定の HTTP サービス クラスを使用すると、したがって、Kerberos プロトコル、コンピューター アカウントをサービス アカウントとしてサービス チケットを要求するのには. します。

一般的なシナリオ

SPN が必要となるシナリオをについて説明します。また、ここには各シナリオを設定するのには、SPN を確認する方法について説明します。これらのシナリオで、次の用語を使用します。
元に戻す全体を表示する
IIS6server1IIS を実行しているコンピューターのホスト名
mydomainIIS6server1 コンピューターの所属ドメイン
appPool1アプリケーション プール id を使用される mydomain ドメイン ユーザー アカウント
appPool22 つ目のアプリケーション プール id に使用される mydomain ドメイン ユーザー アカウント
www.test.com最初のホスト ヘッダーの Web サイト
www.test2.com2 番目のホスト ヘッダーの Web サイト
www.test3.com3 番目のホスト ヘッダーの Web サイト
www.myIIScluster.comIIS を実行しているコンピューターのクラスターの完全修飾ドメイン名
www.myEXCHcluster.comMicrosoft Exchange で IIS を実行しているコンピューターのクラスターの完全修飾ドメイン名

Setspn.exe ツール

Setspn.exe ツールを読み取り、変更、およびアクティブなディレクトリ サービス アカウントを SPN ディレクトリ プロパティを削除することができます。Spn は、サービスを実行して、対象のプリンシパル名を検索する使用されます。SetSpn.exe ツールを使用して現在の Spn を表示、アカウントの既定の Spn をリセットし、追加または補足 Spn を削除することもできます。

Setspn.exe ツールは Microsoft Windows Server 2003 を入手するには、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
970536 Setspn.exe サポート ツールの更新プログラムは、Windows Server 2003

シナリオ 1: アプリケーション プールの id が変更されている場合、IIS アプリケーションへのアクセスします。

ドメイン ユーザー アカウントではなく、既定の network service アカウントの下では、IIS アプリケーションを実行すると、ドメイン アカウントで HTTP サービスの SPN を設定する必要があります。このシナリオでは、IIS を実行しているサーバーの NetBIOS 名または IIS を実行しているサーバーの FQDN を使用して IIS アプリケーションをアクセスします。

NetBIOS 名を使用して、IIS のアプリケーションにアクセスするには、次のコマンドを使用する場合 NETBIOS_NAME_OF_IIS_SERVER IIS を実行しているサーバーの NetBIOS 名です。
Setspn ? S HTTP/NETBIOS_NAME_OF_IIS_SERVER ドメイン \ ユーザー名
たとえば、コマンド次のコマンドのように可能性があります。
Setspn ? S HTTP/iis6server1 mydomain\appPool1
FQDN を使用して、IIS のアプリケーションにアクセスするには、次のコマンドを使用する場合 FQDN_OF_IIS_SERVER IIS を実行しているサーバーの FQDN です。
Setspn ? S HTTP/FQDN_OF_IIS_SERVER ドメイン \ ユーザー名
たとえば、コマンド次のコマンドのように可能性があります。
Setspn ? S HTTP/iis6server1.mydomain.com mydomain\appPool1

シナリオ 2: ホスト ヘッダーを使用して、Web アプリケーションにアクセスします。

ホスト ヘッダーを使用して、Web アプリケーションにアクセスすると、HTTP サービスの SPN を設定する必要があります。

[既定のアカウント、ネットワーク サービス アカウント、ローカル サービス アカウント、またはローカル システム アカウントなど、Web アプリケーションを実行すると、次のコマンドを使用できます。
Setspn ? A HTTP/HOST_HEADER NETBIOS_NAME_OF_IIS_SERVER
このコマンドで、 HOST_HEADER ホスト ヘッダーは、ブラウザーで入力されるウィンドウは、アプリケーションにアクセスして NETBIOS_NAME_OF_IIS_SERVER IIS を実行しているサーバーの NetBIOS 名です。

たとえば、アプリケーションのコマンド、次のコマンドに示します。
Setspn ? A HTTP/www.test.com iis6server1
ドメイン アカウントでは、アプリケーションを実行すると、次のコマンドを使用できます。
Setspn ? A HTTP/HOSTHEADER_OR_DNS_ALIAS ドメイン \ ユーザー名
このコマンドで、 HOSTHEADER_OR_DNS_ALIAS ホスト ヘッダーまたは Web アプリケーションへのアクセスに使用する DNS エイリアスです。

たとえばは、アプリケーション コマンドを次のコマンドのいずれかのように可能性があります。
  • Setspn ? A HTTP/www.test.com mydomain\appPool1
  • Setspn ? A HTTP/www.test3.com mydomain\appPool2

シナリオ 3: クラスターまたは負荷分散環境で IIS アプリケーションへのアクセスします。

クラスター化された環境で、または負荷分散環境で IIS を実行すると、ノード名を使用して、クラスター名の代わりを使用してアプリケーションをアクセスします。このシナリオには、ネットワーク負荷分散が含まれます。クラスタ リング ・ テクノロジーでは、ノードがクラスターのメンバーである 1 台のコンピューターに参照します。このシナリオでは、認証プロトコルとして Kerberos を使用するには、同じドメイン ユーザー アカウントを使用する各ノードで IIS のアプリケーション プール id を構成しなければなりません。同じドメイン ユーザー アカウントを使用する各ノードに IIS を構成するには、次のコマンドを使用します。
Setspn ? A HTTP/CLUSTER_NAME ドメイン \ ユーザー名
たとえば、コマンド次のコマンドのいずれかのように可能性があります。
  • Setspn ? A HTTP/www.myIISCluster.com mydomain\appPool1
  • Setspn ? A HTTP/www.myEXCHCluster.com mydomain\appPool2

シナリオ 4: SQL サーバーを使用するアプリケーションにアクセスするには

IIS Web アプリケーションが SQL Server を実行しているバックエンド コンピューターへのアクセスが必要かを確認するのには、バックエンド サーバー上の Spn が必要があります。必要な Spn が正しく構成されている場合は、Web アプリケーションが正しく動作しません。

SQL Server を実行しているバックエンド コンピューターに MSSQLSvc で、ローカル システム アカウントで実行しているかどうかは/FQDN_OF_SQL_SERVER:port ポート番号は、コンピューター名を使用できなければなりません。SQL Server を実行しているコンピューターの Spn を確認するには、次のコマンドを使用します。
Setspn ? L SQL_SERVER_COMPUTER_NAME
SPN を SQL Server を実行しているコンピューターの名前を設定するのには、次のコマンドを使用します。
Setspn ? A MSSQLSvc/FQDN_OF_SQLSERVER:port SQLSERVER_COMPUTER_NAME
SQL Server を実行しているバックエンド コンピューター、MSSQLSvc がドメイン アカウントで実行しているかどうかは/FQDN_OF_SQL_SERVER:port ポート番号は、ドメイン アカウントを使用可能でなければなりません。ドメイン アカウント用の Spn を確認するには、次のコマンドを使用します。
Setspn ? L ドメイン \ ユーザー名
SPN を SQL Server を実行しているコンピューターの名前を設定するのには、次のコマンドのいずれかを使用します。
  • Setspn ? A MSSQLSvc/FQDN_OF_SQLSERVER:portFQDN_OF_SQLSERVER
  • Setspn ? A MSSQLSvc/FQDN_OF_SQLSERVER:portドメイン \ ユーザー名

SPN のヘルパー スクリプト

IIS アプリケーションは、Spn を検索するのには、次のサンプル スクリプトを使用できます。重複した Spn を検索するのにはこのスクリプトを使用することもできます。このスクリプトを使用するには、次の手順を実行します。
  1. クリックしてください。 開始をクリックして 実行、タイプ メモ帳、し [OK].
  2. メモ帳ファイルには、次のスクリプトを貼り付けます。
    Dim argSPN, argUser, argComputer, spnToSearch, objCategory, strFilter, searchCategory, domainInput
    
    Function Help()
    Dim strMessage
    strMessage = strMessage & "Usage:" & chr(13)
    strMessage = strMessage & "For accurate results run this script from the IIS server or a member server in the same domain as IIS server." & chr(13)
    strMessage = strMessage & "Check the article's failure scenarios and make sure no duplicate SPNs exist." & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:spn /spn:HTTP/www.test.com /user:mydomain\apppool1" & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:spn /spn:HTTP/www.test.com /computer:iis6server1" & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:user /user:mydomain\apppool1" & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:computer /computer:iis6server1" & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:duplicatespn /spn:HTTP/www.test.com" & chr(13)
    strMessage = strMessage & "cscript spnHelper.vbs /f:requiredspn" & chr(13)
    	MsgBox strMessage,,"SPN Helper"
    	WScript.Quit
    End Function
    
    Function setArguments()
    	argSPN = lcase(WScript.Arguments.Named("spn"))
    	argUser =  lcase(WScript.Arguments.Named("user"))
    	argComputer = lcase(WScript.Arguments.Named("computer"))
    	searchCategory = lcase(WScript.Arguments.Named("f"))
    	if instr(argUser,"\")>0 then
    		domainInput = ",DC=" & split(argUser,"\")(0)
    		argUser = split(argUser,"\")(1)
    	end if
    End Function
    
    Function resetValues()
    	spnToSearch = ""
    	objCategory = ""
    	strFilter = ""
    End Function
    
    Function getGCPath()
    	Dim tempGCPath, objGC, tempGC, tempStr
    	Set objGC = GetObject("GC:")
    	for each tempGC in objGC
    		tempGCPath = tempGC.ADsPath
    	next
    	if tempGCPath <> "" then
    		getGCPath = tempGCPath
    	else
    		WScript.Echo "Unable to find active directory"
    		WScript.Quit
    	end if
    	For tempCounter=0 to UBound(split(lcase(split(getGCPath,"//")(1)),"."))
    		If tempCounter = UBound(split(lcase(split(getGCPath,"//")(1)),".")) Then tempSeperator="" else tempSeperator = ","
    		tempStr = tempStr & "DC=" & split(lcase(split(getGCPath,"//")(1)),".")(tempCounter) & tempSeperator
    	Next
    	getGCPath = tempGCPath & "/" & tempStr
    End Function
    
    Function getSPNClass()
    	Dim tempSPNClass
    	If trim(argSPN)="" Then getSPNClass = "*": Exit Function
    	If instr(argSPN,"/")=0 Then getSPNClass = "*": Exit Function
    	If instr(split(argSPN,"/")(0),"*")>0 Then getSPNClass = "*": Exit Function
    	getSPNClass = split(argSPN,"/")(0)
    End Function
    
    Function isSPNInputValid(spnIN)
    	isSPNInputValid = ""
    	If instr(spnIN,"/")=0 Then Exit Function
    	If instr(spnIN,"*")>0 Then Exit Function
    	isSPNInputValid = spnIN
    End Function
    
    Function Main()
    	Dim paramSPN
    	paramSPN = ""
    	call  resetValues()
    	call setArguments()
    	Select Case searchCategory
    		Case "spn"
    			if (argUser = "" and argComputer = "") or (argUser <> "" and argComputer <> "") then WScript.Echo "You must use /spn along with /computer or /user": WScript.Quit
    			if argSPN = "" then argSPN = "*"
    			spnToSearch = "(servicePrincipalName=" & argSPN & ")"
    			if argUser <> "" then objCategory = "(objectCategory=person)(sAMAccountName=" & argUser & ")"
    			if argComputer <> "" then 
    				objCategory = "(objectCategory=computer)(cn=" & argComputer & ")"
    			End If
    			strFilter = "(&" & spnToSearch & objCategory & ")"
    		Case "duplicatespn"
    			If isSPNInputValid(argSPN)="" Then WScript.Echo "Invalid SPN input. Please verify and try again.": WScript.Quit
    			spnToSearch = "(servicePrincipalName=" & argSPN & ")"
    			strFilter = spnToSearch
    			paramSPN = argSPN
    		Case "requiredspn"
    			call showRequiredSPNs("IIS")
    			WScript.Quit
    		Case "computer"
    			objCategory = "(&(objectCategory=computer)(cn=" & argComputer & "))"
    			strFilter = objCategory
    		Case "user"
    			objCategory = "(&(objectCategory=person)(sAMAccountName=" & argUser & "))"
    			strFilter = objCategory
    		Case else
    			call Help()
    			WScript.Quit
    	End Select
    	call getSPNs(paramSPN)
    End Function
    
    Function getPingResult(hostName,errorMessage)
    'On Error Resume Next
    getPingResult = ""
    	If instr(hostName,".")=0 Then
    		Dim tempGCPath, objGC, tempGC
    		Set objGC = GetObject("GC:")
    		for each tempGC in objGC
    			tempGCPath = tempGC.ADsPath
    		next
    		if tempGCPath <> "" then
    			gcPath = tempGCPath
    		else
    			WScript.Echo "Unable to find active directory"
    			WScript.Quit
    		end if
    		Set adConn = CreateObject("ADODB.Connection")
    		Set adCmd = CReateObject("ADODB.Command")
    		adConn.Provider = "ADsDSOObject"
    		adConn.Open "ADs Provider"
    		Set adCmd.ActiveConnection = adConn
    		adQuery = "<" + gcPath + ">;" & "(&(objectCategory=computer)(cn=" & hostName & "))" & ";dnsHostName;subtree"
    		'WScript.Echo adQuery
    		'WScript.Quit
    		adCmd.CommandText = adQuery
    		Set adRecordSet = adCmd.Execute
    		if adRecordSet.RecordCount>0 Then 
    			If IsNull(adRecordSet.Fields("dnsHostName"))=0 Then 
    				getPingResult = adRecordSet.Fields("dnsHostName") 
    				hostName = getPingResult 
    			Else 
    				getPingResult = hostName
    			End If
    		else 
    			errorMessage = "Could not find " & hostname & " in the active directory"
    		end if
    
    		Exit Function
    	End If
    	getPingResult = hostName
    Exit Function
    'If Err Then getPingResult = hostName
    End Function
    
    Function getSPNs(spn)
    	Dim spnClass, duplicateSPNArray
    	spnClass = getSPNClass()
    	duplicateSPNArray = ""
    	gcPath = getGCPath()
    	Set adConn = CreateObject("ADODB.Connection")
    	Set adCmd = CreateObject("ADODB.Command")
    	adConn.Provider = "ADsDSOObject"
    	adConn.Open "ADs Provider"
    	Set adCmd.ActiveConnection = adConn
    	adQuery = "<" + gcPath + domainInput + ">;" & strFilter & ";distinguishedName,objectCategory,dnsHostName,servicePrincipalName,sAMAccountName;subtree"
    	'WScript.Echo adQuery
    	'WScript.Quit
    	adCmd.CommandText = adQuery
    	Set adRecordSet = adCmd.Execute
    	if adRecordSet.EOF and adRecordSet.Bof Then
    		WScript.echo "No " & searchCategory & " found with the given criteria."
    	else
    		If adRecordSet.RecordCount>10 Then
    			If msgbox(adRecordSet.RecordCount & " Records are returned with the given criteria. Printing all of them might take a long time" & chr(13) & " Do you want to print all of them?",vbYesNo,"Kerberos")=vbNo Then Exit Function
    		End If
    		Do While not adRecordset.Eof
    			If Err Then Exit Do
    			WScript.echo "Class: " & split(split(adRecordSet.Fields("objectCategory"),",")(0),"=")(1)
    			WScript.Echo adRecordSet.Fields("distinguishedName")
    			if UCase(adRecordSet.Fields("objectCategory")) = "COMPUTER" Then
    				WScript.echo "Computer Name" & adRecordSet.Fields("dnsHostName")
    			else
    				WScript.echo "User Name: " & adRecordSet.Fields("samAccountName")
    			end if
    			if instr(searchCategory,"spn")>0 Then
    				spnCollection = adRecordSet.Fields("servicePrincipalName")
    				for each individualSPN in spnCollection
    					if spnClass="*" Then
    					WScript.Echo Chr(9) + individualSPN
    					else
    						Select Case searchCategory
    							Case "spn"
    								if Lcase(split(individualSPN,"/")(0)) = lcase(spnClass) Then
    									WScript.Echo Chr(9) + individualSPN
    								end if
    							Case "duplicatespn"
    								if Lcase(individualSPN) = lcase(spn) Then
    									duplicateSPNArray = duplicateSPNArray & Lcase(individualSPN) & " for " & split(split(adRecordSet.Fields("objectCategory"),",")(0),"=")(1) & ":" & adRecordSet.Fields("samAccountName") & Chr(29)
    								end if
    							Case "requiredspn"
    						End Select
    					End if
    				next
    			end if
    			WScript.Echo
    			adRecordSet.MoveNext
    		Loop
    		If searchCategory = "duplicatespn" Then
    			If UBound(Split(duplicateSPNArray,Chr(29)))>1 Then
    				WScript.Echo "Duplicate SPNs found"
    				For tempDuplicateCount=0 to UBound(Split(duplicateSPNArray,Chr(29)))-1
    					WScript.Echo Split(duplicateSPNArray,Chr(29))(tempDuplicateCount)
    				Next
    			End If
    		End If
    		WScript.Echo ""
    		If adRecordset.RecordCount>1 Then WScript.Echo "Found " & adRecordset.RecordCount & " accounts" Else WScript.Echo "Found " & adRecordset.RecordCount & " account"
    	end if
    	adRecordset.Close
    	adConn.Close
    	If Err Then MsgBox Err.Message
    End Function
    
    Function getCategoryCount(myFilterValue, myFilterCategory)
    'This function accepts 2 parameters. First paramenter is the filter value and second param is filter category.
    'If you want to pass in your own filter string with various categories, you can pass "" as the second param.
    	gcPath = getGCPath()
    	searchCategory = myFilterCategory
    	Select Case lcase(searchCategory)
    		Case "spn"
    			tempFilter = "(servicePrincipalName=" & myFilterValue & ")"
    		Case "user"
    			tempFilter = "(&(objectCategory=person)(sAMAccountName=" & myFilterValue & "))"
    		Case "computer"
    			tempFilter = "(&(objectCategory=computer)(cn=" & myFilterValue & "))"
    		Case else
    			tempFilter = myFilterValue
    	End Select
    	Dim tempCategoryCount
    	tempCategoryCount = 0
    	Set adConn = CreateObject("ADODB.Connection")
    	Set adCmd = CReateObject("ADODB.Command")
    	adConn.Provider = "ADsDSOObject"
    	adConn.Open "ADs Provider"
    	Set adCmd.ActiveConnection = adConn
    	adQuery = "<" + gcPath + domainInput + ">;" & tempFilter & ";objectCategory,dnsHostName,servicePrincipalName,sAMAccountName;subtree"
    	'WScript.Echo adQuery
    	'WScript.Quit
    	adCmd.CommandText = adQuery
    	Set adRecordSet = adCmd.Execute
    	if adRecordSet.EOF and adRecordSet.Bof Then
    	else
    		Do While not adRecordset.Eof
    			If Err Then Exit Do
    			if searchCategory = "spn" Then
    				spnCollection = adRecordSet.Fields("servicePrincipalName")
    				for each individualSPN in spnCollection
    					If lcase(individualSPN) = lcase(myFilterValue) Then
    						tempCategoryCount  = tempCategoryCount  + 1
    					End If
    				next
    			else
    				tempCategoryCount = tempCategoryCount + 1
    			end if   
    			adRecordSet.MoveNext
    		Loop
    	end if
    	getCategoryCount = tempCategoryCount
    	adRecordset.Close
    	adConn.Close
    End Function
    
    Function showRequiredSPNs(Product)
    	Select Case Product
    		Case "IIS"
    			If MsgBox("Is IIS running in a Cluster or NLB",vbYesNo)=vbYes Then 'Running in Cluster or NLB is true
    				strClusterName = InputBox("Enter the Cluster Name")
    				If strClusterName = "" Then WScript.Quit
    				If getPingResult(strClusterName,errorMessage)="" Then
    					If MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.Quit
    				End If
    				strDomainAccount = InputBox("Enter the Domain Account that the application pool is running under")
    				If strDomainAccount = "" Then WScript.Quit
    				strRequiredSPN = "HTTP/" & strClusterName
    				If instr(strDomainAccount,"\") > 0 then
    					If getCategoryCount(split(strDomainAccount,"\")(1), "user")=0 Then
    						WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    						WScript.Quit
    					End If
    				Else
    					If getCategoryCount(strDomainAccount, "user")=0 Then
    						WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    						WScript.Quit
    					End If
    				End If
    				If getCategoryCount(strRequiredSPN, "spn")>0 Then
    					WScript.Echo "SPN " & " is already set. Use search option for finding the account that it is set for"
    					WScript.Quit
    				End If
    				WScript.Echo "You need to set the SPN " & strRequiredSPN & " for domain account " & strDomainAccount
    			Else
    				If MsgBox("Is IIS application pool running under domain account",vbYesNo)=vbYes Then 
    					strHostName = InputBox("Enter the hostname or host header or FQDN that you use to access the application")
    					If strHostName = "" Then WScript.Quit
    					If getPingResult(strHostName,errorMessage)="" Then
    						If MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.Quit
    					End If
    					strDomainAccount = InputBox("Enter the Domain Account that the application pool is running under")
    					If strDomainAccount = "" Then WScript.Quit
    					If instr(strDomainAccount,"\") > 0 then
    						If getCategoryCount(split(strDomainAccount,"\")(1), "user")=0 Then
    							WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    							WScript.Quit
    						End If
    					Else
    						If getCategoryCount(strDomainAccount, "user")=0 Then
    							WScript.Echo "Domain account " & strDomainAccount & " does not exist"
    							WScript.Quit
    						End If
    					End If
    					strRequiredSPN = "HTTP/" & strHostName
    					If getCategoryCount(strRequiredSPN, "spn")>0 Then
    						WScript.Echo "SPN " & strSPNRequired & " is already set. Use search option for finding the account that it is set for"
    						WScript.Quit
    					Else
    						WScript.Echo "You need to set SPN " & strRequiredSPN & " for domain account " & strDomainAccount
    						WScript.Quit
    					End If
    				Else
    					strHostName = InputBox("Enter the host header or FQDN that you use to access the application")
    					If strHostName = "" Then WScript.Quit
    					If getPingResult(strHostName,errorMessage)="" Then
    						If MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.Quit
    					End If
    					If MsgBox("Are you accessing the application with netbios name or FQDN or CNAME alias of IIS server?",vbYesNo)=vbYes Then
    						strRequiredSPN = "host/" & strHostName
    						If getCategoryCount(strRequiredSPN, "spn")>0 Then
    							WScript.Echo "Required SPN " & strRequiredSPN & " is already set. Use search option for finding the account that it is set for"
    							WScript.Quit
    						Else
    							WScript.Echo "You need to set SPN " & strRequiredSPN & " for IIS server's netbios name"
    							WScript.Quit
    						End If
    					End If
    					strHostHeader = InputBox("Enter the host header that you use to access the application")
    					If strHostHeader = "" Then WScript.Quit
    					strRequiredSPN = "http/" & strHostHeader
    					If getCategoryCount(strSPNRequired, "spn")>0 Then
    						WScript.Echo "A required SPN " & strSPNRequired & " is already set. Use search option to find the account the SPN is set to. If the required SPN is found under a different account, remove and add it to the IIS server's machine account."
    						WScript.Quit
    					Else
    						WScript.Echo "You need to set SPN " & strRequiredSPN & " for IIS server's netbios name"
    						WScript.Quit
    					End If
    				End If
    				
    			End If
    		Case Else
    			call Help()
    	End Select
    End Function
    
    call Main()
    '
    
  3. ファイルを Spnhelper.vbs として保存します。
  4. コマンド プロンプトで、適切なコマンド ライン オプションを使用して、Spnhelper.vbs ファイルを実行します。

    メモ コマンド ライン オプションは、Spnhelper.vbs ファイルを表示するのには、入力します。 Spnhelper.vbs/help コマンド プロンプトと ENTER キーを押します。

その他の考慮事項

コンピューター アカウントまたはドメイン アカウントに対して、必要な Spn が設定されている場合 Kerberos 認証が失敗する可能性があります。Kerberos 認証で予期せず障害が発生した場合は、次の操作を行います。
  • 重複した Spn がグローバル カタログに SPN を存在していないことを確認します。

    MyDomain\appPool1 アカウントと myDomain\appPool2 の HTTP/www.test.com の SPN を設定すると、さまざまなアカウントを Spn が設定されている場合でも、重複した SPN を存在します。さらに、HTTP/iis6server1.mydomain.com の SPN、myDomain\appPool1 アカウントに設定され、HTTP/iis6server1.mydomain.com の SPN はサーバーのコンピューター アカウントに関連付けられている場合、重複した SPN あるも。1 つのホストの SPN と 1 つの HTTP SPN を設定できます。HTTP SPN を明示的でホスト エントリで説明されて、暗黙の 1 つを上書きします。ただし、ユーザーが 2 つ以上のユーザー アカウントまたはコンピューター アカウントの 1 つ以上に関連付けられている URL があるかどうかは、重複した SPN。
  • Spn が他のドメイン コント ローラーにレプリケートされたことを確認します。

    ドメイン コント ローラー間のレプリケーションの問題の他のドメイン コント ローラーにレプリケート、Spn を防ぐことができます。アプリケーションは、Spn が他のドメイン コント ローラーにレプリケートしない場合は、一部のクライアント コンピューターから動作しません。MyDomain\appPool1 アカウントは、ドメイン コント ローラー上の HTTP/www.test.com の SPN を設定すると、SPN が 2 番目のドメイン コント ローラーにレプリケートされていない場合など HTTP/www.test.com SPN の myDomain\appPool1 アカウントの 2 番目のドメイン コント ローラー検出できません可能性があります。

    メモ 既定では、レプリケーションは 15 分かかります。
  • Kerberos 認証をサポートする Web サーバーが構成されていることを確認します。これを行うには、IIS メタベースの NTAuthenticationProviders キーの設定に変更されていないことを確認します。 NTLM.既定の設定です。 ネゴシエート、NTLM.
  • サーバーまたはサービス資格情報の委任は、委任に対して信頼されてことを確認します。
  • サービスが実行されているアカウントが委任に対して信頼されているかを確認します。
  • Active Directory で確認してください、 アカウントは重要なので委任できません。 アプリケーションにアクセスするユーザーのチェック ボックスをオフします。
  • アプリケーションをサーバーから直接アクセスしている場合は、 ループバック セキュリティ チェック チェック ボックスがオフになっています。ループバック チェックが無効になっていることを確認する方法の詳細については、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
    896861統合認証を使用して、IIS 5.1 または IIS 6 でホストされている Web サイトを参照するとエラー 401.1 が表示されます。
  • クライアントは、Kerberos が有効なクライアントであることを確認します。また、ことを確認、 Windows 統合認証を有効にします。 Internet Explorer の設定を有効にします。これを行うをクリックしてください。 インターネット オプション で、 ツール メニューをクリックして、 高度な タブをクリックしことを確認、 Windows 統合認証を有効にします。 チェック ボックスが選択されています。
  • Kerberos プロセスの一部であるすべてのコンピューターが一貫性のある名前解決がある Kerberos の信頼によって接続されていることを確認します。たとえば、Kerberos プロセスに関連するコンピューターが同じフォレスト内にまたはクロス フォレスト Kerberos 信頼関係の一部であることを確認します。
  • トークンのサイズの設定値を超えていないことを確認してください、 MaxTokenSize [プロパティ] します。また、要求のサイズの設定値を超えていないことを確認、 MaxFieldLength [プロパティ] します。Kerberos プロセスの一部であるユーザーの多くのグループのメンバーである場合は、これらの値を超える可能性があります。
    920862 Outlook Web Access ユーザーは、Exchange Server 2003年のメールボックスにアクセスしようとするとエラー メッセージ:"HTTP 400 不正な要求 (要求ヘッダーが長すぎます)"
  • ドメイン アカウントをアプリケーション プールを構成するときに必要なセキュリティ ポリシーを有効にすることを確認します。これを行うには、ドメイン アカウントは、IIS を実行しているコンピューター上の次のローカル セキュリティ ポリシーのメンバーであることを確認します。
    • プロセスのメモリ クォータを調整します。
    • サービスとしてログオン
    • プロセス レベル トークンを置き換え
  • UDP 経由で Kerberos 認証が正しく機能していることを確認します。既定では、UDP Kerberos 認証を使用します。ただし、UDP パケットの消失失敗する Kerberos 認証ができます。この問題が発生すると、TCP を使用するのには、Kerberos 認証を強制的に実行できます。 TCP を使用するのには、Kerberos 認証を強制的に行う方法の詳細については、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
    244474Windows Server 2003、Windows XP、および Windows 2000 は UDP ではなく TCP を使用する Kerberos を強制する方法
  • 認証サーバー上のタイムスタンプでは 5 分以上からタイムスタンプ サーバーの差があるかを確認します。 タイムスタンプの違いを解決する方法の詳細については、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
    232386日付と時刻が同期されていない場合にログオンできません。
  • TCP または UDP ポート 88 をファイアウォールまたはルーターによってブロックされていないことを確認します。既定では、Kerberos 認証は TCP または UDP ポート 88 を使用します。
  • ドメイン ・ モードの環境に、少なくとも Windows 2000 ネイティブ モードの環境であることを確認します。ドメイン モードを確認する方法の詳細については、次のマイクロソフト Web サイトを参照してください。
    http://technet2.microsoft.com/windowsserver/en/library/11b2d3d3-980c-4b64-9ed3-51778f1fe5771033.mspx?mfr=true
  • クライアントでは、Web アプリケーションの URL をローカル イントラネット サイトに追加されることを確認します。 URL をローカル イントラネットに追加する方法の詳細については、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
    303650FQDN または IP アドレスを使用すると、イントラネット サイトがインターネット サイトとして識別されます。
  • 各ギガビット イーサネット デバイス ドライバーの最新バージョンを使用していることを確認します。 ギガビット イーサネット デバイス用のドライバーが古い場合に発生する問題の詳細については、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
    326152ドメイン コント ローラーに接続できないし、ギガビット イーサネット デバイスでグループ ポリシーを適用することはできません

関連情報

負荷分散された Web サイトが Kerberos 認証を使用する方法の詳細については、次のマイクロソフト Web サイトを参照してください。
http://technet.microsoft.com/en-us/library/cc757299.aspx
プロキシ サーバーで Kerberos 認証を使用すると発生する問題の詳細については、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
321728Internet Explorer がプロキシ サーバーの Kerberos 認証をサポートしていません
ネットワーク認証に Kerberos プロトコルと NTLM プロトコルの両方をサポートするように IIS を構成する方法の詳細については、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
215383ネットワーク認証に Kerberos プロトコルと NTLM プロトコルの両方をサポートするように IIS を構成する方法
Windows SharePoint Services の仮想サーバーで Kerberos 認証、および Kerberos 認証から NTLM 認証に戻すを切り替える方法を使用するを構成する方法の詳細については、Knowledge Base の資料を参照するのには、次の資料番号クリックします。
832769Windows SharePoint Services の仮想サーバーで Kerberos 認証を使用するを構成する方法および Kerberos 認証から NTLM 認証に戻るを切り替える方法
Kerberos 認証プロトコルを使用して、非標準ポートで Windows XP を使用して、Web サーバーまたは Windows Server 2003 に接続するときに発生することができます問題の詳細については、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
908209Internet Explorer 6 は、Kerberos 認証プロトコルは非標準ポートで Windows XP を使用して、Web サーバーまたは Windows Server 2003 に接続できない. します。

プロパティ

文書番号: 929650 - 最終更新日: 2011年8月8日 - リビジョン: 7.0
キーワード:?
kbhowto kbinfo kbmt KB929650 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:929650
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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