2012-03-27 9 views
1

File.Move System.IO.IOException: "この時点でこのリモートコンピュータに接続できなくなりましたコンピュータが受け入れることができる数の接続がすでに存在しているためです。File.Move System.IO.IOException: "このリモートコンピュータに接続できません..."

私はプロセスがSYSアカウントで実行されています。ローカルHD上のファイルを処理し、偽装を使用してドメイン上のリモートドライブに移動します。

編集、コードサンプルを追加:

方法ベローズが繰り返し呼び出される(偽装私は偽装に使用するユーティリティクラスであり、これは問題とは無関係です)。

private void moveFileUsingImpersonation(string srcFilePath, string dstFilePath, string userName, string passWord) 
     { 
       WindowsImpersonationContext wic = null; 
       // move it to destination 
       try 
       { 
        wic = Impersonation.Impersonate(userName, passWord); 
        if (wic != null) 
        { 
         File.Move(srcFilePath, dstFilePath); 
        } 
        else 
        { 
         Console.WriteLine("moveFileUsingImpersonation, Failure to impersonate!"); 
        } 
       } 
       catch(Exception ex) 
       { 
        Console.WriteLine("moveFileUsingImpersonation, Exception={0}", ex.ToString()); 
       } 
       finally 
       { 
        Impersonation.UndoImpersonate(wic); 
       } 
      } 

編集、追加コードサンプル。

プロセスがXPマシンで実行されていて、リモートドライブがXPまたはWin7マシンのいずれかにある場合、File.Moveの呼び出しはうまく動作し、必要なファイルを移動します。ただし、プロセスがWin7で実行されていて、リモートドライブがWin7マシン上にある場合は、20個のファイルが移動された後で前述の例外がスローされます。

私も同じ結果で、MOVEFILE_REPLACE_EXISTING & MOVEFILE_COPY_ALLOWED & MOVEFILE_WRITE_THROUGHフラグでのWin32 API MoveFileExを呼び出すために試してみた - ERROR_REQ_NOT_ACCEP 71(0x47)。

Win7では、File.Moveを呼び出すことによる基本的な接続が正しく終了していないようです。

これを克服する方法はありますか?

私はここで何が欠けていますか?

おかげで、あなたのコードに基づいて、宜蘭

+2

ここでコードサンプルなしであなたが紛失していることを伝えるのは少し難しいです。何を試しましたか? http://mattgemmell.com/2008/12/08/what-have-you-tried/ – David

+0

@David Stratton、ご回答いただきありがとうございます。サンプルコードが追加されました。 –

答えて

3

は、おそらくUNCパスを使用してコピーしています。私はいつもこれをやっている問題を抱えていました。私は、必要に応じてコード内のドライブをマップしてから切断するのが最善だということを学びました。権限の問題や、あなたが説明しているような問題に対処する必要がなくなります。

これを処理するクラスがあります。私たちは、コードとリモートの両方のWin7マシンを含めて、5年以上問題なく使用してきました。うまくいけばそれはあなたのためにもうまくいくでしょう。

public static class NetworkDrives 
    { 
     public static bool MapDrive(string DriveLetter, string Path, string Username, string Password) 
     { 

      bool ReturnValue = false; 

      if(System.IO.Directory.Exists(DriveLetter + ":\\")) 
      { 
       DisconnectDrive(DriveLetter); 
      } 
      System.Diagnostics.Process p = new System.Diagnostics.Process(); 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.CreateNoWindow = true; 
      p.StartInfo.RedirectStandardError = true; 
      p.StartInfo.RedirectStandardOutput = true; 

      p.StartInfo.FileName = "net.exe"; 
      p.StartInfo.Arguments = " use " + DriveLetter + ": " + '"' + Path + '"' + " " + Password + " /user:" + Username; 
      p.Start(); 
      p.WaitForExit(); 

      string ErrorMessage = p.StandardError.ReadToEnd(); 
      string OuputMessage = p.StandardOutput.ReadToEnd(); 
      if (ErrorMessage.Length > 0) 
      { 
       throw new Exception("Error:" + ErrorMessage); 
      } 
      else 
      { 
       ReturnValue = true; 
      } 
      return ReturnValue; 
     } 
     public static bool DisconnectDrive(string DriveLetter) 
     { 
      bool ReturnValue = false; 
      System.Diagnostics.Process p = new System.Diagnostics.Process(); 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.CreateNoWindow = true; 
      p.StartInfo.RedirectStandardError = true; 
      p.StartInfo.RedirectStandardOutput = true; 

      p.StartInfo.FileName = "net.exe"; 
      p.StartInfo.Arguments = " use " + DriveLetter + ": /DELETE"; 
      p.Start(); 
      p.WaitForExit(); 

      string ErrorMessage = p.StandardError.ReadToEnd(); 
      string OuputMessage = p.StandardOutput.ReadToEnd(); 
      if (ErrorMessage.Length > 0) 
      { 
       throw new Exception("Error:" + ErrorMessage); 
      } 
      else 
      { 
       ReturnValue = true; 
      } 
      return ReturnValue; 
     } 

    } 
+0

コードサンプルをありがとう、ありがとう、UNCパスが実際に使用されています。私は今日それを与えるだろう。リモートドライブがマップされている場合、それは(ファイルを移動するための)なりすましがまだ必要であることを意味しますか? –

+0

関数内で渡されるユーザー名とパスワードを使用します。権利を持たないフォルダにドライブをマップする場合と同じように動作します。ユーザー名とパスワードの入力を求めるメッセージが表示され、アクセス権のあるアカウントのパスワードを入力すると、そのドライブにアクセスできます。ログオンまたはログオフする必要はありません。ただそこにあります。 – David