我在SharePoint 2007中的PageLayout内的ascx中运行代码,该代码访问远程服务器上的文件,即File.Create(“\ servername \ sharename \ folder \ file.txt”)。该代码在SharePoint Web应用程序中运行,该Web应用程序在web.config中将CAS信任设置为“完全”。 File.Create抛出以下异常: -
System.UnauthorizedAccessException的
拒绝访问路径'\\ servername \ sharename \ folder \ file.txt'。
共享对具有完全控制权限的所有人共享,并且NTFS权限设置为具有完全控制权限的所有人。 Web应用程序应用程序池在域帐户下运行,并且具有访问该资源的显式权限(不应该需要这样)。
我在远程计算机上运行了Process Monitor,并且没有在服务器上记录命中。这使我相信这是SharePoint代码访问安全设置的问题。就像我上面所说的那样,web.config中的信任设置为Full。
CAS是否仍然可以阻止远程访问?谁能想到任何其他领域要审查?
更新
更多信息......
我已尝试制作应用程序池帐户管理员,但问题仍然存在。使用相同的方法访问本地计算机上的驱动器时,它工作正常。使用应用程序池帐户在sharepoint之外的SnippetCompiler中运行相同的代码可以正常工作。
希望这会有所帮助,请告诉我您是否可以考虑我可以尝试的更多调查途径或测试。
更新
我不确定这是否会影响问题,但本地服务器正在运行Windows Server 2003,而远程服务器正在运行Windows 2000。
更新
我刚尝试通过网络部件运行代码,它运行正常。我在项目中使用的文件结构失败如下: -
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访问sharepoint站点时,我得到了例外。
当我从任何浏览器远程访问sharepoint站点时,我得到了例外。
此外,只要他们有权访问sharepoint网站,我用来登录网站的用户就没有区别。
有什么想法吗?
更新
嗯,我现在发现如果我远程访问sharepoint站点并且sharepoint站点尝试在本地执行File.Create()(即File.Create(“C:\ temp \ abc.txt”))然后它工作。如果我从sharepoint框访问sharepoint站点并远程执行File.Create()(即File.Create(“\ ServerName \ ShareName \ FolderName \ file.txt”)),那么它可以工作。
只有当我远程访问sharepoint站点并让sharepoint站点尝试远程执行File.Create()时,它才会失败。一种双跳问题。这让我觉得它可能是NTLM / Kerberos问题。
目前,我们正在使用NTLM身份验证运行。
还有其他人遇到过这类问题吗?
更新
是的,我很确定这是一个不允许双跳的NTLM问题。我刚刚更改了sharepoint站点上的身份验证以使用基本身份验证,并且其工作正常。将其更改回集成身份验证,但失败了。
现在决定是否移动服务器场以使用Kerberos或找到解决问题的另一种方法。 : - /
更新
现在就给SPSecurity.RunWithElevatedPrivileges一个镜头。但有一件事是RunWithElevatedPrivileges意味着在这种情况下使用?以前,我只使用它来访问SharePoint中的列表和库,而不是访问文件访问网络。
有什么想法吗?
更新
是的,SPSecurity.RunWithElevatedPrivileges解决了这个问题。 : - )
答案 0 :(得分:1)
我想知道这是否是双跳问题,并且您的代码尝试以模拟用户身份访问资源,但由于NTLM不会模拟到其他服务器(Kerberos会),因此会失败。
您是否尝试过SPSecurity.RunWithElevatedPrivileges?那将删除模仿(RevertToSelf),然后应用程序池所有者可能只是作为他自己(她自己?),而也许它之前不能。
只是一个想法,应该很容易尝试。