我正在尝试将文件从客户端复制到具有共享驱动器的服务器。当我这样做时,我得到了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);
”的内容,以及服务器上的所有内容,例如地图上的安全性等。
你有什么问题吗?我很感激你的帮助!
提前致谢
答案 0 :(得分:1)
您可能对该文件具有读/写权限,但对文件夹本身没有。这就是为什么你不能在那个位置创建一个新文件的原因之一。
另请注意,如果启用了UAC,则应用程序不会“继承”您的管理员权限,除非您明确指定(通过以管理员身份运行)
答案 1 :(得分: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.
}
}
}
正如您所看到的,在这种情况下您具有相当大的灵活性。希望这对你有所帮助。
答案 2 :(得分:0)
我很抱歉,但问题是当我第一次共享驱动器时忘记将权限更改为“完全控制”,并且只有读取权限。这使得除了通过共享网络读取之外,计算机无法做任何事情。我很抱歉,我的错! 无论如何,我真的很感谢你的帮助,谢谢!