从 C# 访问 Sharepoint 远程文件夹

Posted

技术标签:

【中文标题】从 C# 访问 Sharepoint 远程文件夹【英文标题】:Access to a Sharepoint Remote Folder from C# 【发布时间】:2013-09-13 15:34:28 【问题描述】:

我开发了一个必须访问 SharePoint 远程文件夹的 ASP.NET MVC 3。

为此,在开发过程中,在运行 Visual Studio 开发服务器之前,我尝试访问远程文件夹。然后,我必须介绍有权查看远程资源的用户的凭据。在此之后,使用以下代码:

string path = @"\\tests.sharepoint.es\folder1";
DirectoryInfo di = new DirectoryInfo(path);
DirectoryInfo[] dis = di.GetDirectories();

文件夹访问成功。但是,当我从 IIS 执行我的 Web 应用程序时,这会失败,出现下一个错误:

对路径“\tests.sharepoint.es\folder1\”的访问被拒绝。

即使我为应用程序池设置了运行 Visual Studio 开发服务器的同一用户,它仍然会失败。

我已确定运行万维网发布服务 (W3SVC) 的用户是 SYSTEM(显然无权访问该文件夹的帐户),但我无法更改此设置,我不确定如果这会导致问题。

另外,我已经阅读了一些关于使用 SPSecurity.RunWithElevatedPrivileges 的帖子,但我无法使用它,因为我的 IIS 服务器没有安装 Sharepoint(它在另一台机器上),因此,我据我所知,无法使用 Microsoft.Sharepoint.dll。

更新:当我尝试使用 Windows 资源管理器访问资源时,我了解到操作系统使用 WebDav 而不是 NetBios。 IIS 可以使用该协议访问资源吗?

【问题讨论】:

【参考方案1】:

如果您确实需要从 Windows Web 服务器(或任何其他模拟远程客户端的服务器)访问具有 Windows 权限的远程资源,则必须在直接登录服务器框的帐户下运行此类代码。这是由“NTLM 单跳”策略引起的 - 用户的凭据只能在直接登录的机器用户或直接与之通信的机器用户上使用(而不是在第二台机器尝试连接的第三台机器上)。

最安全的方法是在有权访问远程资源的帐户下运行进程并在该进程中运行代码。您可以在此类帐户下运行 IIS 进程,但如果在请求期间运行代码,则可能需要将模拟恢复为进程。

您也可以直接模拟特定用户,但您需要有纯文本登录信息。这很可能违反大多数公司的安全策略。

注意:您很可能最终会构建匿名代理 - 请非常小心地理解在不同于实际用户帐户的帐户下访问远程资源的含义。

【讨论】:

我已将有权访问 sharepoint 远程文件夹的帐户设置为我的应用程序池的身份(因此 w3wp.exe 进程在该凭据下运行)但它继续失败并获得同样的错误信息。此外,我测试了不同的模拟选项,但没有任何效果。【参考方案2】:

幸运的是,我找到了解决访问问题的方法。

我已经使用了post中描述的解决方案。

我的代码是这样的:

PinvokeWindowsNetworking.connectToRemote(@"\\tests.sharepoint.es\folder1", "domain\user", "password");
//manage files and folders of my remote resource
//...
PinvokeWindowsNetworking.disconnectRemote(@"\\tests.sharepoint.es\folder1");

【讨论】:

以上是关于从 C# 访问 Sharepoint 远程文件夹的主要内容,如果未能解决你的问题,请参考以下文章

我应该在我的 winform c# 应用程序中实现啥形式的身份验证才能访问 SharePoint 站点中的文件夹?

C# 从FTP下载文件报错: 远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。

从 .Net 应用程序访问 SharePoint 数据时处理凭据

通过 C# 访问远程 COM 对象

访问远程机器上的文件

如何从远程 ip 中的 C# 访问 websocket URL?