2012-03-26 4 views
2

ドライブ "Z:\"としてマップされているネットワーク上のファイルをいくつか更新するWindowsサービスがあります。管理者としてVSからコードを実行すると、マップされたドライブ上のファイルをコピーすることができますが、管理者アカウントで実行されているサービスから実行されると同じことが失敗します。 マップされたドライブは、サービスが実行されている同じアカウントから作成されます。なぜそれがVSから実行されるときに動作するのか困惑しますが、サービスからは出ません。 ネットワークドライブよりもUNCを使用する方が良いですか? 以下のフォーラムで回避策があります http://support.microsoft.com/default.aspx?scid=kb;en-us;827421#appliesto UNC not mappedドライブが使用されています。パスの一部を見つけることができませんでした:Windowsサービスを使用してマップされたドライブ上のファイルをコピー中

答えて

3

私はUNCが良いアイデアであることを示唆しています。

マップされたドライブがログイン時にマップされる場合はどうなりますか?ログインしていなくてもサービスが実行されるため、マッピングが作成されないことがあります。

3

私たちもこれを経験しましたが、私たちの決議がなぜ機能するのかは分かりませんが、私はあなたに何が働いたのかを伝えることができます。

ドライブ内のコードをマップします。同じアカウントを使用しているからといって、マップされているドライブに依存しないでください。

私たちが見た行動に基づいて、これは私たちの状況で起こっていたGUESSとあなたの状況についてです。

私たちが問題を抱えていたサービスは、ログインスクリプトでマップされたドライブを使用していました。マシンが同じユーザーとしてログインしていた場合、それは機能していましたが、うまくいきませんでした。それに基づいて、私はドライブが本当に「ログオン」していないため、ドライブがマップされていないと推測しました。

ドライブのコードをマッピングして固定しました。

また、UNCパスを直接参照することもできますが、権限の問題もあります。ドライブをマッピングし、ユーザー名とパスワードを渡すと、私たちの方がはるかにうまく機能しました。

これを実行するための当社のコード:

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

これは、複数の同時接続試行では機能しません。 –

0

私は同じ問題を解決するために(〜3日間)苦労しました。 NTFSとファイルレベルのアクセス許可に関連しているようです。ドライブではなく共有の場所を使用する方がよいでしょう。

関連する問題