无法通过 *** 以编程方式访问网络路径
Posted
技术标签:
【中文标题】无法通过 *** 以编程方式访问网络路径【英文标题】:Cannot programmatically access network path through *** 【发布时间】:2014-10-08 08:46:45 【问题描述】:我正在尝试使用来自 ASP.NET 中的 Web 服务的网络路径(创建目录、写入和读取文件)。
在我的办公室里一切正常,网络路径在我的笔记本电脑的同一个 LAN 中,但是当我尝试通过 *** 连接到网络路径时,创建目录失败并显示“访问路径被拒绝”错误。
奇怪的是,我可以从 Windows 资源管理器中完美地访问这样的路径,给定我的 *** 凭据,我存储在 Windows 凭据钱包中。
我还尝试将我的 IIS 应用程序池标识设置为“网络服务”,但没有成功。
你能帮帮我吗?
非常感谢
编辑:
当我尝试执行类似
的语句时Directory.CreateDirectory(@"\\my\network\path");
从我的 Visual Studio 2010 中的一个简单控制台应用程序项目中,它完美运行并创建了目录。
问题是当我在本地 IIS 下运行的 Web 服务的业务逻辑中遇到这样的语句时(我通过 VS2010 中的“附加进程...”调试工具连接到该服务)
【问题讨论】:
【参考方案1】:听起来,当您在本地运行时,您的本地域帐户就是运行所有内容的上下文。运行控制台应用程序时,它仍在您的用户上下文中运行,因为您启动了应用程序。在 IIS 中运行时,您是正确的,因为正在使用 app-pool 帐户,并且 networkservice 帐户具有一些相当低的权限。
不使用具有高度特权的帐户(例如您的帐户),假冒能解决您的问题吗?任何需要通过 *** 完成的工作都可以在上下文中“包装”适当的权限。这是另一篇关于使用模拟的 SO 文章,我已针对相关内容实施了该文章:
How do you do Impersonation in .NET?
查看 Matt Johnson 的回答,他创建了一个自定义的模拟类。在 using 块中使用它,然后做你的网络工作。它使用带有 p/invoke 的 advapi32.dll 来执行这种用户帐户的巫术。他还整理了一个 NuGet 包,这可能会为您节省一些时间:
https://www.nuget.org/packages/SimpleImpersonation
【讨论】:
嗨,比尔,谢谢您的回答,但仍然无法正常工作:(同样的问题...此外,我无法更改代码以使用 NuGet 包【参考方案2】:我可能没有您直接询问的所有详细信息,但如果您通过 Visual Studio 和 *** 运行此服务,请查看 CodeBetter 上的 great article。
runas /netonly /user:domain\username “C:\ProgramFiles\Path\to\your\visualstudio”
我面前没有电脑,但我记得我创建了一个批处理文件并运行它来启动 VS 和 Sql Server Management Studio,它就像一个魅力。
如果我误解了这个问题,请原谅我的噪音。
【讨论】:
听上去最有可能解释这个问题。在某些情况下,Windows 安全性可能非常笨拙:-( 一开始设置很痛苦,但它让我可以将自己的设备带到合同中,并且不止一次让我免于使用糟糕的内部硬件。 感谢@wicker95 的解决方案,不幸的是这并不能解决我的问题。请参阅我的编辑。有没有办法使用 /netonly 尝试您的解决方案,但将此方法应用于我本地 IIS 的应用程序池用户?以上是关于无法通过 *** 以编程方式访问网络路径的主要内容,如果未能解决你的问题,请参考以下文章