1

我有代码在 SharePoint 2007 的 PageLayout 内的 ascx 中运行,它访问远程服务器上的文件,即 File.Create("\servername\sharename\folder\file.txt")。代码在 web.config 中将 CAS 信任设置为 Full 的 SharePoint Web 应用程序中运行。File.Create 引发以下异常:-

System.UnauthorizedAccessException

拒绝访问路径 '\\servername\sharename\folder\file.txt'。

共享共享给具有完全控制权的所有人,并且 NTFS 权限设置为具有完全控制权的所有人。Web 应用程序池在域帐户下运行,也具有访问该资源的明确权限(不是应该需要的)。

我在远程机器上运行了 Process Monitor,并且服务器上没有记录任何点击。这让我相信这是 SharePoint 代码访问安全设置的问题。就像我上面所说的,对 web.config 的信任设置为 Full。

CAS是否可能仍在阻止远程访问?谁能想到其他要审查的领域?


更新

多一点信息...

我已尝试将应用程序池设置为域管理员,但问题仍然存在。当使用相同的方法访问本地计算机上的驱动器时,它工作正常。使用应用程序池帐户在共享点之外的 SnippetCompiler 中运行相同的代码可以正常工作。

希望这会有所帮助,如果您能想到我可以尝试的更多调查或测试途径,请告诉我。


更新

我不确定这是否会影响问题,但本地服务器正在运行 Windows Server 2003,而远程服务器正在运行 Windows 2000。


更新

我刚刚尝试通过 Web 部件运行代码,它工作正常。我在失败的项目中使用的文件结构如下:-

wss
 - VirtualDirectories
   - SharePointWebApp
     - ...sp web app files
     - .
     - .
   - PageLayoutControls
     - control.ascx
     - .
     - .

然后在 IIS 中,我具有以下结构:-

IIS
 - Websites
   - SharePointWebApp (pointing to \wss\VirtualDirectories\SharePointWebApp)
     - PageLayoutControls (virtual directory pointing to \wss\VirtualDirectories\PageLayoutControls)

然后在 PageLayouts 中,我使用以下内容引用控件:-

<%@ Register TagPrefix="TEST" TagName="MyControl" Src="~/PageLayoutControls/control.ascx" %>
<asp:Content ContentPlaceholderID="PlaceHolderMain" runat="server">
  <TEST:MyControl id="myControl" runat="server"/>
</asp:Content>Let me know if you need more info.

更新

谜团越来越深……

当我从 SharePoint Web 前端服务器上的 Internet Explorer(6 或 7)访问 sharepoint 站点时,我没有收到异常。

当我从 SP Web 前端服务器从 Mozilla Firefox 访问共享点站点时,我确实遇到了异常。

当我从任何浏览器远程访问共享点站点时,我得到了异常。

此外,只要他们有权访问共享点站点,我使用什么用户登录该站点也没有区别。

有什么想法吗?


更新

嗯,我现在发现,如果我远程访问共享点站点并且共享点站点尝试在本地执行 File.Create()(即 File.Create("C:\temp\abc.txt")),那么它可以工作. 如果我从共享点框访问共享点站点并远程执行 File.Create()(即 File.Create("\ServerName\ShareName\FolderName\file.txt")),那么它可以工作。

只有当我远程访问共享点站点并让共享点站点尝试远程执行 File.Create() 时,它才会失败。有点像双跳问题。这让我认为这可能是一个 NTLM / Kerberos 问题。

目前,我们正在使用 NTLM 身份验证运行。

有没有其他人遇到过这种问题?


更新

是的,我很确定这是一个不允许双跳的 NTLM 问题。我刚刚将共享点站点上的身份验证更改为使用基本身份验证并且它有效。将其改回集成身份验证,但失败了。

现在决定是移动服务器场以使用 Kerberos 还是找到解决此问题的其他方法。:-/


更新

现在只是给 SPSecurity.RunWithElevatedPrivileges 一个机会。但有一件事,RunWithElevatedPrivileges 是否意味着在这种情况下使用?以前,我只使用它来访问 SharePoint 中的列表和库,而不是访问网络中的文件。

有什么想法吗?


更新

是的,SPSecurity.RunWithElevatedPrivileges 解决了这个问题。:-)

4

1 回答 1

1

我想知道这是否是双跳问题,并且您的代码正试图以模拟用户的身份访问资源,但这失败了,因为 NTLM 不会模拟到另一台服务器(Kerberos 会)。

您是否尝试过 SPSecurity.RunWithElevatedPrivileges?这将删除模拟(RevertToSelf),然后也许应用程序池所有者可以充当他自己(她自己?),而以前可能不能。

只是一个想法,应该很容易尝试。

于 2009-03-19T16:46:06.073 回答