【问题标题】:C# System.IO.File.Copy from shared drive works on localhost but access to the path is denied on server来自共享驱动器的 C# System.IO.File.Copy 在本地主机上工作,但在服务器上拒绝访问该路径
【发布时间】:2017-02-01 14:57:39
【问题描述】:

我想将 pdf 从共享文件夹复制到项目文件夹。所以我使用 System.IO.File.Copy:

System.IO.File.Copy(@"\\netstore\IT\SIGN\112454.pdf", "C:\inetpub\wwwroot\myaspmvcwebapisite\temp\112454.pdf", true);

当我在我的机器上本地运行应用程序但当我将它发布到服务器并转到我得到的站点时,文件会复制:

signature-service.ts:120 {"$id":"1","Message":"An error has occurred.","ExceptionMessage":"Access to the path '\\\\netstore\\IT\\SIGN\\112454.pdf' is denied.","ExceptionType":"System.UnauthorizedAccessException","StackTrace":"   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\r\n   at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)\r\n   at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)\r\n   at api.valbruna.local.Controllers.ValShip.SignatureController.Post(Int32 id)"}

如何授予对站点的访问权限以访问该文件位置?

请注意:

  • 该站点是一个 MVC Web API INTRANET 应用程序
  • 它使用基于 Windows 的身份验证
  • 当我说本地主机时,我的意思是在 Visual Studio(IISExpress) 内

我尝试过的:

  • 授予每个人对文件夹 \\netstore\IT\SIGN\ 的访问权限

我查看了有关堆栈溢出的其他帖子 (Access to the path is denied),但大多数答案都说授予对 IIS_USRS 的访问权限,并且我已授予所有人访问权限,因此这不起作用。

---更新1---

@Chris Pratt 我已根据您提供的链接更新了我的 IIS 设置。

  1. 身份字段已从 NetworkService 更新为 ApplicationPoolIdentity。

  1. 我授予对<domainname>\<machinename>$ 的完全访问权限

---更新2---

@jp2code 我打开了网络发现,但仍然遇到同样的错误。

---更新3---

作为使用Impersonation class 访问共享文件夹的临时解决方法:

using (new Impersonator("username", System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName, "password"))
{
    // code that executes under the new context.
    sizingDoc.LoadFromFile(sigDocUrl);
}

【问题讨论】:

  • 如果这是一台 Windows PC,请确保启用了“网络发现”。
  • @jp2code 感谢您的回复。我没有适当的授权来对服务器进行更改,所以我会让我的老板打开它。当他这样做时,我会告诉你的。
  • @jp2code 我打开了家庭或工作的网络发现,以及服务器上的域配置文件。但是,我仍然得到对路径 '\\\\netstore\\IT\\SIGN\\112454.pdf' 的访问被拒绝错误。还有其他建议吗?
  • 你能重启两台电脑吗?或者,至少,注销并重新登录以强制重新加载所有设置。如果这不起作用,则一定是其他原因导致了您的问题。
  • @jp2code 我无法重新启动 PC,但我能够注销并重新登录。这不起作用,但由于某种原因,在其他帐户上使用模拟有效。 stackoverflow.com/questions/4957522/…我目前正在研究为什么我的用户帐户在模拟时无法访问netstore。但目前模拟管理员帐户可以访问网络存储上的必要文件。

标签: c# asp.net-mvc file asp.net-web-api system.io.file


【解决方案1】:

您是说它在本地 IIS 或 Visual Studio (IIS Express) 中托管时运行良好? IIS Express 在活动用户帐户下运行,但 IIS 在应用程序池的标识下运行。授予对 IIS_USRS 的访问权限对于本地目录就足够了,但远程目录将需要身份验证,这意味着它将通过应用程序池的身份进行身份验证。 This article from Microsoft 可能会给您一些额外的指导,帮助您启动和运行它。

但是,无需自定义任何内容,应用程序池作为网络服务运行这一事实应该足以让您授予访问权限。网络服务通过机器账户(<domainname>\<machinename>$)授权。因此,如果您为该帐户授权网络共享,您应该会很好。

【讨论】:

  • 感谢您的回复。我很抱歉我没有指定:在 Visual Studio (IIS Express) 中。我已经用我从您发布的链接中采取的步骤更新了我的问题。不幸的是,我仍然遇到同样的错误。当您说为服务器授权网络共享时,您的意思是像 @jp2code 建议的那样吗?
猜你喜欢
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多