无法通过 *** 以编程方式访问网络路径

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 的应用程序池用户?

以上是关于无法通过 *** 以编程方式访问网络路径的主要内容,如果未能解决你的问题,请参考以下文章

PHP网络编程

如何使用路径方式访问带密码的局域网共享文件夹?

如何通过网络中的节点生成随机路径

从 Ubuntu 使用 C# 访问网络路径

网络运维——访问共享的三种方式

以编程方式更改 SSIS 上备份数据库任务的备份文件路径