C# でファイル レプリケーション サービスに取り組んでいます。このサービスは、ユーザー空間にアクセスできる環境で完全に機能します。ただし、サービスとして実行すると、エラーが発生し始めます。
このシナリオで UNC 共有にアクセスする方法については多くの情報が公開されていますが、最も可能性が高いと思われる解決策を追求した結果、まだ不足していることがわかりました。
私の「障害のある」環境では、サービスは「管理者」アカウントとして実行されており、いくつかのアプローチを取りました。マップされたネットワーク ドライブと特定の UNC 共有の両方を使用し、両方の状況で同じ結果になります。
私のコンストラクターには、ファイルが存在するかどうかを検出するためのロジックが含まれているため、この式で唯一関連する部分である必要があります。
public FileMonitor(String TargetPath)
: base()
{
if (String.IsNullOrEmpty(TargetPath))
{
throw new ArgumentNullException("Cannot instantiate FilesystemMonitor. TargetPath was not provided or is null.");
}
else
{
this.FileCache = new Dictionary<string, DateTime>();
if (Directory.Exists(TargetPath))
{
this.TargetDirectory = new DirectoryInfo(TargetPath);
return;
}
else if (File.Exists(TargetPath))
{
this.TargetFile = new FileInfo(TargetPath);
return;
}
else
{
if (TargetPath.StartsWith("\\\\"))
{
FileInfo Finfo = new FileInfo(TargetPath);
UNCHandler.connectToRemote(Finfo.DirectoryName, "administrator", "password");
if (Directory.Exists(TargetPath))
{
this.TargetDirectory = new DirectoryInfo(TargetPath);
return;
}
else if (File.Exists(TargetPath))
{
this.TargetFile = new FileInfo(TargetPath);
return;
}
else
{
throw new InvalidOperationException("Cannot instantiate FileMonitor for file that does not exist at " + TargetPath + ".");
}
}
else
{
throw new InvalidOperationException("Cannot instantiate FileMonitor for file that does not exist at " + TargetPath + ".");
}
}
}
}
私の最後のステートメントの唯一の例外は、私の UNCHandler クラスが何をするかを知る必要がある可能性があることです - しかし、その嵐を鎮めるために、それは答えからの正確な裂け目です
明確にするために、ここでの問題は、リモート システムへの接続を試みた後でも、File.Exists および Directory.Exists チェックが失敗することです。
私のエラーログには、次のものが返されます。「system|ReadConfiguration:Z: に存在しないファイルの FileMonitor をインスタンス化できません。」- これは事実上、上記のコンストラクターで生成する例外です。
「ソース」に到達するためにさまざまな方法を使用してみました。UNC共有とマップされたドライブの使用を含め、結果に違いはありません。
私は回答のアドバイスを受け、これをさらに調査するためにマイクロソフトのプロセス モニターを実行しましたが、この会場で役立つ情報をまだ見つけていません。私のプロセスでは、共有に到達しようとするまで数十の成功を取得します。その時点で唯一の指標となる結果は、CreateFile操作に対する「NAME NOT FOUND」と、「FILE LOCKED WITH ONLY READERS」の瞬間です。 CreateFileMapping の呼び出し。
プロセスはローカル システムの管理者アカウントとして実行されており、「ユーザー スペース」には、到達しようとしているのと同じ場所にマップされたドライブがあり、完全に操作できます。