IIS 7のデフォルトのWebサイトにアプリケーションがあり、同じドメイン(ただし異なるマシン)の別のドキュメントにアクセスしようとすると、ドキュメントが存在し、マシンから問題なくアクセスできる場合でも、File.Exists
が返されます。False
サイトをホストしています。セットアップのAD部分は正常に機能しているようですが、ドメイン内のさまざまなマシン上のドキュメントにアクセスできません。これが私のIISセットアップです:
アプリケーションプール:.NET 4.0、統合パイプライン、およびApplicationPoolIdentityIdentityの使用。NetworkServiceを使用してみましたが、違いは見られませんでした。
認証:私のアプリケーションでは、ASP.NETの偽装とWindows認証のみが有効になっています。binフォルダーは同じです。
IISのセットアップに関連するものが他にある場合は、お知らせください。追加します。
また、アクセスしようとしているドキュメント(同じドメイン内の別のマシン上にある)が含まれているフォルダーに対して、マシンに完全なアクセス許可を付与しようとしました。それも違いを生まないようでした。
誰かがこれに遭遇したことがありますか、または私が試すことができる他の何かを知っているか、私がチェックできるIIS設定を知っていますか?セットアップに含めることができる他の関連事項がある場合は、お知らせください。
アップデート:
どのIDが使用されているかSystem.IO.File.Exists()
、または呼び出されたときにだれがなりすまされているか、より具体的には、そのメソッドがだれになりすましているのかを知ることは可能ですか?電話をThread.CurrentPrincipal.Identity.Name
かける直前に確認しようとしましたが、ドメインユーザーが正しく返されます。File.Exists()
したがって、実行時に偽装されているのはユーザーではないようFile.Exists()
です。さらに、IISで、特定のドメインユーザーを使用するように(認証設定で)ASP.NETの偽装を変更すると、すべてが正常に機能します。しかし、「認証されたユーザー」を使用するように戻すと、そうではありませんか?
Principal.WindowsIdentity.GetCurrent.Name()
また、直前に呼び出すとFile.Exists()
正しいドメインユーザーが返されることも確認できます。
更新2:
また、アプリケーションプールIDを特定のドメインユーザーに設定しようとしましたが、どちらも違いはないようです。この時点で、ファイルが存在するかどうかを確認するときに、他にどのようなアカウントが偽装されている可能性があるのかわかりません。
更新3:
アクセスしようとしているドキュメントがあるマシンでProcessMonitorを使用しようとしましたが、探している(または表示する予定の)ファイルタイプにフィルターすると、再表示しても何も表示されません。テストを実行します。File.Exists()
アクセスできないファイルに対してのみ、プロセスモニターに登録しないと想定できますか?これらのドキュメントにアクセスしようとしている(できない)偽装されたユーザー/サービスを見つける方法は他にありますか?
更新4:
以下の@johnが見つけた例を使用して、ファイルが存在するかどうかを確認する前に、ログインしているユーザーをプログラムで偽装しようとしました。
Dim wID As WindowsIdentity = HttpContext.Current.User.Identity
Dim ctx As WindowsImpersonationContext = Nothing
ctx = wID.Impersonate()
If System.IO.File.Exists(sFile) Then
Else
'Still gets here?
End If
ただし、File.Exists()
なりすましの場合でもfalseを返します。
更新5(解決策):
私はこれが必要でした:
Using ctx As System.Security.Principal.WindowsImpersonationContext = System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero)
'My code here
End Using