3

我正在尝试将文件从客户端复制到具有共享驱动器的服务器。当我这样做时,我得到了UnauthorizedAccessException它,它说拒绝访问我试图复制到的这条路径。这很奇怪,因为我拥有所有权限并且我以管理员身份登录。奇怪的是,当写入服务器上同一路径上的文本文件时,它可以工作。像这样:

FileStream fs = new FileStream(@"\\SIMON-VAIO\SimonShared\Users\Simon\Desktop\Files\Clients\clients.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

        using (StreamReader sr = new StreamReader(fs))
        {
            while (sr.Peek() >= 0) //as long as there are characters to read
            {
                ListViewItem lvwItem = new ListViewItem();
                lvwItem.Text = sr.ReadLine();
                AddListViewItem(lvwItem);
            }
            sr.Close();
        }

但是在执行复制方法时,我得到了这个异常。这是我复制的方式:

FileInfo file = new FileInfo(sourcePath);
            string newPath = targetPath + "\\" + file.Name;
            File.Copy(sourcePath, newPath, true);

所以我输入了源和目标的文件名和扩展名的整个路径。

我已经尝试过诸如“ File.SetAttributes(dest, FileAttributes.Normal);”之类的东西,以及服务器上的所有内容,例如地图上的安全性等。

你知道出了什么问题吗?非常感谢您的帮助!

提前致谢

4

3 回答 3

1

您可能特别具有对该文件的读/写权限,但对文件夹本身没有。这就是您无法在该位置创建新文件的原因之一。

另请记住,如果您启用了 UAC,应用程序将不会“继承”您的管理员权限,除非您明确授予它们(通过以管理员身份运行)

于 2013-03-27T15:08:57.893 回答
1

由于以下问题,可能会出现该特定问题:

  • 对驱动器的无效访问
  • 对文件夹的无效访问
  • 对覆盖或移动文件的访问无效。

根据路径位置,它会让我相信它是另一台计算机。您必须确保它满足执行任务所需的可访问性要求。

您可以通过几种不同的方式完成此操作:

  • 为适当的提升权限编写测试。
  • 尝试让您的程序模拟管理员或网络服务帐户。
  • 您可以在尝试与之交互之前查询权限。

这些是您可以做到这一点的几种方法。

你甚至可以针对 UAC 进行测试:

WindowsIdenetity user = WindowsIdentity.GetCurrent();
WindowsPrincipal role = new WindowsPrincipal(user);

if (Environment.OSVersion.Platform == PlatformId.Win32NT) && (Environment.OSVersion.Version.Major > 6)
{
     if(!(String.NullOrEmpty(user.ToString())))
     {
          if(role.IsInRole(WindowsBuiltInRole.Administrator)
          {
              // Good
          }
     }
}

这将是一种实际验证您担任适当角色的方法;如果不是,那么您实际上可以编写一个MessageBox或其他方式来指示权限不足。

你甚至可以查询目录:

string remotePath = @"\\SomeLocation";
bool IsAccess = false;

DirectoryInfo di = new DirectoryInfo(remotePath);
if(di.Exists)
{
    try
    {
        var acl = di.GetAccessControl();
        IsAccess= true;
    }
    catch(UnauthorizedAccessException ex)
    {
       if(ex.Message.Contains("read-only"))
       {
           IsAccess = true;
       }
       else
       {
           // No Access Fail, do something else.
       }
    }
}

如您所见,在这种情况下您有很大的灵活性。希望这对您有所帮助。

于 2013-03-27T15:09:05.903 回答
0

我很抱歉,但问题是我第一次共享驱动器时忘记将权限更改为“完全控制”,并且只有读取权限。这使得计算机除了通过共享网络读取之外,无法做任何事情。再次对不起,是我的错!无论如何,我真的很感谢你的帮助,谢谢!

于 2013-03-28T11:49:56.593 回答