来自共享驱动器的 C# System.IO.File.Copy 在本地主机上工作,但在服务器上拒绝访问该路径
C# System.IO.File.Copy from shared drive works on localhost but access to the path is denied on server
我想将 pdf 从共享文件夹复制到项目文件夹。所以我使用 System.IO.File.Copy:
System.IO.File.Copy(@"\netstore\IT\SIGN2454.pdf", "C:\inetpub\wwwroot\myaspmvcwebapisite\temp2454.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 我已经根据您提供的 link 更新了我的 IIS 设置。
- 标识字段已从 NetworkService 更新为 ApplicationPoolIdentity。
- 我授予了
<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);
}
您是说它在本地 IIS 或 Visual Studio (IIS Express) 中运行正常吗? IIS Express 在活动用户帐户下运行,但 IIS 在应用程序池的标识下运行。授予对 IIS_USRS 的访问权限对于本地目录就足够了,但是远程目录将需要身份验证,这意味着它将通过应用程序池的身份进行身份验证。 This article from Microsoft 可能会给你一些额外的指导,运行。
但是,无需自定义任何内容,应用程序池作为网络服务运行这一事实应该足以让您授予访问权限。网络服务通过机器账户授权(<domainname>\<machinename>$
)。所以,如果你为该帐户授权网络共享,你应该是好的。
我想将 pdf 从共享文件夹复制到项目文件夹。所以我使用 System.IO.File.Copy:
System.IO.File.Copy(@"\netstore\IT\SIGN2454.pdf", "C:\inetpub\wwwroot\myaspmvcwebapisite\temp2454.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 我已经根据您提供的 link 更新了我的 IIS 设置。
- 标识字段已从 NetworkService 更新为 ApplicationPoolIdentity。
- 我授予了
<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);
}
您是说它在本地 IIS 或 Visual Studio (IIS Express) 中运行正常吗? IIS Express 在活动用户帐户下运行,但 IIS 在应用程序池的标识下运行。授予对 IIS_USRS 的访问权限对于本地目录就足够了,但是远程目录将需要身份验证,这意味着它将通过应用程序池的身份进行身份验证。 This article from Microsoft 可能会给你一些额外的指导,运行。
但是,无需自定义任何内容,应用程序池作为网络服务运行这一事实应该足以让您授予访问权限。网络服务通过机器账户授权(<domainname>\<machinename>$
)。所以,如果你为该帐户授权网络共享,你应该是好的。