使用模仿器复制文件,引发未经授权的访问异常

Posted

技术标签:

【中文标题】使用模仿器复制文件,引发未经授权的访问异常【英文标题】:Copying a file, using impersonator, throw an Unauthorized Access Exception 【发布时间】:2016-04-20 07:19:48 【问题描述】:

我正在使用this Impersonator class 将文件复制到具有访问权限的目录。

public void CopyFile(string sourceFullFileName,string targetFullFileName)

    var fileInfo = new FileInfo(sourceFullFileName);

    try
    
        using (new Impersonator("username", "domain", "pwd"))
        
            // The following code is executed under the impersonated user.
            fileInfo.CopyTo(targetFullFileName, true);
        
    
    catch (IOException)
    
        throw;
    

这段代码几乎可以完美运行。 我面临的问题是,当 sourceFullFileName 是位于 C:\Users\username\Documents 之类的文件夹中的文件时,原始用户可以访问但模仿者没有。

尝试从该位置复制文件时遇到的异常是:

在 mscorlib.dll 中出现“System.UnauthorizedAccessException”类型的未处理异常 附加信息:对路径“C:\Users\username\Documents\file.txt”的访问被拒绝。

【问题讨论】:

嘿,这是我的课,整洁:-) 如何使用Process Monitor 查看文件级别(实际用户、实际文件、请求的实际权限等)实际发生的情况 哇!很高兴当面告诉你,你做得很好。谢谢 当您冒充其他用户时,它可能无法访问初始用户的主文件夹。如果文件不是太大,如何先将其读入内存(如File.ReadAllBytes 读入byte[])而不进行模拟,然后进行模拟,然后将byte[] 写入目标文件? "把它读入内存怎么样..." 似乎是一个不错的解决方案,我会试试的 【参考方案1】:

在模拟之前,当前用户可以访问源文件路径,但不能访问目标文件路径。

模拟之后,情况正好相反:被模拟的用户可以访问目标文件路径,但不能访问源文件路径。

如果文件不是太大,我的想法如下:

public void CopyFile(string sourceFilePath, string destinationFilePath)

    var content = File.ReadAllBytes(sourceFilePath);

    using (new Impersonator("username", "domain", "pwd"))
    
        File.WriteAllBytes(destinationFilePath, content);
    

即:

    将源文件路径中的所有内容读取到内存中的字节数组中。 进行模拟。 将内存中字节数组的所有内容写入目标文件路径。

这里使用的方法和类:

File.ReadAllBytes 将所有内容读入内存。 File.WriteAllBytes 将内存中的所有内容写入文件。 Impersonator 临时更改当前线程的身份。

【讨论】:

【参考方案2】:

感谢@Uwe Keim 的想法,以下解决方案完美运行:

    public void CopyFile(string sourceFullFileName,string targetFullFileName)
    
        var fileInfo = new FileInfo(sourceFullFileName);

        using (MemoryStream ms = new MemoryStream())
        
            using (var file = new FileStream(sourceFullFileName, FileMode.Open, FileAccess.Read))
            
                 byte[] bytes = new byte[file.Length];
                 file.Read(bytes, 0, (int)file.Length);
                 ms.Write(bytes, 0, (int)file.Length);
             

            using (new Impersonator("username", "domain", "pwd"))
            
                 using (var file = new FileStream(targetFullFileName, FileMode.Create, FileAccess.Write))
                 
                       byte[] bytes = new byte[ms.Length];
                       ms.Read(bytes, 0, (int)ms.Length);
                       file.Write(bytes, 0, bytes.Length);
                       ms.Close();
                 
            
        
    

【讨论】:

这看起来很奇怪。您正在阅读“某事”两次(ms 是什么?)。 This is what I had on my mind。另外:这个没有任何意义的catch块是没用的。只需将其省略即可具有相同的功能并增强可读性。 更新了代码。对不起,我错过了展示内存流部分。

以上是关于使用模仿器复制文件,引发未经授权的访问异常的主要内容,如果未能解决你的问题,请参考以下文章

将配置文件放置在重定向文件夹中时,Configuration.Save 方法会引发未经授权的访问错误

在远程文件/目录上设置 ACL 时未经授权的操作

在命名空间内定义函数时引发链接器错误? [复制]

使用 Avro 文件批量复制到 Amazon Redshift 中的异常处理

清除剪贴板以禁止未经授权的复制,插入消息?

Angular.js对复制的文件对象的非法调用