文件访问被拒绝

10
我正在使用一个FTPClient库将Windows共享中的文件传输到FTP服务器。 该库的 SendFile 方法使用以下代码:
FileStream stream = new FileStream(localFileName, FileMode.Open);

执行该代码时会抛出System.UnauthorizedAccessException异常,但是在相同用户帐户下使用Windows资源管理器可以打开、重命名和移动该文件。

有人能告诉我为什么会出现这种情况吗?

编辑:

奇怪的是,我可以访问其他文件共享中已授予与我无法访问的文件相同的NTFS权限。

此外,这是一个Windows窗体应用程序。

更新:

仍然没有解决这个问题。我可以使用StreamReader读取文件,但无法使用文件流。我不明白两者为什么表现不同。


你是从“Windows Forms”应用程序还是ASP.NET页面调用这个吗? - russau
从 Windows Forms 应用程序 - jel
1
你有没有从共享文件夹中运行这个应用程序的机会?我知道 .net(默认情况下)在这种情况下会降低应用程序的权限。 - russau
你的文件本身不会是只读的吧? - fretje
5个回答

28

您确定这是同一个用户帐户吗?您可以尝试类似以下的操作

MessageBox.Show(WindowsIdentity.GetCurrent().Name);

此外,您确定该文件不是只读的吗?您需要对该文件进行写入访问吗? 否则,您可以尝试:

FileStream stream = new FileStream(localFileName, FileMode.Open, FileAccess.Read);

12
谢谢你的回答。我的文件只读,但由于我没有请求写入权限,因此我认为定义FileAccess.Read是不必要的。但我错了。添加FileAccess.Read是关键。 - Matt Cofer

1

运行您的代码的进程没有文件权限。

如果它是Web应用程序的一部分 - 您需要授予ASPNET帐户访问权限。

在文件上授予“everyone”权限,看看它是否仍然存在问题。


0

它靠近FileSecurity类。

请查看FileSecurity类

并尝试:

        // Get a FileSecurity object that represents the
        // current security settings.
        FileSecurity fSecurity = File.GetAccessControl(localFileName);

        // Add the FileSystemAccessRule to the security settings.
        fSecurity.AddAccessRule(new FileSystemAccessRule("DOMAIN\USERNAME",
            FileSystemRights.ReadData, AccessControlType.Allow));

        // Set the new access settings.
        File.SetAccessControl(localFileName, fSecurity);

这导致出现以下异常:未处理的异常:System.Security.Principal.IdentityNotMappedException:无法翻译某些或所有身份引用。此设置涉及域信任,例如我是另一个域中组的成员,该组被授予访问此文件的权限,我想知道这是否对此产生影响。 - jel
你改变了 "DOMAIN\USERNAME" 字符串吗? - Chernikov
哎呀,我已经做了,但忘记转义“\”了,现在它可以正常运行,但我仍然无法访问该文件。 - jel

0

我认为错误发生在发送文件之前打开文件的时候?也就是说,FTP 站点权限在这一点上不会是一个因素。 - russau

0

你的项目是从网络驱动器运行的吗?如果是,那么它将以受限权限模式运行,可能会导致此问题。尝试将项目复制到C驱动器并再次运行。


我正在使用默认本地项目目录中的 Visual Studio 调试模式运行它。 我正尝试通过其 UNC 路径访问文件,例如 \server\share\file,但只要我拥有正确的权限(我具有完全访问权限),那应该不会有任何问题,对吗? - jel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接