我正在尝试从ASP.NET中的Web服务使用网络路径(创建目录,写入和读取文件).
我的办公室里的一切工作正常,网络路径位于我的笔记本电脑的同一个局域网中,但是当我尝试通过VPN连接到网络路径时,目录的创建失败并显示“访问路径被拒绝”错误.
奇怪的是,从Windows资源管理器中,我可以完美地访问这样的路径,根据我的VPN凭据,我存储在Windows Credentials Wallet中.
我还尝试将我的IIS应用程序池标识设置为“网络服务”,但没有运气.
你能帮我吗?
非常感谢你
编辑:
当我尝试执行类似的语句时
Directory.CreateDirectory(@"\\my\network\path");
从我的Visual Studio 2010中的一个简单的控制台应用程序项目,它完美地工作,并创建目录.
问题是当我在我的Web服务的业务逻辑中发出这样的声明时,该声明在本地IIS下运行(并且我通过VS2010中的“Attach Process …”调试工具连接到该声明)
解决方法:
听起来像在本地运行时,您的本地域帐户是运行所有内容的上下文.运行控制台应用程序时,自启动应用程序以来,它仍在用户上下文中运行.在IIS中运行时,您正确使用了应用程序池帐户,并且网络服务帐户具有一些非常低的权限.
而不是使用高权限帐户(例如您的帐户),模拟会解决您的问题吗?任何需要通过VPN完成的工作都可以在上下文中“包装”适当的权限.这是另一篇关于使用模拟的SO文章,我已经为相关事项实现了这个:
How do you do Impersonation in .NET?
请参阅Matt Johnson的答案,他创建了一个自定义的Impersonation类.在使用块中使用它,然后做你的网络东西.它使用advapi32.dll和p / invoke来做这种用户帐户voodoo.他还整理了一个NuGet包,可以为您节省一些时间:
https://www.nuget.org/packages/SimpleImpersonation