2012-03-27 6 views
1

File.Move System.IO.IOException: "Zu diesem Remotecomputer können derzeit keine weiteren Verbindungen hergestellt werden weil es bereits so viele Verbindungen gibt, wie der Computer akzeptieren kann ".File.Move System.IO.IOException: "Es können keine weiteren Verbindungen zu diesem Remotecomputer hergestellt werden ..."

Ich habe einen Prozess unter SYS-Konto ausgeführt. Es verarbeitet Dateien auf lokaler Festplatte und verschiebt sie mithilfe von Identitätswechsel auf ein Remote-Laufwerk in einer Domäne.

bearbeiten, hinzugefügt Codebeispiel:

Das Verfahren unten wiederholt aufgerufen wird (Der Identitätswechsel eine Utility-Klasse, die ich für den Identitätswechsel verwenden, dies auf die Frage irrelevant ist).

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); 
       } 
      } 

bearbeiten, hinzugefügt Codebeispiel.

Wenn der Prozess auf XP-Computer ausgeführt wird und das Remote-Laufwerk auf XP oder Win7-Maschine ist, funktioniert der Aufruf von File.Move einwandfrei und verschiebt die erforderlichen Dateien. Wenn der Prozess jedoch auf Win7 ausgeführt wird und sich Remote auf Win7-Computer befindet, wird die genannte Ausnahme ausgelöst, nachdem 20 Dateien verschoben wurden.

Ich habe auch versucht, den Win32-API MoveFileEx mit dem MOVEFILE_REPLACE_EXISTING & MOVEFILE_COPY_ALLOWED & MOVEFILE_WRITE_THROUGH Fahnen zu nennen, mit dem gleichen Ergebnis - ERROR_REQ_NOT_ACCEP 71 (0x47).

Es scheint, dass die zugrunde liegende Verbindung, die durch den Aufruf von File.Move hergestellt wird, nicht ordnungsgemäß auf Win7 geschlossen wird.

Gibt es eine Möglichkeit, dies zu überwinden?

Was fehlt mir hier?

Danke, Ilan

+2

Es ist ein bisschen schwer zu sagen, was Sie hier ohne ein Codebeispiel vermissen. Was hast du probiert? http://mattgememm.com/2008/12/08/what-have-you-tried/ – David

+0

@ David Stratton, Vielen Dank für Ihre Antwort, haben einen Beispielcode hinzugefügt. –

Antwort

3

Basierend auf Ihren Code, Sie kopieren wahrscheinlich einen UNC-Pfad verwenden. Ich hatte immer Probleme damit, und ich habe gelernt, dass es am besten ist, Laufwerke einfach im Code zuzuordnen und dann zu trennen, wenn dies erforderlich ist. Es erspart mir, Probleme mit Berechtigungen zu behandeln, und auch Probleme wie die, die Sie beschreiben.

Wir haben eine Klasse, die das für uns behandelt. Wir verwenden es seit über 5 Jahren ohne Probleme, auch auf Win7-Rechnern sowohl auf der Code- als auch auf der Remote-Seite. Höflich wird es auch für dich arbeiten.

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

Vielen Dank für Ihr Codebeispiel, schätzen Sie es, es wird tatsächlich ein UNC-Pfad verwendet. Ich würde es heute versuchen. Wenn das Remote-Laufwerk zugeordnet ist, bedeutet dies, dass ein Identitätswechsel (zum Verschieben der Datei) noch erforderlich ist? –

+0

Nein. Es verwendet den Benutzernamen und das Passwort, die in der Funktion übergeben werden. Es funktioniert genau so, als würden Sie ein Laufwerk einem Ordner zuordnen, für den Sie keine Rechte haben. Sie werden aufgefordert, einen Benutzernamen und ein Passwort einzugeben, und wenn Sie diese für ein Konto angeben, auf das Sie zugreifen können, können Sie auf das Laufwerk zugreifen. Sie müssen sich nicht an- oder abmelden, es ist nur da. – David