2016-04-20 11 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

ねえ、それは、どのように実際に何が起こるかを確認するために、[プロセスモニタ](https://technet.microsoft.com/en-us/sysinternals/processmonitor.aspx)を使用する方法についてきちんと:-) –

+0

私のクラスですファイルレベル(実際のユーザー、実際のファイル、要求された実際のアクセス許可など) –

+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

あなたのupvoteと受け入れのおかげで、@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)。プラス:意味のないこのキャッチブロックは役に立たない。これを省略すると、同じ機能と読みやすさが向上します。 –

+1

コードを更新しました。申し訳ありませんが、私はメモリストリーム部分を見せています。 – ehh

関連する問題