ほとんどの部分で機能するファイルリポジトリサービスがあります。問題は、問題に遭遇したメソッドに DirectorySecurity を実装し始めたときです。ディレクトリは問題なく作成され、ディレクトリに割り当てられたアカウントにはアクセスが許可されますが、すべての権限は「特別な権限」の下に置かれます。しかし、それは問題ではありません。新しいファイルを書き込もうとすると問題が発生します。次のエラー メッセージが表示されます。
System.ServiceModel.FaultException'1 ... パスへのアクセス ... が拒否されました。
先ほど言ったように、ファイルを保存するためにディレクトリ構造が作成されます。ただし、ファイルはフォルダーに作成されません。許可されたすべてのユーザーが表示され、そこにファイルを配置できます。ただし、Windowsで手動で実行すると、AccessControlsで許可を拒否したにもかかわらず、ディレクトリから.exeファイルを実行できます。以下は、'Put' メソッドと、DirectorySecurity オブジェクトを作成するために使用する別のメソッドの例です。
私が持っている質問:
何がうまくいかないのか、または実行を防ぐためのセキュリティに関するアドバイスはありますか?
Visual Studio 2012 をデバッグ モードで実行する場合、特定の「アカウント」(例: NETWORK SERVICES) を使用する必要がありますか? 私はそれをアクセス許可セットに追加しませんでした。
ディレクトリを作成するときにタイミングの問題はありますか? もしそうなら、Thread.Sleep にヘルプをヒットして、Windows が追いつくことができるようにしますか?
私が見逃している、またはここで間違っていた他のアドバイス/ことはありますか?
環境に関する注意: Windows 7 Ultimate、Visual Studio 2012 (デバッグ開始による Windows フォーム テスト クライアントの実行)。サービスは現在、WAS (Services.msc で実行) を介してローカルにインストールされています。これは、ChannelFactory を使用して手動で構築されたクライアントとプロキシに公開されるエンドポイントを持つ net.Tcp サービスです。Get メソッドは正常に動作しているようです。put メソッドが最終的なファイルを作成されたディレクトリに配置できず、アクセス許可が実際に正しく機能していないことに懸念があります。
//----------------------------
//WCF Service - PutText Method
//----------------------------
//NOTE: dir = virtual directory
public bool PutTextFile(string dir, string fileName, string data)
{
string path;
string fExt;
DirectoryInfo d;
#region Null / value checks
//...
#endregion
//check & enforce file extension
fExt = Path.GetExtension(fileName).ToLower();
if (fExt != ".txt" && fExt != ".xml" && fExt != ".csv")
{
fileName = Path.GetFileNameWithoutExtension(fileName) + ".txt";
}
//check directory exists
d = new DirectoryInfo(Path.Combine(this._fileRepositoryRoot, dir));//_fileRepositoryRoot is taken from .config
if (!d.Exists)
{
try
{
DirectorySecurity ds = this.CreateDirSecurityObj(); //<-- See method below
d.Create(ds);
}
catch (Exception e)
{
//...
}
}
//complete path
path = Path.Combine(this._fileRepositoryRoot, dir, fileName);
try
{
using (StreamWriter sw = File.CreateText(path))
{
sw.Write(data);
}
return true;
}
catch (Exception e)
{
//...
}
}
//-------------------------
//Directory Security Method
//-------------------------
//NOTE:
//"private string _myDomain" and "private string _myUserAccount" are pulled from an app.config file
private DirectorySecurity CreateDirSecurityObj()
{
System.Security.AccessControl.DirectorySecurity ds = new System.Security.AccessControl.DirectorySecurity();
//define User rights
FileSystemRights grantUserRights = FileSystemRights.AppendData;
grantUserRights |= FileSystemRights.Synchronize;
grantUserRights |= FileSystemRights.CreateDirectories;
grantUserRights |= FileSystemRights.CreateFiles;
grantUserRights |= FileSystemRights.ListDirectory;
grantUserRights |= FileSystemRights.Read;
grantUserRights |= FileSystemRights.Write;
grantUserRights |= FileSystemRights.Delete;
FileSystemRights denyUserRights = FileSystemRights.ExecuteFile;
denyUserRights |= FileSystemRights.ChangePermissions;
//define access rule
FileSystemAccessRule grantRule_User = new FileSystemAccessRule(Path.Combine(this._myDomain, this._myUserAccount), grantUserRights, AccessControlType.Allow);
FileSystemAccessRule denyRule_User = new FileSystemAccessRule(Path.Combine(this._myDomain, this._myUserAccount), denyUserRights, AccessControlType.Deny);
//add access rule
ds.AddAccessRule(grantRule_User);
ds.AddAccessRule(denyRule_User);
ds.AddAccessRule(grantRule_Admin);
return ds;
}
更新:「NT AUTHORITY\NETWORK SERVICES」(制限付きアクセス)および「NT AUTHORITY\SYSTEM」(フルアクセス)のアクセス許可を追加しようとしました。私はまだ同じ拒否メッセージを受け取ります。DirectorySecurity プラクティスをオフにすると、正常に機能します。これは、「ミックス」またはルールに問題があるに違いありません。ディレクトリが配置されていても、繰り返しの試行は失敗します。