web-dev-qa-db-ja.com

UNCパスを監視するFileSystemWatcher

このトピックについての質問は不足していませんが、私はまだ問題を抱えています。これが私の状況です。設定ファイルで指定されているパスを監視する必要のあるサービスがあります。ローカルドライブを使用した場合は、問題なく動作します。

ただし、\\server2\secondary\temp\watch_folderなどに変更すると、サービスが開始されません。ログのエラーは

ディレクトリ名\\ server2\secondary\temp\watch_folderは無効です。

それを直接Windowsエクスプローラにコピーすると、フォルダは正常に開きます。コードを取得して古いWinformsアプリに貼り付けると、問題なく動作します。 「ログオン」アカウントをすべて試しました。 Administratorアカウントを使用するように設定しましたが、まだサイコロはありません。

これが私のコードです:

_watcher = new FileSystemWatcher();
_watcher.Path = ConfigurationManager.AppSettings["WatchFolder"];
_watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
_watcher.Filter = "*.txt";
_watcher.Created += new FileSystemEventHandler(OnCreated);
_watcher.Error += new ErrorEventHandler(OnError);
_watcher.EnableRaisingEvents = true;

何か案は?私は途方に暮れていて、この時点で私はそれをあまりにも長く見続けてきたと思います。何卒よろしくお願い申し上げます。

ありがとう、ニック

[〜#〜] edit [〜#〜]ここに例外があります:

サービスを開始できません。 System.ArgumentException:ディレクトリ名\ server2\Secondary\temp\watch_folderは無効です。
at System.IO.FileSystemWatcher.set_Path(String value)
FileWatcher.FileWatcher.Watch()で
at FileWatcher.FileWatcher.OnStart(String [] args)
System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)で

22
nickfinity

私はこれを試しました:

var _watcher = new FileSystemWatcher();
_watcher.Path = @"\\10.31.2.221\shared\";
_watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
_watcher.Filter = "*.txt";
_watcher.Created += new FileSystemEventHandler((x, y) =>Console.WriteLine("Created"));
_watcher.Error += new ErrorEventHandler( (x, y) =>Console.WriteLine("Error"));
_watcher.EnableRaisingEvents = true;
Console.ReadKey();

問題なく動作しますが、次の場合にのみ例外を複製しました。

  • 実行中のユーザーには、リモートフォルダーを読み取る権限がありません。
  • リモートフォルダーが存在しません。

あなたの問題は確かに権限に関連しています。実行中のユーザーには必要な権限がないと思います。

もう1つ試すことは、リモートフォルダーを1つのローカルにマップすることです。

これをcmdで実行します。

Net Use Z: \\server2\Secondary\temp\watch_folder /user:Domain\UserName Password

次に、コードで:

_watcher.Path = @"Z:\";
22
Marco Medrano

サービスは、その共有へのアクセス許可がないユーザーアカウントで実行されている可能性があります。異なる資格情報で実行するようにWindowsサービスを変更してみてください。

6
John Koerner

CodeprojectのWindowsサービスでFileSystemWatcherを使用して認証情報でUNCを取得する本当にクールな方法を見つけました。

adrian Hayesの投稿を参照してください: http://www.codeproject.com/Articles/43091/Connect-to-a-UNC-Path-with-Credentials

彼の解決策はごちそうです。

2
John

私もこの問題に遭遇しました。私の修正は、サーバーパスに当社のドメイン名を含めることでした。

\\servername.company.com\directorytowatch
1
Chris

次のようなパスが必要になる場合があります。

\\\\server2\\Secondary\\temp\\watch_folder

または

@"\\server2\Secondary\temp\watch_folder"
0
Thor Burfine