我在 IIS 7 的默认网站下有一个应用程序,每当我尝试访问同一域(但不同的机器)上的另一个文档时File.Exists
,False
即使该文档确实存在并且我可以从机器上正常访问它,也会返回托管网站。设置的 AD 部分似乎工作正常,我只是无法访问域中不同机器上的文档。这是我的 IIS 设置:
应用程序池:.NET 4.0,集成管道,并使用 ApplicationPoolIdentity 标识。我试过使用 NetworkService 但这似乎没有什么不同。
身份验证:我的应用程序仅启用了 ASP.NET 模拟和 Windows 身份验证。bin 文件夹是一样的。
如果还有其他与 IIS 设置相关的内容,请告诉我,我会添加。
我还尝试授予我的机器对包含我尝试访问的文档(位于同一域中的另一台机器上)的文件夹的完全权限。这似乎也没有什么不同。
以前有没有人遇到过这个问题,或者知道我可以尝试的其他任何事情,或者知道我可以检查的任何 IIS 设置?如果我可以在我的设置中包含任何其他相关内容,请告诉我!
更新:
是否有可能找出正在使用的身份或在System.IO.File.Exists()
调用时冒充谁,或者更具体地说,找出该方法冒充的是谁?我已经尝试Thread.CurrentPrincipal.Identity.Name
在调用之前进行检查File.Exists()
,它正确地返回了我的域用户。
因此,执行时似乎不是模拟用户File.Exists()
。更重要的是,如果在 IIS 中,我将 ASP.NET 模拟(在身份验证设置中)更改为使用我的特定域用户,一切正常!但是当我将它改回使用“经过身份验证的用户”时,它不会吗?
我还可以确认Principal.WindowsIdentity.GetCurrent.Name()
之前的调用File.Exists()
也会返回正确的域用户。
更新 2:
我还尝试将应用程序池标识设置为我的特定域用户,这似乎也没有什么不同。在这一点上,我不确定在检查文件是否存在时它可能会模拟什么其他帐户?
更新 3:
我尝试在具有我要访问的文档的机器上使用Process Monitor,但是当我将其过滤为我正在寻找(或期望看到)的文件类型时,当我重新 -运行我的测试。我只能假设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