2016-04-20 90 views
1

我正在使用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其中原始用戶有權訪問但不是模擬器。

在嘗試將文件從這些位置複製我得到的例外是:

型「System.UnauthorizedAccessException的」未處理的異常出現在mscorlib.dll 其他信息:拒絕訪問路徑「 C:\ Users \ username \ Documents \ file.txt'被拒絕。

+0

嘿,那是我的課,整潔:-) –

+0

如何使用[進程監視器(https://technet.microsoft.com/en-us/sysinternals/processmonitor.aspx),看看到底發生了什麼的文件級別(實際用戶,實際文件,請求的實際權限等) –

+1

哇!很高興地告訴你,你做得很好。謝謝 – ehh

回答

2

模擬之前,當前用戶有權訪問源文件路徑,但沒有到目標文件路徑。

模擬之後,情況恰恰相反:模擬用戶可以訪問目標文件路徑,但不能訪問源文件路徑。

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

public void CopyFile(string sourceFilePath, string destinationFilePath) 
{ 
    var content = File.ReadAllBytes(sourceFilePath); 

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

即:

  1. 閱讀從源文件路徑中的所有內容到內存中的字節數組。
  2. 做模仿。
  3. 將字節數組中的所有內容寫入目標文件路徑。

方法和類,這裏使用:

+1

感謝您的幫助 – ehh

+0

感謝您的支持和接受,@ehh! –

1

由於@Uwe凱姆的想法,以下解決方案完美的作品:

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(); 
       } 
      } 
     } 
    } 
+0

這看起來很奇怪。你正在讀「東西」兩次(什麼是「ms」?)。 [這是我的想法](http://stackoverflow.com/a/36743951/107625)。 Plus:這個沒有任何意義的catch塊是沒用的。簡單地省略它以具有相同的功能和增強的可讀性。 –

+1

更新了代碼。對不起,我想念顯示內存流的一部分。 – ehh